From b3cbbd3ea8e05e1cd75b12e70d28ca1decc505d4 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 26 Aug 2010 14:32:57 +0100 Subject: [PATCH 001/412] Initial attempt, including full cached metadata, json serialization, and custom fields in save paths. Custom fields in collections probably work, but they haven't been tested. --- src/calibre/devices/apple/driver.py | 7 +- src/calibre/devices/interface.py | 4 +- src/calibre/devices/kobo/books.py | 21 +- src/calibre/devices/usbms/books.py | 43 +-- src/calibre/devices/usbms/driver.py | 21 +- src/calibre/ebooks/metadata/__init__.py | 216 +------------ src/calibre/ebooks/metadata/book/__init__.py | 41 ++- src/calibre/ebooks/metadata/book/base.py | 296 +++++++++++++++--- .../ebooks/metadata/book/json_codec.py | 125 ++++++++ src/calibre/ebooks/metadata/isbndb.py | 6 +- src/calibre/ebooks/metadata/opf2.py | 9 +- .../gui2/dialogs/config/save_template.py | 29 +- src/calibre/gui2/library/models.py | 3 +- src/calibre/library/database2.py | 31 +- src/calibre/library/save_to_disk.py | 19 +- 15 files changed, 514 insertions(+), 357 deletions(-) create mode 100644 src/calibre/ebooks/metadata/book/json_codec.py diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index 916c88f203..75517e9df7 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -13,7 +13,8 @@ from calibre.devices.errors import UserFeedback from calibre.devices.usbms.deviceconfig import DeviceConfig from calibre.devices.interface import DevicePlugin from calibre.ebooks.BeautifulSoup import BeautifulSoup -from calibre.ebooks.metadata import MetaInformation, authors_to_string +from calibre.ebooks.metadata import authors_to_string +from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.epub import set_metadata from calibre.library.server.utils import strftime from calibre.utils.config import config_dir @@ -2998,14 +2999,14 @@ class BookList(list): ''' return {} -class Book(MetaInformation): +class Book(Metadata): ''' A simple class describing a book in the iTunes Books Library. - See ebooks.metadata.__init__ for all fields ''' def __init__(self,title,author): - MetaInformation.__init__(self, title, authors=[author]) + Metadata.__init__(self, title, authors=[author]) @dynamic_property def title_sorter(self): diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py index 1384fa03d9..7783173c9c 100644 --- a/src/calibre/devices/interface.py +++ b/src/calibre/devices/interface.py @@ -316,7 +316,7 @@ class DevicePlugin(Plugin): being uploaded to the device. :param names: A list of file names that the books should have once uploaded to the device. len(names) == len(files) - :param metadata: If not None, it is a list of :class:`MetaInformation` objects. + :param metadata: If not None, it is a list of :class:`Metadata` objects. The idea is to use the metadata to determine where on the device to put the book. len(metadata) == len(files). Apart from the regular cover (path to cover), there may also be a thumbnail attribute, which should @@ -335,7 +335,7 @@ class DevicePlugin(Plugin): the device. :param locations: Result of a call to L{upload_books} - :param metadata: List of :class:`MetaInformation` objects, same as for + :param metadata: List of :class:`Metadata` objects, same as for :meth:`upload_books`. :param booklists: A tuple containing the result of calls to (:meth:`books(oncard=None)`, diff --git a/src/calibre/devices/kobo/books.py b/src/calibre/devices/kobo/books.py index a5b2e98d2f..11ab42c29f 100644 --- a/src/calibre/devices/kobo/books.py +++ b/src/calibre/devices/kobo/books.py @@ -7,11 +7,11 @@ import os import re import time -from calibre.ebooks.metadata import MetaInformation +from calibre.ebooks.metadata.book.base import Metadata from calibre.constants import filesystem_encoding, preferred_encoding from calibre import isbytestring -class Book(MetaInformation): +class Book(Metadata): BOOK_ATTRS = ['lpath', 'size', 'mime', 'device_collections', '_new_book'] @@ -23,9 +23,9 @@ class Book(MetaInformation): 'uuid', ] - def __init__(self, prefix, lpath, title, authors, mime, date, ContentType, thumbnail_name, other=None): - - MetaInformation.__init__(self, '') + def __init__(self, prefix, lpath, title, authors, mime, date, ContentType, + thumbnail_name, other=None): + Metadata.__init__(self, '') self.device_collections = [] self._new_book = False @@ -34,7 +34,7 @@ class Book(MetaInformation): self.path = self.path.replace('/', '\\') self.lpath = lpath.replace('\\', '/') else: - self.lpath = lpath + self.lpath = lpath self.title = title if not authors: @@ -52,10 +52,9 @@ class Book(MetaInformation): else: self.datetime = time.gmtime(os.path.getctime(self.path)) except: - self.datetime = time.gmtime() - - if thumbnail_name is not None: - self.thumbnail = ImageWrapper(thumbnail_name) + self.datetime = time.gmtime() + if thumbnail_name is not None: + self.thumbnail = ImageWrapper(thumbnail_name) self.tags = [] if other: self.smart_update(other) @@ -90,7 +89,7 @@ class Book(MetaInformation): in C{other} takes precedence, unless the information in C{other} is NULL. ''' - MetaInformation.smart_update(self, other) + Metadata.smart_update(self, other) for attr in self.BOOK_ATTRS: if hasattr(other, attr): diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 959f26199c..e3c405ee4e 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -6,29 +6,18 @@ __docformat__ = 'restructuredtext en' import os, re, time, sys -from calibre.ebooks.metadata import MetaInformation +from calibre.ebooks.metadata.book.base import Metadata from calibre.devices.mime import mime_type_ext from calibre.devices.interface import BookList as _BookList from calibre.constants import filesystem_encoding, preferred_encoding from calibre import isbytestring from calibre.utils.config import prefs -class Book(MetaInformation): - - BOOK_ATTRS = ['lpath', 'size', 'mime', 'device_collections', '_new_book'] - - JSON_ATTRS = [ - 'lpath', 'title', 'authors', 'mime', 'size', 'tags', 'author_sort', - 'title_sort', 'comments', 'category', 'publisher', 'series', - 'series_index', 'rating', 'isbn', 'language', 'application_id', - 'book_producer', 'lccn', 'lcc', 'ddc', 'rights', 'publication_type', - 'uuid', - ] - +class Book(Metadata): def __init__(self, prefix, lpath, size=None, other=None): from calibre.ebooks.metadata.meta import path_to_ext - MetaInformation.__init__(self, '') + Metadata.__init__(self, '') self._new_book = False self.device_collections = [] @@ -72,32 +61,6 @@ class Book(MetaInformation): def thumbnail(self): return None - def smart_update(self, other, replace_metadata=False): - ''' - Merge the information in C{other} into self. In case of conflicts, the information - in C{other} takes precedence, unless the information in C{other} is NULL. - ''' - - MetaInformation.smart_update(self, other, replace_metadata) - - for attr in self.BOOK_ATTRS: - if hasattr(other, attr): - val = getattr(other, attr, None) - setattr(self, attr, val) - - def to_json(self): - json = {} - for attr in self.JSON_ATTRS: - val = getattr(self, attr) - if isbytestring(val): - enc = filesystem_encoding if attr == 'lpath' else preferred_encoding - val = val.decode(enc, 'replace') - elif isinstance(val, (list, tuple)): - val = [x.decode(preferred_encoding, 'replace') if - isbytestring(x) else x for x in val] - json[attr] = val - return json - class BookList(_BookList): def __init__(self, oncard, prefix, settings): diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index 0d28f06f49..a0d1d9dbf8 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -13,7 +13,6 @@ for a particular device. import os import re import time -import json from itertools import cycle from calibre import prints, isbytestring @@ -21,6 +20,7 @@ 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 +from calibre.ebooks.metadata.book.json_codec import JsonCodec BASE_TIME = None def debug_print(*args): @@ -288,6 +288,7 @@ class USBMS(CLI, Device): # at the end just before the return def sync_booklists(self, booklists, end_session=True): debug_print('USBMS: starting sync_booklists') + json_codec = JsonCodec() if not os.path.exists(self.normalize_path(self._main_prefix)): os.makedirs(self.normalize_path(self._main_prefix)) @@ -296,10 +297,8 @@ class USBMS(CLI, Device): if prefix is not None and isinstance(booklists[listid], self.booklist_class): if not os.path.exists(prefix): os.makedirs(self.normalize_path(prefix)) - js = [item.to_json() for item in booklists[listid] if - hasattr(item, 'to_json')] with open(self.normalize_path(os.path.join(prefix, self.METADATA_CACHE)), 'wb') as f: - f.write(json.dumps(js, indent=2, encoding='utf-8')) + json_codec.encode_to_file(f, booklists[listid]) write_prefix(self._main_prefix, 0) write_prefix(self._card_a_prefix, 1) write_prefix(self._card_b_prefix, 2) @@ -345,19 +344,13 @@ class USBMS(CLI, Device): @classmethod def parse_metadata_cache(cls, bl, prefix, name): - # bl = cls.booklist_class() - js = [] + json_codec = JsonCodec() need_sync = False cache_file = cls.normalize_path(os.path.join(prefix, name)) if os.access(cache_file, os.R_OK): try: with open(cache_file, 'rb') as f: - js = json.load(f, encoding='utf-8') - for item in js: - book = cls.book_class(prefix, item.get('lpath', None)) - for key in item.keys(): - setattr(book, key, item[key]) - bl.append(book) + json_codec.decode_from_file(f, bl, cls.book_class, prefix) except: import traceback traceback.print_exc() @@ -392,7 +385,7 @@ class USBMS(CLI, Device): @classmethod def book_from_path(cls, prefix, lpath): - from calibre.ebooks.metadata import MetaInformation + from calibre.ebooks.metadata.book.base import Metadata if cls.settings().read_metadata or cls.MUST_READ_METADATA: mi = cls.metadata_from_path(cls.normalize_path(os.path.join(prefix, lpath))) @@ -401,7 +394,7 @@ class USBMS(CLI, Device): mi = metadata_from_filename(cls.normalize_path(os.path.basename(lpath)), cls.build_template_regexp()) if mi is None: - mi = MetaInformation(os.path.splitext(os.path.basename(lpath))[0], + mi = Metadata(os.path.splitext(os.path.basename(lpath))[0], [_('Unknown')]) size = os.stat(cls.normalize_path(os.path.join(prefix, lpath))).st_size book = cls.book_class(prefix, lpath, other=mi, size=size) diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index d4a21e2c8c..fb894d3bbd 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -221,214 +221,18 @@ class ResourceCollection(object): -class MetaInformation(object): - '''Convenient encapsulation of book metadata''' - - @staticmethod - def copy(mi): - ans = MetaInformation(mi.title, mi.authors) - for attr in ('author_sort', 'title_sort', 'comments', 'category', - 'publisher', 'series', 'series_index', 'rating', - 'isbn', 'tags', 'cover_data', 'application_id', 'guide', - 'manifest', 'spine', 'toc', 'cover', 'language', - 'book_producer', 'timestamp', 'lccn', 'lcc', 'ddc', - 'author_sort_map', - 'pubdate', 'rights', 'publication_type', 'uuid'): - if hasattr(mi, attr): - setattr(ans, attr, getattr(mi, attr)) - - def __init__(self, title, authors=(_('Unknown'),)): - ''' +def MetaInformation(title, authors=(_('Unknown'),)): + ''' Convenient encapsulation of book metadata, needed for compatibility @param title: title or ``_('Unknown')`` or a MetaInformation object @param authors: List of strings or [] - ''' - mi = None - if hasattr(title, 'title') and hasattr(title, 'authors'): - mi = title - title = mi.title - authors = mi.authors - self.title = title - self.author = list(authors) if authors else []# Needed for backward compatibility - #: List of strings or [] - self.authors = list(authors) if authors else [] - self.tags = getattr(mi, 'tags', []) - #: mi.cover_data = (ext, data) - self.cover_data = getattr(mi, 'cover_data', (None, None)) - self.author_sort_map = getattr(mi, 'author_sort_map', {}) - - for x in ('author_sort', 'title_sort', 'comments', 'category', 'publisher', - 'series', 'series_index', 'rating', 'isbn', 'language', - 'application_id', 'manifest', 'toc', 'spine', 'guide', 'cover', - 'book_producer', 'timestamp', 'lccn', 'lcc', 'ddc', 'pubdate', - 'rights', 'publication_type', 'uuid', - ): - setattr(self, x, getattr(mi, x, None)) - - def print_all_attributes(self): - for x in ('title','author', 'author_sort', 'title_sort', 'comments', 'category', 'publisher', - 'series', 'series_index', 'tags', 'rating', 'isbn', 'language', - 'application_id', 'manifest', 'toc', 'spine', 'guide', 'cover', - 'book_producer', 'timestamp', 'lccn', 'lcc', 'ddc', 'pubdate', - 'rights', 'publication_type', 'uuid', 'author_sort_map' - ): - prints(x, getattr(self, x, 'None')) - - def smart_update(self, mi, replace_metadata=False): - ''' - Merge the information in C{mi} into self. In case of conflicts, the - information in C{mi} takes precedence, unless the information in mi is - NULL. If replace_metadata is True, then the information in mi always - takes precedence. - ''' - if mi.title and mi.title != _('Unknown'): - self.title = mi.title - - if mi.authors and mi.authors[0] != _('Unknown'): - self.authors = mi.authors - - for attr in ('author_sort', 'title_sort', 'category', - 'publisher', 'series', 'series_index', 'rating', - 'isbn', 'application_id', 'manifest', 'spine', 'toc', - 'cover', 'guide', 'book_producer', - 'timestamp', 'lccn', 'lcc', 'ddc', 'pubdate', 'rights', - 'publication_type', 'uuid'): - if replace_metadata: - setattr(self, attr, getattr(mi, attr, 1.0 if \ - attr == 'series_index' else None)) - elif hasattr(mi, attr): - val = getattr(mi, attr) - if val is not None: - setattr(self, attr, val) - - if replace_metadata: - self.tags = mi.tags - elif mi.tags: - self.tags += mi.tags - self.tags = list(set(self.tags)) - - if mi.author_sort_map: - self.author_sort_map.update(mi.author_sort_map) - - if getattr(mi, 'cover_data', False): - other_cover = mi.cover_data[-1] - self_cover = self.cover_data[-1] if self.cover_data else '' - if not self_cover: self_cover = '' - if not other_cover: other_cover = '' - if len(other_cover) > len(self_cover): - self.cover_data = mi.cover_data - - if replace_metadata: - self.comments = getattr(mi, 'comments', '') - else: - my_comments = getattr(self, 'comments', '') - other_comments = getattr(mi, 'comments', '') - if not my_comments: - my_comments = '' - if not other_comments: - other_comments = '' - if len(other_comments.strip()) > len(my_comments.strip()): - self.comments = other_comments - - other_lang = getattr(mi, 'language', None) - if other_lang and other_lang.lower() != 'und': - self.language = other_lang - - - def format_series_index(self): - try: - x = float(self.series_index) - except ValueError: - x = 1 - return fmt_sidx(x) - - def authors_from_string(self, raw): - self.authors = string_to_authors(raw) - - def format_authors(self): - return authors_to_string(self.authors) - - def format_tags(self): - return u', '.join([unicode(t) for t in self.tags]) - - def format_rating(self): - return unicode(self.rating) - - def __unicode__(self): - ans = [] - def fmt(x, y): - ans.append(u'%-20s: %s'%(unicode(x), unicode(y))) - - fmt('Title', self.title) - if self.title_sort: - fmt('Title sort', self.title_sort) - if self.authors: - fmt('Author(s)', authors_to_string(self.authors) + \ - ((' [' + self.author_sort + ']') if self.author_sort else '')) - if self.publisher: - fmt('Publisher', self.publisher) - if getattr(self, 'book_producer', False): - fmt('Book Producer', self.book_producer) - if self.category: - fmt('Category', self.category) - if self.comments: - fmt('Comments', self.comments) - if self.isbn: - fmt('ISBN', self.isbn) - if self.tags: - fmt('Tags', u', '.join([unicode(t) for t in self.tags])) - if self.series: - fmt('Series', self.series + ' #%s'%self.format_series_index()) - if self.language: - fmt('Language', self.language) - if self.rating is not None: - fmt('Rating', self.rating) - if self.timestamp is not None: - fmt('Timestamp', isoformat(self.timestamp)) - if self.pubdate is not None: - fmt('Published', isoformat(self.pubdate)) - if self.rights is not None: - fmt('Rights', unicode(self.rights)) - if self.lccn: - fmt('LCCN', unicode(self.lccn)) - if self.lcc: - fmt('LCC', unicode(self.lcc)) - if self.ddc: - fmt('DDC', unicode(self.ddc)) - - return u'\n'.join(ans) - - def to_html(self): - ans = [(_('Title'), unicode(self.title))] - ans += [(_('Author(s)'), (authors_to_string(self.authors) if self.authors else _('Unknown')))] - ans += [(_('Publisher'), unicode(self.publisher))] - ans += [(_('Producer'), unicode(self.book_producer))] - ans += [(_('Comments'), unicode(self.comments))] - ans += [('ISBN', unicode(self.isbn))] - if self.lccn: - ans += [('LCCN', unicode(self.lccn))] - if self.lcc: - ans += [('LCC', unicode(self.lcc))] - if self.ddc: - ans += [('DDC', unicode(self.ddc))] - ans += [(_('Tags'), u', '.join([unicode(t) for t in self.tags]))] - if self.series: - ans += [(_('Series'), unicode(self.series)+ ' #%s'%self.format_series_index())] - ans += [(_('Language'), unicode(self.language))] - if self.timestamp is not None: - ans += [(_('Timestamp'), unicode(self.timestamp.isoformat(' ')))] - if self.pubdate is not None: - ans += [(_('Published'), unicode(self.pubdate.isoformat(' ')))] - if self.rights is not None: - ans += [(_('Rights'), unicode(self.rights))] - for i, x in enumerate(ans): - ans[i] = u'%s%s'%x - return u'%s
'%u'\n'.join(ans) - - def __str__(self): - return self.__unicode__().encode('utf-8') - - def __nonzero__(self): - return bool(self.title or self.author or self.comments or self.tags) + ''' + from calibre.ebooks.metadata.book.base import Metadata + mi = None + if hasattr(title, 'title') and hasattr(title, 'authors'): + mi = title + title = mi.title + authors = mi.authors + return Metadata(title, authors, mi) def check_isbn10(isbn): try: diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index c3b95f1188..9de7ca1c6b 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -24,6 +24,8 @@ SOCIAL_METADATA_FIELDS = frozenset([ # For example: {'isbn':'123456789', 'doi':'xxxx', ... } 'classifiers', 'isbn', # Pseudo field for convenience, should get/set isbn classifier + # TODO: not sure what this is, but it is used by OPF + 'category', ]) @@ -69,7 +71,8 @@ BOOK_STRUCTURE_FIELDS = frozenset([ ]) USER_METADATA_FIELDS = frozenset([ - # A dict of a form to be specified + # A dict of dicts similar to field_metadata. Each field description dict + # also contains a value field with the key #value#. 'user_metadata', ]) @@ -86,16 +89,42 @@ DEVICE_METADATA_FIELDS = frozenset([ CALIBRE_METADATA_FIELDS = frozenset([ # An application id # Semantics to be defined. Is it a db key? a db name + key? A uuid? + # (It is currently set to the db_id.) 'application_id', + # the calibre primary key of the item. May want to remove this once Sony's no longer use it + 'db_id', ] ) +ALL_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( + PUBLICATION_METADATA_FIELDS).union( + BOOK_STRUCTURE_FIELDS).union( + USER_METADATA_FIELDS).union( + DEVICE_METADATA_FIELDS).union( + CALIBRE_METADATA_FIELDS) -SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( - USER_METADATA_FIELDS).union( - PUBLICATION_METADATA_FIELDS).union( - CALIBRE_METADATA_FIELDS).union( - frozenset(['lpath'])) # I don't think we need device_collections +# All fields except custom fields +STANDARD_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( + PUBLICATION_METADATA_FIELDS).union( + BOOK_STRUCTURE_FIELDS).union( + DEVICE_METADATA_FIELDS).union( + CALIBRE_METADATA_FIELDS) + +# Metadata fields that smart update should copy without special handling +COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( + PUBLICATION_METADATA_FIELDS).union( + BOOK_STRUCTURE_FIELDS).union( + DEVICE_METADATA_FIELDS).union( + CALIBRE_METADATA_FIELDS) - \ + frozenset(['title', 'authors', 'comments', 'cover_data']) + +SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( + USER_METADATA_FIELDS).union( + PUBLICATION_METADATA_FIELDS).union( + CALIBRE_METADATA_FIELDS).union( + DEVICE_METADATA_FIELDS) - \ + frozenset(['device_collections']) + # I don't think we need device_collections # Serialization of covers/thumbnails will have to be handled carefully, maybe # as an option to the serializer class diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 3fed47091f..697de8d890 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -6,8 +6,13 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' import copy +import traceback + +from calibre import prints +from calibre.ebooks.metadata.book import COPYABLE_METADATA_FIELDS +from calibre.ebooks.metadata.book import STANDARD_METADATA_FIELDS +from calibre.utils.date import isoformat -from calibre.ebooks.metadata.book import RESERVED_METADATA_FIELDS NULL_VALUES = { 'user_metadata': {}, @@ -24,98 +29,313 @@ NULL_VALUES = { class Metadata(object): ''' - This class must expose a superset of the API of MetaInformation in terms - of attribute access and methods. Only the __init__ method is different. - MetaInformation will simply become a function that creates and fills in - the attributes of this class. + A class representing all the metadata for a book. Please keep the method based API of this class to a minimum. Every method becomes a reserved field name. ''' - def __init__(self): + def __init__(self, title, authors=(_('Unknown'),), other=None): + ''' + @param title: title or ``_('Unknown')`` + @param authors: List of strings or [] + @param other: None or a metadata object + ''' object.__setattr__(self, '_data', copy.deepcopy(NULL_VALUES)) + if other is not None: + self.smart_update(other) + else: + if title: + self.title = title + if authors: + #: List of strings or [] + self.author = list(authors) if authors else []# Needed for backward compatibility + self.authors = list(authors) if authors else [] def __getattribute__(self, field): _data = object.__getattribute__(self, '_data') - if field in RESERVED_METADATA_FIELDS: + if field in STANDARD_METADATA_FIELDS: return _data.get(field, None) try: return object.__getattribute__(self, field) except AttributeError: pass if field in _data['user_metadata'].iterkeys(): - # TODO: getting user metadata values - pass + return _data['user_metadata'][field]['#value#'] raise AttributeError( 'Metadata object has no attribute named: '+ repr(field)) - def __setattr__(self, field, val): _data = object.__getattribute__(self, '_data') - if field in RESERVED_METADATA_FIELDS: - if field != 'user_metadata': - if not val: - val = NULL_VALUES[field] - _data[field] = val - else: - raise AttributeError('You cannot set user_metadata directly.') + if field in STANDARD_METADATA_FIELDS: + if not val: + val = NULL_VALUES.get(field, None) + _data[field] = val elif field in _data['user_metadata'].iterkeys(): - # TODO: Setting custom column values - pass + _data['user_metadata'][field]['#value#'] = val else: # You are allowed to stick arbitrary attributes onto this object as # long as they dont conflict with global or user metadata names # Don't abuse this privilege self.__dict__[field] = val + def get(self, field): + return self.__getattribute__(field) + + def set(self, field, val): + self.__setattr__(field, val) + @property - def user_metadata_names(self): + def user_metadata_keys(self): 'The set of user metadata names this object knows about' _data = object.__getattribute__(self, '_data') return frozenset(_data['user_metadata'].iterkeys()) - # Old MetaInformation API {{{ - def copy(self): - pass + @property + def all_user_metadata(self): + ''' + return a dict containing all the custom field metadata associated with + the book. Return a deep copy, just in case the user wants to change + values in the dict (json does). + ''' + _data = object.__getattribute__(self, '_data') + _data = _data['user_metadata'] + res = {} + for k in _data: + res[k] = copy.deepcopy(_data[k]) + return res + + def get_user_metadata(self, field): + ''' + return field metadata from the object if it is there. Otherwise return + None. field is the key name, not the label. Return a shallow copy, + just in case the user wants to change values in the dict (json does). + ''' + _data = object.__getattribute__(self, '_data') + _data = _data['user_metadata'] + if field in _data: + return copy.deepcopy(_data[field]) + return None + + def set_all_user_metadata(self, metadata): + ''' + store custom field metadata into the object. Field is the key name + not the label + ''' + if metadata is None: + traceback.print_stack() + else: + for key in metadata: + self.set_user_metadata(key, metadata[key]) + + def set_user_metadata(self, field, metadata): + ''' + store custom field metadata for one column into the object. Field is + the key name not the label + ''' + if field is not None: + if metadata is None: + traceback.print_stack() + metadata = copy.deepcopy(metadata) + if '#value#' not in metadata: + metadata['#value#'] = None + _data = object.__getattribute__(self, '_data') + _data['user_metadata'][field] = metadata + + @property + def all_attributes(self): + result = {} + _data = object.__getattribute__(self, '_data') + for attr in STANDARD_METADATA_FIELDS: + v = _data.get(attr, None) + if v is not None: + result[attr] = v + for attr in self.user_metadata_keys: + if self.get(attr) is not None: + result[attr] = self.get(attr) + return result + + # Old Metadata API {{{ + @staticmethod + def copy(mi): + ans = Metadata(mi.title, mi.authors) + for attr in STANDARD_METADATA_FIELDS: + if hasattr(mi, attr): + setattr(ans, attr, copy.deepcopy(getattr(mi, attr))) + for x in mi.user_metadata_keys: + meta = mi.get_user_metadata(x) + if meta is not None: + ans.set_user_metadata(x, meta) # get... did the deep copy def print_all_attributes(self): - pass + for x in STANDARD_METADATA_FIELDS: + prints('%s:'%x, getattr(self, x, 'None')) + for x in self.user_metadata_keys: + meta = self.get_user_metadata(x) + if meta is not None: + prints(x, meta) + prints('--------------') def smart_update(self, other, replace_metadata=False): - pass + ''' + Merge the information in C{other} into self. In case of conflicts, the information + in C{other} takes precedence, unless the information in other is NULL. + ''' + if other.title and other.title != _('Unknown'): + self.title = other.title + + if other.authors and other.authors[0] != _('Unknown'): + self.authors = other.authors + + for attr in COPYABLE_METADATA_FIELDS: + if replace_metadata: + setattr(self, attr, getattr(other, attr, 1.0 if \ + attr == 'series_index' else None)) + elif hasattr(other, attr): + val = getattr(other, attr) + if val is not None: + setattr(self, attr, copy.deepcopy(val)) + + if replace_metadata: + self.tags = other.tags + elif other.tags: + self.tags += other.tags + self.tags = list(set(self.tags)) + + if getattr(other, 'author_sort_map', None): + self.author_sort_map.update(other.author_sort_map) + + if getattr(other, 'cover_data', False): + other_cover = other.cover_data[-1] + self_cover = self.cover_data[-1] if self.cover_data else '' + if not self_cover: self_cover = '' + if not other_cover: other_cover = '' + if len(other_cover) > len(self_cover): + self.cover_data = other.cover_data + + if getattr(other, 'user_metadata_keys', None): + for x in other.user_metadata_keys: + meta = other.get_user_metadata(x) + if meta is not None or replace_metadata: + self.set_user_metadata(x, meta) # get... did the deepcopy + + if replace_metadata: + self.comments = getattr(other, 'comments', '') + else: + my_comments = getattr(self, 'comments', '') + other_comments = getattr(other, 'comments', '') + if not my_comments: + my_comments = '' + if not other_comments: + other_comments = '' + if len(other_comments.strip()) > len(my_comments.strip()): + self.comments = other_comments + + other_lang = getattr(other, 'language', None) + if other_lang and other_lang.lower() != 'und': + self.language = other_lang + def format_series_index(self): - pass + from calibre.ebooks.metadata import fmt_sidx + try: + x = float(self.series_index) + except ValueError: + x = 1 + return fmt_sidx(x) def authors_from_string(self, raw): - pass + from calibre.ebooks.metadata import string_to_authors + self.authors = string_to_authors(raw) def format_authors(self): - pass + from calibre.ebooks.metadata import authors_to_string + return authors_to_string(self.authors) def format_tags(self): - pass + return u', '.join([unicode(t) for t in self.tags]) def format_rating(self): return unicode(self.rating) def __unicode__(self): - pass + from calibre.ebooks.metadata import authors_to_string + ans = [] + def fmt(x, y): + ans.append(u'%-20s: %s'%(unicode(x), unicode(y))) + + fmt('Title', self.title) + if self.title_sort: + fmt('Title sort', self.title_sort) + if self.authors: + fmt('Author(s)', authors_to_string(self.authors) + \ + ((' [' + self.author_sort + ']') if self.author_sort else '')) + if self.publisher: + fmt('Publisher', self.publisher) + if getattr(self, 'book_producer', False): + fmt('Book Producer', self.book_producer) + if self.category: + fmt('Category', self.category) + if self.comments: + fmt('Comments', self.comments) + if self.isbn: + fmt('ISBN', self.isbn) + if self.tags: + fmt('Tags', u', '.join([unicode(t) for t in self.tags])) + if self.series: + fmt('Series', self.series + ' #%s'%self.format_series_index()) + if self.language: + fmt('Language', self.language) + if self.rating is not None: + fmt('Rating', self.rating) + if self.timestamp is not None: + fmt('Timestamp', isoformat(self.timestamp)) + if self.pubdate is not None: + fmt('Published', isoformat(self.pubdate)) + if self.rights is not None: + fmt('Rights', unicode(self.rights)) + if self.lccn: + fmt('LCCN', unicode(self.lccn)) + if self.lcc: + fmt('LCC', unicode(self.lcc)) + if self.ddc: + fmt('DDC', unicode(self.ddc)) + # CUSTFIELD: What to do about custom fields? + return u'\n'.join(ans) def to_html(self): - pass + from calibre.ebooks.metadata import authors_to_string + ans = [(_('Title'), unicode(self.title))] + ans += [(_('Author(s)'), (authors_to_string(self.authors) if self.authors else _('Unknown')))] + ans += [(_('Publisher'), unicode(self.publisher))] + ans += [(_('Producer'), unicode(self.book_producer))] + ans += [(_('Comments'), unicode(self.comments))] + ans += [('ISBN', unicode(self.isbn))] + if self.lccn: + ans += [('LCCN', unicode(self.lccn))] + if self.lcc: + ans += [('LCC', unicode(self.lcc))] + if self.ddc: + ans += [('DDC', unicode(self.ddc))] + ans += [(_('Tags'), u', '.join([unicode(t) for t in self.tags]))] + if self.series: + ans += [(_('Series'), unicode(self.series)+ ' #%s'%self.format_series_index())] + ans += [(_('Language'), unicode(self.language))] + if self.timestamp is not None: + ans += [(_('Timestamp'), unicode(self.timestamp.isoformat(' ')))] + if self.pubdate is not None: + ans += [(_('Published'), unicode(self.pubdate.isoformat(' ')))] + if self.rights is not None: + ans += [(_('Rights'), unicode(self.rights))] + for i, x in enumerate(ans): + ans[i] = u'%s%s'%x + # CUSTFIELD: What to do about custom fields + return u'%s
'%u'\n'.join(ans) def __str__(self): return self.__unicode__().encode('utf-8') def __nonzero__(self): - return True + return bool(self.title or self.author or self.comments or self.tags) # }}} - -# We don't need reserved field names for this object any more. Lets just use a -# protocol like the last char of a user field label should be _ when using this -# object -# So mi.tags returns the builtin tags and mi.tags_ returns the user tags - diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py new file mode 100644 index 0000000000..5e13650f0e --- /dev/null +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -0,0 +1,125 @@ +''' +Created on 4 Jun 2010 + +@author: charles +''' + +from base64 import b64encode, b64decode +import json +import traceback +from PIL import Image + +from . import SERIALIZABLE_FIELDS +from calibre.constants import filesystem_encoding, preferred_encoding +from calibre.library.field_metadata import FieldMetadata +from calibre.utils.date import parse_date, isoformat, UNDEFINED_DATE + +# Translate datetimes to and from strings. The string form is the datetime in +# UTC. The returned date is also UTC +def string_to_datetime(src): + if src == "None": + return None +# dt = strptime(src, '%d %m %Y %H:%M:%S', assume_utc=True, as_utc=True) +# if dt == UNDEFINED_DATE: +# return None + return parse_date(src) + +def datetime_to_string(dateval): + if dateval is None or dateval == UNDEFINED_DATE: + return "None" +# tt = date_to_utc(dateval).timetuple() +# res = "%02d %02d %04d %02d:%02d:%02d"%(tt.tm_mday, tt.tm_mon, tt.tm_year, +# tt.tm_hour, tt.tm_min, tt.tm_sec) + return isoformat(dateval) + +def encode_thumbnail(thumbnail): + ''' + Encode the image part of a thumbnail, then return the 3 part tuple + ''' + if thumbnail is None: + return None + return (thumbnail[0], thumbnail[1], b64encode(str(thumbnail[2]))) + +def decode_thumbnail(tup): + ''' + Decode an encoded thumbnail into its 3 component parts + ''' + if tup is None: + return None + return (tup[0], tup[1], b64decode(tup[2])) + +class JsonCodec(object): + + def __init__(self): + self.field_metadata = FieldMetadata() + + def encode_to_file(self, file, booklist): + json.dump(self.encode_booklist_metadata(booklist), file, indent=2, encoding='utf-8') + + def encode_booklist_metadata(self, booklist): + result = [] + for book in booklist: + result.append(self.encode_book_metadata(book)) + return result + + def encode_book_metadata(self, book): + result = {} + for key in SERIALIZABLE_FIELDS: + result[key] = self.encode_metadata_attr(book, key) + return result + + def encode_metadata_attr(self, book, key): + if key == 'user_metadata': + meta = book.all_user_metadata + for k in meta: + if meta[k]['datatype'] == 'datetime': + meta[k]['#value#'] = datetime_to_string(meta[k]['#value#']) + return meta + if key in self.field_metadata: + datatype = self.field_metadata[key]['datatype'] + else: + datatype = None + value = book.get(key) + if key == 'thumbnail': + return encode_thumbnail(value) + elif isinstance(value, str): # str includes bytes + enc = filesystem_encoding if key == 'lpath' else preferred_encoding + return value.decode(enc, 'replace') + elif isinstance(value, (list, tuple)): + return [x.decode(preferred_encoding, 'replace') if + isinstance(x, str) else x for x in value] + elif datatype == 'datetime': + return datetime_to_string(value) + else: + return value + + def decode_from_file(self, file, booklist, book_class, prefix): + js = [] + try: + js = json.load(file, encoding='utf-8') + for item in js: + book = book_class(prefix, item.get('lpath', None)) + for key in item.keys(): + meta = self.decode_metadata(key, item[key]) + if key == 'user_metadata': + book.set_all_user_metadata(meta) + else: + setattr(book, key, meta) + booklist.append(book) + except: + print 'exception during JSON decoding' + traceback.print_exc() + booklist = [] + + def decode_metadata(self, key, value): + if key == 'user_metadata': + for k in value: + if value[k]['datatype'] == 'datetime': + value[k]['#value#'] = string_to_datetime(value[k]['#value#']) + return value + elif key in self.field_metadata: + if self.field_metadata[key]['datatype'] == 'datetime': + return string_to_datetime(value) + if key == 'thumbnail': + return decode_thumbnail(value) + return value diff --git a/src/calibre/ebooks/metadata/isbndb.py b/src/calibre/ebooks/metadata/isbndb.py index 356cc3f1b1..b5fc5830c8 100644 --- a/src/calibre/ebooks/metadata/isbndb.py +++ b/src/calibre/ebooks/metadata/isbndb.py @@ -8,7 +8,7 @@ import sys, re from urllib import quote from calibre.utils.config import OptionParser -from calibre.ebooks.metadata import MetaInformation +from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup from calibre import browser @@ -42,10 +42,10 @@ def fetch_metadata(url, max=100, timeout=5.): return books -class ISBNDBMetadata(MetaInformation): +class ISBNDBMetadata(Metadata): def __init__(self, book): - MetaInformation.__init__(self, None, []) + Metadata.__init__(self, None, []) self.isbn = book.get('isbn13', book.get('isbn')) self.title = book.find('titlelong').string diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index f93b614ef2..0ab6d3bbc0 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -16,7 +16,8 @@ from lxml import etree from calibre.ebooks.chardet import xml_to_unicode from calibre.constants import __appname__, __version__, filesystem_encoding from calibre.ebooks.metadata.toc import TOC -from calibre.ebooks.metadata import MetaInformation, string_to_authors +from calibre.ebooks.metadata import string_to_authors +from calibre.ebooks.metadata.book.base import Metadata from calibre.utils.date import parse_date, isoformat from calibre.utils.localization import get_lang @@ -926,16 +927,16 @@ class OPF(object): setattr(self, attr, val) -class OPFCreator(MetaInformation): +class OPFCreator(Metadata): - def __init__(self, base_path, *args, **kwargs): + def __init__(self, base_path, other): ''' Initialize. @param base_path: An absolute path to the directory in which this OPF file will eventually be. This is used by the L{create_manifest} method to convert paths to files into relative paths. ''' - MetaInformation.__init__(self, *args, **kwargs) + Metadata.__init__(self, title='', other=other) self.base_path = os.path.abspath(base_path) if self.application_id is None: self.application_id = str(uuid.uuid4()) diff --git a/src/calibre/gui2/dialogs/config/save_template.py b/src/calibre/gui2/dialogs/config/save_template.py index 71eb15f4aa..2157d5b3bf 100644 --- a/src/calibre/gui2/dialogs/config/save_template.py +++ b/src/calibre/gui2/dialogs/config/save_template.py @@ -34,25 +34,24 @@ class SaveTemplate(QWidget, Ui_Form): self.option_name = name def validate(self): - tmpl = preprocess_template(self.opt_template.text()) - fa = {} - for x in FORMAT_ARG_DESCS.keys(): - fa[x]='random long string' - try: - tmpl.format(**fa) - except Exception, err: - error_dialog(self, _('Invalid template'), - '

'+_('The template %s is invalid:')%tmpl + \ - '
'+str(err), show=True) - return False + # TODO: I haven't figured out how to get the custom columns into here, + # so for the moment make all templates valid. return True +# tmpl = preprocess_template(self.opt_template.text()) +# fa = {} +# for x in FORMAT_ARG_DESCS.keys(): +# fa[x]='random long string' +# try: +# tmpl.format(**fa) +# except Exception, err: +# error_dialog(self, _('Invalid template'), +# '

'+_('The template %s is invalid:')%tmpl + \ +# '
'+str(err), show=True) +# return False +# return True def save_settings(self, config, name): val = unicode(self.opt_template.text()) config.set(name, val) self.opt_template.save_history(self.option_name+'_template_history') - - - - diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 89008735fe..fdf21ecc23 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -372,7 +372,6 @@ class BooksModel(QAbstractTableModel): # {{{ return ans def get_metadata(self, rows, rows_are_ids=False, full_metadata=False): - # Should this add the custom columns? It doesn't at the moment metadata, _full_metadata = [], [] if not rows_are_ids: rows = [self.db.id(row.row()) for row in rows] @@ -1053,7 +1052,7 @@ class DeviceBooksModel(BooksModel): # {{{ if hasattr(cdata, 'image_path'): img.load(cdata.image_path) else: - img.loadFromData(cdata) + img.loadFromData(cdata[2]) if img.isNull(): img = self.default_image data['cover'] = img diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index ef74188bdf..9f21fe0eda 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -509,15 +509,15 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): ''' Convenience method to return metadata as a L{MetaInformation} object. ''' - aum = self.authors(idx, index_is_id=index_is_id) - if aum: aum = [a.strip().replace('|', ',') for a in aum.split(',')] + aut_list = self.authors_with_sort_strings(idx, index_is_id=index_is_id) + aum = [] + aus = {} + for (author, author_sort) in aut_list: + aum.append(author) + aus[author] = author_sort mi = MetaInformation(self.title(idx, index_is_id=index_is_id), aum) mi.author_sort = self.author_sort(idx, index_is_id=index_is_id) - if mi.authors: - mi.author_sort_map = {} - for name, sort in zip(mi.authors, self.authors_sort_strings(idx, - index_is_id)): - mi.author_sort_map[name] = sort + mi.author_sort_map = aus mi.comments = self.comments(idx, index_is_id=index_is_id) mi.publisher = self.publisher(idx, index_is_id=index_is_id) mi.timestamp = self.timestamp(idx, index_is_id=index_is_id) @@ -534,6 +534,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.isbn = self.isbn(idx, index_is_id=index_is_id) id = idx if index_is_id else self.id(idx) mi.application_id = id + for key,meta in self.field_metadata.iteritems(): + if meta['is_custom']: + mi.set_user_metadata(key, meta) + mi.set(key, self.get_custom(idx, label=meta['label'], index_is_id=index_is_id)) if get_cover: mi.cover = self.cover(id, index_is_id=True, as_path=True) return mi @@ -1049,6 +1053,19 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): result.append(sort) return result + # Given a book, return the map of author sort strings for the book's authors + def authors_with_sort_strings(self, id, index_is_id=False): + id = id if index_is_id else self.id(id) + aut_strings = self.conn.get(''' + SELECT authors.name, authors.sort + FROM authors, books_authors_link as bl + WHERE bl.book=? and authors.id=bl.author + ORDER BY bl.id''', (id,)) + result = [] + for (author, sort,) in aut_strings: + result.append((author.replace('|', ','), sort)) + return result + # Given a book, return the author_sort string for authors of the book def author_sort_from_book(self, id, index_is_id=False): auts = self.authors_sort_strings(id, index_is_id) diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 15020855f7..258ea7ba9e 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -105,6 +105,8 @@ def safe_format(x, format_args): pass except AttributeError: # Thrown if user used a non existing attribute pass + except KeyError: # Thrown if user used custom field w/value None + pass return '' def get_components(template, mi, id, timefmt='%b %Y', length=250, @@ -113,13 +115,12 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, library_order = tweaks['save_template_title_series_sorting'] == 'library_order' tsfmt = title_sort if library_order else lambda x: x format_args = dict(**FORMAT_ARGS) + format_args.update(mi.all_attributes) if mi.title: format_args['title'] = tsfmt(mi.title) if mi.authors: format_args['authors'] = mi.format_authors() format_args['author'] = format_args['authors'] - if mi.author_sort: - format_args['author_sort'] = mi.author_sort if mi.tags: format_args['tags'] = mi.format_tags() if format_args['tags'].startswith('/'): @@ -132,15 +133,21 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, template = re.sub(r'\{series_index[^}]*?\}', '', template) if mi.rating is not None: format_args['rating'] = mi.format_rating() - if mi.isbn: - format_args['isbn'] = mi.isbn - if mi.publisher: - format_args['publisher'] = mi.publisher if hasattr(mi.timestamp, 'timetuple'): format_args['timestamp'] = strftime(timefmt, mi.timestamp.timetuple()) if hasattr(mi.pubdate, 'timetuple'): format_args['pubdate'] = strftime(timefmt, mi.pubdate.timetuple()) format_args['id'] = str(id) + + # These are not necessary any more. The values are set by + # 'format_args.update' above, and there is no special formatting +# if mi.author_sort: +# format_args['author_sort'] = mi.author_sort +# if mi.isbn: +# format_args['isbn'] = mi.isbn +# if mi.publisher: +# format_args['publisher'] = mi.publisher + components = [x.strip() for x in template.split('/') if x.strip()] components = [safe_format(x, format_args) for x in components] components = [sanitize_func(x) for x in components if x] From b04faf70c2378c3569a4d1cf010da3d57a707c42 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 27 Aug 2010 08:22:08 +0100 Subject: [PATCH 002/412] Make Kobo driver use new metadata framework --- src/calibre/devices/kobo/books.py | 80 ++---------------------------- src/calibre/devices/kobo/driver.py | 2 +- 2 files changed, 5 insertions(+), 77 deletions(-) diff --git a/src/calibre/devices/kobo/books.py b/src/calibre/devices/kobo/books.py index f0cf7c3763..1c3d05ea12 100644 --- a/src/calibre/devices/kobo/books.py +++ b/src/calibre/devices/kobo/books.py @@ -4,37 +4,15 @@ __copyright__ = '2010, Timothy Legge ' ''' import os -import re import time -from calibre.ebooks.metadata.book.base import Metadata -from calibre.constants import filesystem_encoding, preferred_encoding -from calibre import isbytestring +from calibre.devices.usbms.books import Book as Book_ -class Book(Metadata): - - BOOK_ATTRS = ['lpath', 'size', 'mime', 'device_collections', '_new_book'] - - JSON_ATTRS = [ - 'lpath', 'title', 'authors', 'mime', 'size', 'tags', 'author_sort', - 'title_sort', 'comments', 'category', 'publisher', 'series', - 'series_index', 'rating', 'isbn', 'language', 'application_id', - 'book_producer', 'lccn', 'lcc', 'ddc', 'rights', 'publication_type', - 'uuid', 'device_collections', - ] +class Book(Book_): def __init__(self, prefix, lpath, title, authors, mime, date, ContentType, thumbnail_name, other=None): - Metadata.__init__(self, '') - self.device_collections = [] - self._new_book = False - - self.path = os.path.join(prefix, lpath) - if os.sep == '\\': - self.path = self.path.replace('/', '\\') - self.lpath = lpath.replace('\\', '/') - else: - self.lpath = lpath + Book_.__init__(self, prefix, lpath) self.title = title if not authors: @@ -59,57 +37,7 @@ class Book(Metadata): if other: self.smart_update(other) - def __eq__(self, other): - return self.path == getattr(other, 'path', None) - - @dynamic_property - def db_id(self): - doc = '''The database id in the application database that this file corresponds to''' - def fget(self): - match = re.search(r'_(\d+)$', self.lpath.rpartition('.')[0]) - if match: - return int(match.group(1)) - return None - return property(fget=fget, doc=doc) - - @dynamic_property - def title_sorter(self): - doc = '''String to sort the title. If absent, title is returned''' - def fget(self): - return re.sub('^\s*A\s+|^\s*The\s+|^\s*An\s+', '', self.title).rstrip() - return property(doc=doc, fget=fget) - - @dynamic_property - def thumbnail(self): - return None - - def smart_update(self, other, replace_metadata=False): - ''' - Merge the information in C{other} into self. In case of conflicts, the information - in C{other} takes precedence, unless the information in C{other} is NULL. - ''' - - Metadata.smart_update(self, other) - - for attr in self.BOOK_ATTRS: - if hasattr(other, attr): - val = getattr(other, attr, None) - setattr(self, attr, val) - - def to_json(self): - json = {} - for attr in self.JSON_ATTRS: - val = getattr(self, attr) - if isbytestring(val): - enc = filesystem_encoding if attr == 'lpath' else preferred_encoding - val = val.decode(enc, 'replace') - elif isinstance(val, (list, tuple)): - val = [x.decode(preferred_encoding, 'replace') if - isbytestring(x) else x for x in val] - json[attr] = val - return json - class ImageWrapper(object): def __init__(self, image_path): - self.image_path = image_path + self.image_path = image_path diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 35fceb80f7..5f939a4498 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -132,7 +132,7 @@ class KOBO(USBMS): changed = False for i, row in enumerate(cursor): - # self.report_progress((i+1) / float(numrows), _('Getting list of books on device...')) + # self.report_progress((i+1) / float(numrows), _('Getting list of books on device...')) path = self.path_from_contentid(row[3], row[5], oncard) mime = mime_type_ext(path_to_ext(row[3])) From 47fedcee36db9d7f9f5ab39460a6eafcbe21df20 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 27 Aug 2010 10:26:36 +0100 Subject: [PATCH 003/412] Bug fixes: 1) Only reset to initial values when None is assigned. Using 'if not var' is true for empty lists 2) Take unused values out of the to_html and unicode functions 3) add 'language' as a valid metadata field --- src/calibre/ebooks/metadata/book/__init__.py | 68 +++++++------------- src/calibre/ebooks/metadata/book/base.py | 31 +++++---- 2 files changed, 42 insertions(+), 57 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index 9de7ca1c6b..b1a322b143 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -11,50 +11,39 @@ an empty list/dictionary for complex types and (None, None) for cover_data ''' SOCIAL_METADATA_FIELDS = frozenset([ - 'tags', # Ordered list - # A floating point number between 0 and 10 - 'rating', - # A simple HTML enabled string - 'comments', - # A simple string - 'series', - # A floating point number - 'series_index', + 'tags', # Ordered list + 'rating', # A floating point number between 0 and 10 + 'comments', # A simple HTML enabled string + 'series', # A simple string + 'series_index', # A floating point number # Of the form { scheme1:value1, scheme2:value2} # For example: {'isbn':'123456789', 'doi':'xxxx', ... } 'classifiers', - 'isbn', # Pseudo field for convenience, should get/set isbn classifier - # TODO: not sure what this is, but it is used by OPF - 'category', - + 'isbn', # Pseudo field for convenience, should get/set isbn classifier + 'category', # TODO: not sure what this is, but it is used by OPF ]) PUBLICATION_METADATA_FIELDS = frozenset([ - # title must never be None. Should be _('Unknown') - 'title', + 'title', # title must never be None. Should be _('Unknown') # Pseudo field that can be set, but if not set is auto generated # from title and languages 'title_sort', - # Ordered list of authors. Must never be None, can be [_('Unknown')] - 'authors', - # Map of sort strings for each author - 'author_sort_map', + 'authors', # Ordered list. Must never be None, can be [_('Unknown')] + 'author_sort_map', # Map of sort strings for each author # Pseudo field that can be set, but if not set is auto generated # from authors and languages 'author_sort', 'book_producer', - # Dates and times must be timezone aware - 'timestamp', + 'timestamp', # Dates and times must be timezone aware 'pubdate', 'rights', # So far only known publication type is periodical:calibre # If None, means book 'publication_type', - # A UUID usually of type 4 - 'uuid', - 'languages', # ordered list - # Simple string, no special semantics - 'publisher', + 'uuid', # A UUID usually of type 4 + 'language', # the primary language of this book + 'languages', # ordered list + 'publisher', # Simple string, no special semantics # Absolute path to image file encoded in filesystem_encoding 'cover', # Of the form (format, data) where format is, for e.g. 'jpeg', 'png', 'gif'... @@ -77,22 +66,18 @@ USER_METADATA_FIELDS = frozenset([ ]) DEVICE_METADATA_FIELDS = frozenset([ - # Ordered list of strings - 'device_collections', - 'lpath', # Unicode, / separated - # In bytes - 'size', - # Mimetype of the book file being represented - 'mime', + 'device_collections', # Ordered list of strings + 'lpath', # Unicode, / separated + 'size', # In bytes + 'mime', # Mimetype of the book file being represented + ]) CALIBRE_METADATA_FIELDS = frozenset([ - # An application id - # Semantics to be defined. Is it a db key? a db name + key? A uuid? - # (It is currently set to the db_id.) - 'application_id', - # the calibre primary key of the item. May want to remove this once Sony's no longer use it - 'db_id', + 'application_id', # An application id, currently set to the db_id. + # the calibre primary key of the item. + 'db_id', # the calibre primary key of the item. + # TODO: May want to remove once Sony's no longer use it ] ) @@ -124,7 +109,4 @@ SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( CALIBRE_METADATA_FIELDS).union( DEVICE_METADATA_FIELDS) - \ frozenset(['device_collections']) - # I don't think we need device_collections - -# Serialization of covers/thumbnails will have to be handled carefully, maybe -# as an option to the serializer class + # device_collections is rebuilt when needed diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 697de8d890..e352aecbf8 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -24,6 +24,7 @@ NULL_VALUES = { 'author_sort_map': {}, 'authors' : [_('Unknown')], 'title' : _('Unknown'), + 'language' : 'und' } class Metadata(object): @@ -68,14 +69,14 @@ class Metadata(object): def __setattr__(self, field, val): _data = object.__getattribute__(self, '_data') if field in STANDARD_METADATA_FIELDS: - if not val: + if val is None: val = NULL_VALUES.get(field, None) _data[field] = val elif field in _data['user_metadata'].iterkeys(): _data['user_metadata'][field]['#value#'] = val else: # You are allowed to stick arbitrary attributes onto this object as - # long as they dont conflict with global or user metadata names + # long as they don't conflict with global or user metadata names # Don't abuse this privilege self.__dict__[field] = val @@ -294,12 +295,13 @@ class Metadata(object): fmt('Published', isoformat(self.pubdate)) if self.rights is not None: fmt('Rights', unicode(self.rights)) - if self.lccn: - fmt('LCCN', unicode(self.lccn)) - if self.lcc: - fmt('LCC', unicode(self.lcc)) - if self.ddc: - fmt('DDC', unicode(self.ddc)) +# TODO: These are not in metadata. Should they be? +# if self.lccn: +# fmt('LCCN', unicode(self.lccn)) +# if self.lcc: +# fmt('LCC', unicode(self.lcc)) +# if self.ddc: +# fmt('DDC', unicode(self.ddc)) # CUSTFIELD: What to do about custom fields? return u'\n'.join(ans) @@ -311,12 +313,13 @@ class Metadata(object): ans += [(_('Producer'), unicode(self.book_producer))] ans += [(_('Comments'), unicode(self.comments))] ans += [('ISBN', unicode(self.isbn))] - if self.lccn: - ans += [('LCCN', unicode(self.lccn))] - if self.lcc: - ans += [('LCC', unicode(self.lcc))] - if self.ddc: - ans += [('DDC', unicode(self.ddc))] +# TODO: These are not in metadata. Should they be? +# if self.lccn: +# ans += [('LCCN', unicode(self.lccn))] +# if self.lcc: +# ans += [('LCC', unicode(self.lcc))] +# if self.ddc: +# ans += [('DDC', unicode(self.ddc))] ans += [(_('Tags'), u', '.join([unicode(t) for t in self.tags]))] if self.series: ans += [(_('Series'), unicode(self.series)+ ' #%s'%self.format_series_index())] From b4b0cb483df4a647de50145abf88a7b26ecd79c9 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 28 Aug 2010 13:34:49 +0100 Subject: [PATCH 004/412] Changes to respond to Kovid's mail, and some cleanups. --- src/calibre/ebooks/metadata/book/__init__.py | 4 +- src/calibre/ebooks/metadata/book/base.py | 132 +++++++++++------- .../ebooks/metadata/book/json_codec.py | 2 +- src/calibre/library/database2.py | 15 +- src/calibre/library/save_to_disk.py | 13 +- 5 files changed, 100 insertions(+), 66 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index b1a322b143..fbcca79aba 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -101,7 +101,9 @@ COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( BOOK_STRUCTURE_FIELDS).union( DEVICE_METADATA_FIELDS).union( CALIBRE_METADATA_FIELDS) - \ - frozenset(['title', 'authors', 'comments', 'cover_data']) + frozenset(['title', 'title_sort', 'authors', + 'author_sort', 'author_sort_map' 'comments', + 'cover_data', 'tags', 'language']) SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( USER_METADATA_FIELDS).union( diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index e352aecbf8..a81ce46c34 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -66,7 +66,7 @@ class Metadata(object): raise AttributeError( 'Metadata object has no attribute named: '+ repr(field)) - def __setattr__(self, field, val): + def __setattr__(self, field, val, extra=None): _data = object.__getattribute__(self, '_data') if field in STANDARD_METADATA_FIELDS: if val is None: @@ -74,17 +74,23 @@ class Metadata(object): _data[field] = val elif field in _data['user_metadata'].iterkeys(): _data['user_metadata'][field]['#value#'] = val + _data['user_metadata'][field]['#extra#'] = extra else: # You are allowed to stick arbitrary attributes onto this object as # long as they don't conflict with global or user metadata names # Don't abuse this privilege self.__dict__[field] = val - def get(self, field): + def get(self, field, default=None): + if default is not None: + try: + return self.__getattribute__(field) + except AttributeError: + return default return self.__getattribute__(field) - def set(self, field, val): - self.__setattr__(field, val) + def set(self, field, val, extra=None): + self.__setattr__(field, val, extra) @property def user_metadata_keys(self): @@ -92,25 +98,25 @@ class Metadata(object): _data = object.__getattribute__(self, '_data') return frozenset(_data['user_metadata'].iterkeys()) - @property - def all_user_metadata(self): + def get_all_user_metadata(self, make_copy): ''' return a dict containing all the custom field metadata associated with - the book. Return a deep copy, just in case the user wants to change - values in the dict (json does). + the book. ''' _data = object.__getattribute__(self, '_data') - _data = _data['user_metadata'] + user_metadata = _data['user_metadata'] + if not make_copy: + return user_metadata res = {} - for k in _data: - res[k] = copy.deepcopy(_data[k]) + for k in user_metadata: + res[k] = copy.deepcopy(user_metadata[k]) return res def get_user_metadata(self, field): ''' return field metadata from the object if it is there. Otherwise return - None. field is the key name, not the label. Return a shallow copy, - just in case the user wants to change values in the dict (json does). + None. field is the key name, not the label. Return a copy, just in case + the user wants to change values in the dict (json does). ''' _data = object.__getattribute__(self, '_data') _data = _data['user_metadata'] @@ -118,6 +124,14 @@ class Metadata(object): return copy.deepcopy(_data[field]) return None + @classmethod + def get_user_metadata_value(user_mi): + return user_mi['#value#'] + + @classmethod + def get_user_metadata_extra(user_mi): + return user_mi['#extra#'] + def set_all_user_metadata(self, metadata): ''' store custom field metadata into the object. Field is the key name @@ -139,21 +153,30 @@ class Metadata(object): traceback.print_stack() metadata = copy.deepcopy(metadata) if '#value#' not in metadata: - metadata['#value#'] = None + if metadata['datatype'] == 'text' and metadata['is_multiple']: + metadata['#value#'] = [] + else: + metadata['#value#'] = None _data = object.__getattribute__(self, '_data') _data['user_metadata'][field] = metadata - @property - def all_attributes(self): + def get_all_non_none_attributes(self): + ''' + Return a dictionary containing all non-None metadata fields, including + the custom ones. + ''' result = {} _data = object.__getattribute__(self, '_data') for attr in STANDARD_METADATA_FIELDS: v = _data.get(attr, None) if v is not None: result[attr] = v - for attr in self.user_metadata_keys: - if self.get(attr) is not None: - result[attr] = self.get(attr) + for attr in _data['user_metadata'].iterkeys(): + v = _data['user_metadata'][attr]['#value#'] + if v is not None: + result[attr] = v + if _data['user_metadata'][attr]['datatype'] == 'series': + result[attr+'_index'] = _data['user_metadata'][attr]['#extra#'] return result # Old Metadata API {{{ @@ -184,45 +207,49 @@ class Metadata(object): ''' if other.title and other.title != _('Unknown'): self.title = other.title + if hasattr(other, 'title_sort'): + self.title_sort = other.title_sort if other.authors and other.authors[0] != _('Unknown'): self.authors = other.authors + if hasattr(other, 'author_sort_map'): + self.author_sort_map = other.author_sort_map + if hasattr(other, 'author_sort'): + self.author_sort = other.author_sort - for attr in COPYABLE_METADATA_FIELDS: - if replace_metadata: + if replace_metadata: + for attr in COPYABLE_METADATA_FIELDS: setattr(self, attr, getattr(other, attr, 1.0 if \ attr == 'series_index' else None)) - elif hasattr(other, attr): - val = getattr(other, attr) - if val is not None: - setattr(self, attr, copy.deepcopy(val)) - - if replace_metadata: self.tags = other.tags - elif other.tags: - self.tags += other.tags - self.tags = list(set(self.tags)) - - if getattr(other, 'author_sort_map', None): - self.author_sort_map.update(other.author_sort_map) - - if getattr(other, 'cover_data', False): - other_cover = other.cover_data[-1] - self_cover = self.cover_data[-1] if self.cover_data else '' - if not self_cover: self_cover = '' - if not other_cover: other_cover = '' - if len(other_cover) > len(self_cover): - self.cover_data = other.cover_data - - if getattr(other, 'user_metadata_keys', None): - for x in other.user_metadata_keys: - meta = other.get_user_metadata(x) - if meta is not None or replace_metadata: - self.set_user_metadata(x, meta) # get... did the deepcopy - - if replace_metadata: + self.cover_data = getattr(other, 'cover_data', '') + self.set_all_user_metadata(other.get_all_user_metadata(make_copy=True)) self.comments = getattr(other, 'comments', '') + self.language = getattr(other, 'language', None) else: + for attr in COPYABLE_METADATA_FIELDS: + if hasattr(other, attr): + val = getattr(other, attr) + if val is not None: + setattr(self, attr, copy.deepcopy(val)) + + if other.tags: + self.tags += list(set(self.tags + other.tags)) + + if getattr(other, 'cover_data', False): + other_cover = other.cover_data[-1] + self_cover = self.cover_data[-1] if self.cover_data else '' + if not self_cover: self_cover = '' + if not other_cover: other_cover = '' + if len(other_cover) > len(self_cover): + self.cover_data = other.cover_data + + if getattr(other, 'user_metadata_keys', None): + for x in other.user_metadata_keys: + meta = other.get_user_metadata(x) + if meta is not None: + self.set_user_metadata(x, meta) # get... did the deepcopy + my_comments = getattr(self, 'comments', '') other_comments = getattr(other, 'comments', '') if not my_comments: @@ -232,10 +259,9 @@ class Metadata(object): if len(other_comments.strip()) > len(my_comments.strip()): self.comments = other_comments - other_lang = getattr(other, 'language', None) - if other_lang and other_lang.lower() != 'und': - self.language = other_lang - + other_lang = getattr(other, 'language', None) + if other_lang and other_lang.lower() != 'und': + self.language = other_lang def format_series_index(self): from calibre.ebooks.metadata import fmt_sidx diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index 5e13650f0e..7a80e16854 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -70,7 +70,7 @@ class JsonCodec(object): def encode_metadata_attr(self, book, key): if key == 'user_metadata': - meta = book.all_user_metadata + meta = book.get_all_user_metadata(make_copy=True) for k in meta: if meta[k]['datatype'] == 'datetime': meta[k]['#value#'] = datetime_to_string(meta[k]['#value#']) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 9f21fe0eda..935776f838 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -22,6 +22,7 @@ from calibre.library.sqlite import connect, IntegrityError, DBThread from calibre.library.prefs import DBPrefs from calibre.ebooks.metadata import string_to_authors, authors_to_string, \ MetaInformation +from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.meta import get_metadata, metadata_from_formats from calibre.constants import preferred_encoding, iswindows, isosx, filesystem_encoding from calibre.ptempfile import PersistentTemporaryFile @@ -537,7 +538,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): for key,meta in self.field_metadata.iteritems(): if meta['is_custom']: mi.set_user_metadata(key, meta) - mi.set(key, self.get_custom(idx, label=meta['label'], index_is_id=index_is_id)) + mi.set(key, val=self.get_custom(idx, label=meta['label'], + index_is_id=index_is_id), + extra=self.get_custom_extra(idx, label=meta['label'], + index_is_id=index_is_id)) if get_cover: mi.cover = self.cover(id, index_is_id=True, as_path=True) return mi @@ -1038,6 +1042,15 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if getattr(mi, 'timestamp', None) is not None: doit(self.set_timestamp, id, mi.timestamp, notify=False) self.set_path(id, True) + + user_mi = mi.get_all_user_metadata(make_copy=False) + for key in user_mi.iterkeys(): + if key in self.field_metadata and \ + user_mi[key]['datatype'] == self.field_metadata[key]['datatype']: + doit(self.set_custom, id, + val=Metadata.get_user_metadata_value(user_mi[key]), + extra=Metadata.get_user_metadata_extra(user_mi[key]), + label=user_mi[key]['label']) self.notify('metadata', [id]) # Given a book, return the list of author sort strings for the book's authors diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 258ea7ba9e..7a3515305b 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -115,7 +115,7 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, library_order = tweaks['save_template_title_series_sorting'] == 'library_order' tsfmt = title_sort if library_order else lambda x: x format_args = dict(**FORMAT_ARGS) - format_args.update(mi.all_attributes) + format_args.update(mi.get_all_non_none_attributes()) if mi.title: format_args['title'] = tsfmt(mi.title) if mi.authors: @@ -131,6 +131,8 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, format_args['series_index'] = mi.format_series_index() else: template = re.sub(r'\{series_index[^}]*?\}', '', template) + ## TODO: format custom values. Check all the datatypes. + if mi.rating is not None: format_args['rating'] = mi.format_rating() if hasattr(mi.timestamp, 'timetuple'): @@ -139,15 +141,6 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, format_args['pubdate'] = strftime(timefmt, mi.pubdate.timetuple()) format_args['id'] = str(id) - # These are not necessary any more. The values are set by - # 'format_args.update' above, and there is no special formatting -# if mi.author_sort: -# format_args['author_sort'] = mi.author_sort -# if mi.isbn: -# format_args['isbn'] = mi.isbn -# if mi.publisher: -# format_args['publisher'] = mi.publisher - components = [x.strip() for x in template.split('/') if x.strip()] components = [safe_format(x, format_args) for x in components] components = [sanitize_func(x) for x in components if x] From 65f8767057afa440c143353c52e038a092da6783 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 29 Aug 2010 11:18:09 +0100 Subject: [PATCH 005/412] New metadata: 1) remove 'category' from standard metadata fields 2) make isbn a classifier. Add ability to add more classifiers 3) fixup TODO: to make them easier to find. --- src/calibre/devices/usbms/books.py | 1 + src/calibre/ebooks/metadata/book/__init__.py | 12 ++++++--- src/calibre/ebooks/metadata/book/base.py | 25 ++++++------------- src/calibre/ebooks/metadata/opf2.py | 2 +- .../gui2/dialogs/config/save_template.py | 4 +-- src/calibre/library/save_to_disk.py | 2 +- 6 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index e3c405ee4e..0efa507e09 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -135,6 +135,7 @@ class CollectionsBookList(BookList): elif isinstance(val, unicode): val = [val] for category in val: + # TODO: NEWMETA: format the custom fields if attr == 'tags' and len(category) > 1 and \ category[0] == '[' and category[-1] == ']': continue diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index fbcca79aba..47eb616394 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -19,8 +19,14 @@ SOCIAL_METADATA_FIELDS = frozenset([ # Of the form { scheme1:value1, scheme2:value2} # For example: {'isbn':'123456789', 'doi':'xxxx', ... } 'classifiers', - 'isbn', # Pseudo field for convenience, should get/set isbn classifier - 'category', # TODO: not sure what this is, but it is used by OPF +]) + +''' +The list of names that convert to classifiers when in get and set. +''' + +TOP_LEVEL_CLASSIFIERS = frozenset([ + 'isbn', ]) PUBLICATION_METADATA_FIELDS = frozenset([ @@ -77,7 +83,7 @@ CALIBRE_METADATA_FIELDS = frozenset([ 'application_id', # An application id, currently set to the db_id. # the calibre primary key of the item. 'db_id', # the calibre primary key of the item. - # TODO: May want to remove once Sony's no longer use it + # TODO: NEWMETA: May want to remove once Sony's no longer use it ] ) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index a81ce46c34..6d89049bfb 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -11,6 +11,7 @@ import traceback from calibre import prints from calibre.ebooks.metadata.book import COPYABLE_METADATA_FIELDS from calibre.ebooks.metadata.book import STANDARD_METADATA_FIELDS +from calibre.ebooks.metadata.book import TOP_LEVEL_CLASSIFIERS from calibre.utils.date import isoformat @@ -55,6 +56,8 @@ class Metadata(object): def __getattribute__(self, field): _data = object.__getattribute__(self, '_data') + if field in TOP_LEVEL_CLASSIFIERS: + return _data.get('classifiers').get(field, None) if field in STANDARD_METADATA_FIELDS: return _data.get(field, None) try: @@ -68,7 +71,9 @@ class Metadata(object): def __setattr__(self, field, val, extra=None): _data = object.__getattribute__(self, '_data') - if field in STANDARD_METADATA_FIELDS: + if field in TOP_LEVEL_CLASSIFIERS: + _data['classifiers'].update({field: val}) + elif field in STANDARD_METADATA_FIELDS: if val is None: val = NULL_VALUES.get(field, None) _data[field] = val @@ -301,8 +306,6 @@ class Metadata(object): fmt('Publisher', self.publisher) if getattr(self, 'book_producer', False): fmt('Book Producer', self.book_producer) - if self.category: - fmt('Category', self.category) if self.comments: fmt('Comments', self.comments) if self.isbn: @@ -321,14 +324,7 @@ class Metadata(object): fmt('Published', isoformat(self.pubdate)) if self.rights is not None: fmt('Rights', unicode(self.rights)) -# TODO: These are not in metadata. Should they be? -# if self.lccn: -# fmt('LCCN', unicode(self.lccn)) -# if self.lcc: -# fmt('LCC', unicode(self.lcc)) -# if self.ddc: -# fmt('DDC', unicode(self.ddc)) - # CUSTFIELD: What to do about custom fields? + # TODO: NEWMETA: What to do about custom fields? return u'\n'.join(ans) def to_html(self): @@ -339,13 +335,6 @@ class Metadata(object): ans += [(_('Producer'), unicode(self.book_producer))] ans += [(_('Comments'), unicode(self.comments))] ans += [('ISBN', unicode(self.isbn))] -# TODO: These are not in metadata. Should they be? -# if self.lccn: -# ans += [('LCCN', unicode(self.lccn))] -# if self.lcc: -# ans += [('LCC', unicode(self.lcc))] -# if self.ddc: -# ans += [('DDC', unicode(self.ddc))] ans += [(_('Tags'), u', '.join([unicode(t) for t in self.tags]))] if self.series: ans += [(_('Series'), unicode(self.series)+ ' #%s'%self.format_series_index())] diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 0ab6d3bbc0..54d97fc157 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -1188,7 +1188,7 @@ def metadata_to_opf(mi, as_string=True): factory(DC('contributor'), mi.book_producer, __appname__, 'bkp') if hasattr(mi.pubdate, 'isoformat'): factory(DC('date'), isoformat(mi.pubdate)) - if mi.category: + if hasattr(mi, 'category') and mi.category: factory(DC('type'), mi.category) if mi.comments: factory(DC('description'), mi.comments) diff --git a/src/calibre/gui2/dialogs/config/save_template.py b/src/calibre/gui2/dialogs/config/save_template.py index 2157d5b3bf..7e49e86d29 100644 --- a/src/calibre/gui2/dialogs/config/save_template.py +++ b/src/calibre/gui2/dialogs/config/save_template.py @@ -34,8 +34,8 @@ class SaveTemplate(QWidget, Ui_Form): self.option_name = name def validate(self): - # TODO: I haven't figured out how to get the custom columns into here, - # so for the moment make all templates valid. + # TODO: NEWMETA: I haven't figured out how to get the custom columns + # into here, so for the moment make all templates valid. return True # tmpl = preprocess_template(self.opt_template.text()) # fa = {} diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 7a3515305b..963afd4085 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -131,7 +131,7 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, format_args['series_index'] = mi.format_series_index() else: template = re.sub(r'\{series_index[^}]*?\}', '', template) - ## TODO: format custom values. Check all the datatypes. + ## TODO: NEWMETA: format custom values. Check all the datatypes. if mi.rating is not None: format_args['rating'] = mi.format_rating() From 6eb7383e82b564a146cd9e719d6424ec8f79c355 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 30 Aug 2010 12:16:37 +0100 Subject: [PATCH 006/412] Remove unused (and unworking) copy method --- src/calibre/ebooks/metadata/book/base.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 6d89049bfb..dcb31c3ecc 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -185,17 +185,6 @@ class Metadata(object): return result # Old Metadata API {{{ - @staticmethod - def copy(mi): - ans = Metadata(mi.title, mi.authors) - for attr in STANDARD_METADATA_FIELDS: - if hasattr(mi, attr): - setattr(ans, attr, copy.deepcopy(getattr(mi, attr))) - for x in mi.user_metadata_keys: - meta = mi.get_user_metadata(x) - if meta is not None: - ans.set_user_metadata(x, meta) # get... did the deep copy - def print_all_attributes(self): for x in STANDARD_METADATA_FIELDS: prints('%s:'%x, getattr(self, x, 'None')) @@ -347,7 +336,7 @@ class Metadata(object): ans += [(_('Rights'), unicode(self.rights))] for i, x in enumerate(ans): ans[i] = u'%s%s'%x - # CUSTFIELD: What to do about custom fields + # TODO: NEWMETA: What to do about custom fields return u'%s
'%u'\n'.join(ans) def __str__(self): From 11f7bd06a82a0b1d03afffd374344593dfb0c5dc Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 30 Aug 2010 17:47:25 +0100 Subject: [PATCH 007/412] Format custom fields in save_to_disk. --- src/calibre/library/save_to_disk.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 963afd4085..2bc71cde9c 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -14,6 +14,7 @@ from calibre.utils.filenames import shorten_components_to, supports_long_names, from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.ebooks.metadata.meta import set_metadata from calibre.constants import preferred_encoding, filesystem_encoding +from calibre.ebooks.metadata import fmt_sidx from calibre.ebooks.metadata import title_sort from calibre import strftime @@ -131,8 +132,6 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, format_args['series_index'] = mi.format_series_index() else: template = re.sub(r'\{series_index[^}]*?\}', '', template) - ## TODO: NEWMETA: format custom values. Check all the datatypes. - if mi.rating is not None: format_args['rating'] = mi.format_rating() if hasattr(mi.timestamp, 'timetuple'): @@ -140,6 +139,19 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, if hasattr(mi.pubdate, 'timetuple'): format_args['pubdate'] = strftime(timefmt, mi.pubdate.timetuple()) format_args['id'] = str(id) + # Now format the custom fields + custom_metadata = mi.get_all_user_metadata(make_copy=False) + for key in custom_metadata: + if key in format_args: + ## TODO: NEWMETA: should ratings be divided by 2? The standard rating isn't... + if custom_metadata[key]['datatype'] == 'series': + format_args[key] = tsfmt(format_args[key]) + if key+'_index' in format_args: + format_args[key+'_index'] = fmt_sidx(format_args[key+'_index']) + elif custom_metadata[key]['datatype'] == 'datetime': + format_args[key] = strftime(timefmt, format_args[key].timetuple()) + elif custom_metadata[key]['datatype'] == 'bool': + format_args[key] = _('yes') if format_args[key] else _('no') components = [x.strip() for x in template.split('/') if x.strip()] components = [safe_format(x, format_args) for x in components] From 16e5b2f3b0204efefe1c73531c4ce98376342fc7 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 1 Sep 2010 16:44:12 +0100 Subject: [PATCH 008/412] Add code for Sony collections --- resources/default_tweaks.py | 32 ++++++- src/calibre/devices/usbms/books.py | 95 ++++++++++++++------ src/calibre/ebooks/metadata/book/__init__.py | 2 +- src/calibre/ebooks/metadata/book/base.py | 17 ++-- 4 files changed, 111 insertions(+), 35 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index e03b0680be..e68096ecd5 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -90,4 +90,34 @@ save_template_title_series_sorting = 'library_order' # Examples: # auto_connect_to_folder = 'C:\\Users\\someone\\Desktop\\testlib' # auto_connect_to_folder = '/home/dropbox/My Dropbox/someone/library' -auto_connect_to_folder = '' \ No newline at end of file +auto_connect_to_folder = '' + +# Specify renaming rules for sony collections. Collections on Sonys are named +# depending upon whether the field is standard or custom. A collection derived +# from a standard field is named for the value in that field. For example, if +# the standard 'series' column contains the name 'Darkover', then the series +# will be named 'Darkover'. A collection derived from a custom field will have +# the name of the field added to the value. For example, if a custom series +# column named 'My Series' contains the name 'Darkover', then the collection +# will be named 'Darkover (My Series)'. If two books have fields that generate +# the same collection name, then both books will be in that collection. This +# tweak lets you specify for a standard or custom field the value to be put +# inside the parentheses. You can use it to add a parenthetical description to a +# standard field, for example 'Foo (Tag)' instead of the 'Foo'. You can also use +# it to force multiple fields to end up in the same collection. For example, you +# could force the values in 'series', '#my_series_1', and '#my_series_2' to +# appear in collections named 'some_value (Series)', thereby merging all of the +# fields into one set of collections. The syntax of this tweak is +# {'field_lookup_name':'name_to_use', 'lookup_name':'name', ...} +# Example 1: I want three series columns to be merged into one set of +# collections. If the column lookup names are 'series', '#series_1' and +# '#series_2', and if I want nothing in the parenthesis, then the value to use +# in the tweak value would be: +# sony_collection_renaming_rules={'series':'', '#series_1':'', '#series_2':''} +# Example 2: I want the word '(Series)' to appear on collections made from +# series, and the word '(Tag)' to appear on collections made from tags. Use: +# sony_collection_renaming_rules={'series':'Series', 'tags':'Tag'} +# Example 3: I want 'series' and '#myseries' to be merged, and for the +# collection name to have '(Series)' appended. The renaming rule is: +# sony_collection_renaming_rules={'series':'Series', '#myseries':'Series'} +sony_collection_renaming_rules={} \ No newline at end of file diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 0efa507e09..3e13527bd0 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -9,9 +9,10 @@ import os, re, time, sys from calibre.ebooks.metadata.book.base import Metadata from calibre.devices.mime import mime_type_ext from calibre.devices.interface import BookList as _BookList -from calibre.constants import filesystem_encoding, preferred_encoding +from calibre.constants import preferred_encoding from calibre import isbytestring -from calibre.utils.config import prefs +from calibre.utils.config import prefs, tweaks +from calibre.utils.date import format_date class Book(Metadata): def __init__(self, prefix, lpath, size=None, other=None): @@ -94,11 +95,38 @@ class CollectionsBookList(BookList): def supports_collections(self): return True + def compute_category_name(self, attr, category, cust_field_meta): + renames = tweaks['sony_collection_renaming_rules'] + attr_name = renames.get(attr, None) + if attr_name is None: + if attr in cust_field_meta: + attr_name = '(%s)'%cust_field_meta[attr]['name'] + else: + attr_name = '' + elif attr_name != '': + attr_name = '(%s)'%attr_name + + if attr not in cust_field_meta: + cat_name = '%s %s'%(category, attr_name) + else: + fm = cust_field_meta[attr] + if fm['datatype'] == 'bool': + if category: + cat_name = '%s %s'%(_('Yes'), attr_name) + else: + cat_name = '%s %s'%(_('No'), attr_name) + elif fm['datatype'] == 'datetime': + cat_name = '%s %s'%(format_date(category, + fm['display'].get('date_format','dd MMM yyyy')), attr_name) + else: + cat_name = '%s %s'%(category, attr_name) + return cat_name.strip() + def get_collections(self, collection_attributes): from calibre.devices.usbms.driver import debug_print debug_print('Starting get_collections:', prefs['manage_device_metadata']) + debug_print('Renaming rules:', tweaks['sony_collection_renaming_rules']) collections = {} - series_categories = set([]) # This map of sets is used to avoid linear searches when testing for # book equality collections_lpaths = {} @@ -124,42 +152,55 @@ class CollectionsBookList(BookList): # For existing books, modify the collections only if the user # specified 'on_connect' attrs = collection_attributes + meta_vals = book.get_all_non_none_attributes() + cust_field_meta = book.get_all_user_metadata(make_copy=False) for attr in attrs: attr = attr.strip() - val = getattr(book, attr, None) + val = meta_vals.get(attr, None) if not val: continue if isbytestring(val): val = val.decode(preferred_encoding, 'replace') if isinstance(val, (list, tuple)): val = list(val) - elif isinstance(val, unicode): + else: val = [val] for category in val: - # TODO: NEWMETA: format the custom fields - if attr == 'tags' and len(category) > 1 and \ - category[0] == '[' and category[-1] == ']': + is_series = False + if attr in cust_field_meta: # is a custom field + fm = cust_field_meta[attr] + if fm['datatype'] == 'text' and len(category) > 1 and \ + category[0] == '[' and category[-1] == ']': + continue + if fm['datatype'] == 'series': + is_series = True + else: # is a standard field + if attr == 'tags' and len(category) > 1 and \ + category[0] == '[' and category[-1] == ']': + continue + if attr == 'series' or \ + ('series' in collection_attributes and + meta_vals.get('series', None) == category): + is_series = True + cat_name = self.compute_category_name(attr, category, + cust_field_meta) + if cat_name not in collections: + collections[cat_name] = [] + collections_lpaths[cat_name] = set() + if lpath in collections_lpaths[cat_name]: continue - if category not in collections: - collections[category] = [] - collections_lpaths[category] = set() - if lpath not in collections_lpaths[category]: - collections_lpaths[category].add(lpath) - collections[category].append(book) - if attr == 'series' or \ - ('series' in collection_attributes and - getattr(book, 'series', None) == category): - series_categories.add(category) + collections_lpaths[cat_name].add(lpath) + if is_series: + collections[cat_name].append( + (book, meta_vals.get(attr+'_index', sys.maxint))) + else: + collections[cat_name].append( + (book, meta_vals.get('title_sort', 'zzzz'))) # Sort collections + result = {} for category, books in collections.items(): - def tgetter(x): - return getattr(x, 'title_sort', 'zzzz') - books.sort(cmp=lambda x,y:cmp(tgetter(x), tgetter(y))) - if category in series_categories: - # Ensures books are sub sorted by title - def getter(x): - return getattr(x, 'series_index', sys.maxint) - books.sort(cmp=lambda x,y:cmp(getter(x), getter(y))) - return collections + books.sort(cmp=lambda x,y:cmp(x[1], y[1])) + result[category] = [x[0] for x in books] + return result def rebuild_collections(self, booklist, oncard): ''' diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index 47eb616394..ca7f4f7074 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -109,7 +109,7 @@ COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( CALIBRE_METADATA_FIELDS) - \ frozenset(['title', 'title_sort', 'authors', 'author_sort', 'author_sort_map' 'comments', - 'cover_data', 'tags', 'language']) + 'cover_data', 'tags', 'language', 'lpath']) SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( USER_METADATA_FIELDS).union( diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index dcb31c3ecc..3f5507d676 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -117,16 +117,18 @@ class Metadata(object): res[k] = copy.deepcopy(user_metadata[k]) return res - def get_user_metadata(self, field): + def get_user_metadata(self, field, make_copy): ''' return field metadata from the object if it is there. Otherwise return - None. field is the key name, not the label. Return a copy, just in case - the user wants to change values in the dict (json does). + None. field is the key name, not the label. Return a copy if requested, + just in case the user wants to change values in the dict. ''' _data = object.__getattribute__(self, '_data') _data = _data['user_metadata'] if field in _data: - return copy.deepcopy(_data[field]) + if make_copy: + return copy.deepcopy(_data[field]) + return _data[field] return None @classmethod @@ -189,7 +191,7 @@ class Metadata(object): for x in STANDARD_METADATA_FIELDS: prints('%s:'%x, getattr(self, x, 'None')) for x in self.user_metadata_keys: - meta = self.get_user_metadata(x) + meta = self.get_user_metadata(x, make_copy=False) if meta is not None: prints(x, meta) prints('--------------') @@ -220,6 +222,9 @@ class Metadata(object): self.set_all_user_metadata(other.get_all_user_metadata(make_copy=True)) self.comments = getattr(other, 'comments', '') self.language = getattr(other, 'language', None) + lpath = getattr(other, 'lpath', None) + if lpath is not None: + self.lpath = lpath else: for attr in COPYABLE_METADATA_FIELDS: if hasattr(other, attr): @@ -240,7 +245,7 @@ class Metadata(object): if getattr(other, 'user_metadata_keys', None): for x in other.user_metadata_keys: - meta = other.get_user_metadata(x) + meta = other.get_user_metadata(x, make_copy=True) if meta is not None: self.set_user_metadata(x, meta) # get... did the deepcopy From 0606afc8ff6edb0dfb6042bbc6cde3f891a068e9 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 2 Sep 2010 13:19:01 +0100 Subject: [PATCH 009/412] 1) make to_html support custom fields 2) clean up the _extra code 3) add a format_custom_field method to avoid duplicating code 4) pass custom metadata to book_details --- src/calibre/ebooks/metadata/book/base.py | 43 ++++++++++++++++++------ src/calibre/gui2/book_details.py | 2 ++ src/calibre/gui2/library/models.py | 6 +++- src/calibre/library/database2.py | 4 +-- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 3f5507d676..caaaccb3d0 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -12,7 +12,8 @@ from calibre import prints from calibre.ebooks.metadata.book import COPYABLE_METADATA_FIELDS from calibre.ebooks.metadata.book import STANDARD_METADATA_FIELDS from calibre.ebooks.metadata.book import TOP_LEVEL_CLASSIFIERS -from calibre.utils.date import isoformat +from calibre.utils.date import isoformat, format_date + NULL_VALUES = { @@ -94,6 +95,13 @@ class Metadata(object): return default return self.__getattribute__(field) + def get_extra(self, field): + _data = object.__getattribute__(self, '_data') + if field in _data['user_metadata'].iterkeys(): + return _data['user_metadata'][field]['#extra#'] + raise AttributeError( + 'Metadata object has no attribute named: '+ repr(field)) + def set(self, field, val, extra=None): self.__setattr__(field, val, extra) @@ -131,14 +139,6 @@ class Metadata(object): return _data[field] return None - @classmethod - def get_user_metadata_value(user_mi): - return user_mi['#value#'] - - @classmethod - def get_user_metadata_extra(user_mi): - return user_mi['#extra#'] - def set_all_user_metadata(self, metadata): ''' store custom field metadata into the object. Field is the key name @@ -284,6 +284,25 @@ class Metadata(object): def format_rating(self): return unicode(self.rating) + def format_custom_field(self, key): + ''' + returns the tuple (field_name, formatted_value) + ''' + cmeta = self.get_user_metadata(key, make_copy=False) + name = unicode(cmeta['name']) + res = self.get(key, None) + if res is not None: + datatype = cmeta['datatype'] + if datatype == 'text' and cmeta['is_multiple']: + res = u', '.join(res) + elif datatype == 'series': + res = res + ' [%s]'%self.format_series_index(self.get_extra(key)) + elif datatype == 'datetime': + res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) + elif datatype == 'bool': + res = _('Yes') if res else _('No') + return (name, unicode(res)) + def __unicode__(self): from calibre.ebooks.metadata import authors_to_string ans = [] @@ -339,9 +358,13 @@ class Metadata(object): ans += [(_('Published'), unicode(self.pubdate.isoformat(' ')))] if self.rights is not None: ans += [(_('Rights'), unicode(self.rights))] + for key in self.user_metadata_keys: + val = self.get(key, None) + if val is not None: + (name, val) = self.format_custom_field(key) + ans += [(name, val)] for i, x in enumerate(ans): ans[i] = u'%s%s'%x - # TODO: NEWMETA: What to do about custom fields return u'%s
'%u'\n'.join(ans) def __str__(self): diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index f08dd09429..4e11e0c84f 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -28,6 +28,8 @@ WEIGHTS[_('Tags')] = 4 def render_rows(data): keys = data.keys() + # First sort by name. The WEIGHTS sort will preserve this sub-order + keys.sort(cmp=lambda x, y: cmp(x.lower(), y.lower())) keys.sort(cmp=lambda x, y: cmp(WEIGHTS[x], WEIGHTS[y])) rows = [] for key in keys: diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index fdf21ecc23..2711756856 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -323,7 +323,11 @@ class BooksModel(QAbstractTableModel): # {{{ data[_('Series')] = \ _('Book %s of %s.')%\ (sidx, prepare_string_for_xml(series)) - + mi = self.db.get_metadata(idx) + for key in mi.user_metadata_keys: + name, val = mi.format_custom_field(key) + if val is not None: + data[name] = val return data def set_cache(self, idx): diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 6457e12905..bb6d72bcff 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -1052,8 +1052,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if key in self.field_metadata and \ user_mi[key]['datatype'] == self.field_metadata[key]['datatype']: doit(self.set_custom, id, - val=Metadata.get_user_metadata_value(user_mi[key]), - extra=Metadata.get_user_metadata_extra(user_mi[key]), + val=mi.get(key), + extra=mi.get_extra(key), label=user_mi[key]['label']) self.notify('metadata', [id]) From 7ff7da0fbb2485301142a6ba2e6c04923a6d4a59 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 3 Sep 2010 18:43:17 +0100 Subject: [PATCH 010/412] Remove relative import --- src/calibre/ebooks/metadata/book/json_codec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index 7a80e16854..96178c4a63 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -9,7 +9,7 @@ import json import traceback from PIL import Image -from . import SERIALIZABLE_FIELDS +from calibre.ebooks.metadata.book import SERIALIZABLE_FIELDS from calibre.constants import filesystem_encoding, preferred_encoding from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import parse_date, isoformat, UNDEFINED_DATE From 0ba513e2879b5e476d4787b333fb82b8dbe2e914 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 5 Sep 2010 11:01:55 +0100 Subject: [PATCH 011/412] Add a comment about not using the Metadata class, and why --- src/calibre/library/server/mobile.py | 4 ++++ src/calibre/library/server/xml.py | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index 229e0c21c4..6e08581aed 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -199,6 +199,10 @@ class MobileServer(object): CKEYS = [key for key in sorted(CFM.get_custom_fields(), cmp=lambda x,y: cmp(CFM[x]['name'].lower(), CFM[y]['name'].lower()))] + # This method uses its own book dict, not the Metadata dict. The loop + # below could be changed to use db.get_metadata instead of reading + # info directly from the record made by the view, but it doesn't seem + # worth it at the moment. books = [] for record in items[(start-1):(start-1)+num]: book = {'formats':record[FM['formats']], 'size':record[FM['size']]} diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py index ed8479980e..5bf2783f96 100644 --- a/src/calibre/library/server/xml.py +++ b/src/calibre/library/server/xml.py @@ -66,6 +66,10 @@ class XMLServer(object): return x.decode(preferred_encoding, 'replace') return unicode(x) + # This method uses its own book dict, not the Metadata dict. The loop + # below could be changed to use db.get_metadata instead of reading + # info directly from the record made by the view, but it doesn't seem + # worth it at the moment. for record in items[start:start+num]: kwargs = {} aus = record[FM['authors']] if record[FM['authors']] else __builtin__._('Unknown') @@ -138,6 +142,3 @@ class XMLServer(object): return etree.tostring(ans, encoding='utf-8', pretty_print=True, xml_declaration=True) - - - From 38c6199c7b54b243d039aba25cad86125326a582 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 5 Sep 2010 11:06:54 +0100 Subject: [PATCH 012/412] Change some comments from 'class:MetaInformation' to 'class:Metadata' --- src/calibre/customize/__init__.py | 4 ++-- src/calibre/devices/apple/driver.py | 2 +- src/calibre/ebooks/metadata/epub.py | 2 +- src/calibre/ebooks/metadata/fetch.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index 27e319de14..8ddc791b2f 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -218,7 +218,7 @@ class MetadataReaderPlugin(Plugin): # {{{ with the input data. :param type: The type of file. Guaranteed to be one of the entries in :attr:`file_types`. - :return: A :class:`calibre.ebooks.metadata.MetaInformation` object + :return: A :class:`calibre.ebooks.metadata.book.Metadata` object ''' return None # }}} @@ -248,7 +248,7 @@ class MetadataWriterPlugin(Plugin): # {{{ with the input data. :param type: The type of file. Guaranteed to be one of the entries in :attr:`file_types`. - :param mi: A :class:`calibre.ebooks.metadata.MetaInformation` object + :param mi: A :class:`calibre.ebooks.metadata.book.Metadata` object ''' pass diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index 75517e9df7..94aea1e79d 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -872,7 +872,7 @@ class ITUNES(DriverBase): once uploaded to the device. len(names) == len(files) :return: A list of 3-element tuples. The list is meant to be passed to L{add_books_to_metadata}. - :metadata: If not None, it is a list of :class:`MetaInformation` objects. + :metadata: If not None, it is a list of :class:`Metadata` objects. The idea is to use the metadata to determine where on the device to put the book. len(metadata) == len(files). Apart from the regular cover (path to cover), there may also be a thumbnail attribute, which should diff --git a/src/calibre/ebooks/metadata/epub.py b/src/calibre/ebooks/metadata/epub.py index 041a1ee603..ac6b5feebe 100644 --- a/src/calibre/ebooks/metadata/epub.py +++ b/src/calibre/ebooks/metadata/epub.py @@ -164,7 +164,7 @@ def get_cover(opf, opf_path, stream, reader=None): return render_html_svg_workaround(cpage, default_log) def get_metadata(stream, extract_cover=True): - """ Return metadata as a :class:`MetaInformation` object """ + """ Return metadata as a :class:`Metadata` object """ stream.seek(0) reader = OCFZipReader(stream) mi = MetaInformation(reader.opf) diff --git a/src/calibre/ebooks/metadata/fetch.py b/src/calibre/ebooks/metadata/fetch.py index 96807c06ae..9b8a42e482 100644 --- a/src/calibre/ebooks/metadata/fetch.py +++ b/src/calibre/ebooks/metadata/fetch.py @@ -29,7 +29,7 @@ class MetadataSource(Plugin): # {{{ future use. The fetch method must store the results in `self.results` as a list of - :class:`MetaInformation` objects. If there is an error, it should be stored + :class:`Metadata` objects. If there is an error, it should be stored in `self.exception` and `self.tb` (for the traceback). ''' From 06b266840c8785aa93aa265c0c20308c1c7286f7 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 5 Sep 2010 12:35:35 +0100 Subject: [PATCH 013/412] Make gui version of content server able to show both abbreviated and full lists of tags. --- resources/content_server/gui.js | 34 ++++++++++++++++++++++++ src/calibre/ebooks/metadata/book/base.py | 7 ++--- src/calibre/library/server/utils.py | 9 ++++--- src/calibre/library/server/xml.py | 6 +++-- 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/resources/content_server/gui.js b/resources/content_server/gui.js index 8368866a5e..abbd409dc8 100644 --- a/resources/content_server/gui.js +++ b/resources/content_server/gui.js @@ -59,14 +59,44 @@ function render_book(book) { title = title.slice(0, title.length-2); title += ' ({0} MB) '.format(size); } + title += '' + if (tags) { + t = tags.split(':&:', 2); + m = parseInt(t[0]); + t = t[1].split(',', m); + if (t.length == m) t[m] = '...' + title += 'Tags=[{0}] '.format(t.join(',')); + } + custcols = book.attr("custcols").split(',') + for ( i = 0; i < custcols.length; i++) { + if (custcols[i].length > 0) { + vals = book.attr(custcols[i]).split(':#:', 2); + if (vals[0].indexOf('#T#') == 0) { //startswith + vals[0] = vals[0].substr(3, vals[0].length) + t = vals[1].split(':&:', 2); + m = parseInt(t[0]); + t = t[1].split(',', m); + if (t.length == m) t[m] = '...'; + vals[1] = t.join(','); + } + title += '{0}=[{1}] '.format(vals[0], vals[1]); + } + } + title += '' + title += '' title += ''.format(id); title += '

{0}
'.format(comments) // Render authors cell @@ -170,11 +200,15 @@ function fetch_library_books(start, num, timeout, sort, order, search) { var cover = row.find('img').attr('src'); var collapsed = row.find('.comments').css('display') == 'none'; $("#book_list tbody tr * .comments").css('display', 'none'); + $("#book_list tbody tr * .tagdata_short").css('display', 'inherit'); + $("#book_list tbody tr * .tagdata_long").css('display', 'none'); $('#cover_pane').css('visibility', 'hidden'); if (collapsed) { row.find('.comments').css('display', 'inherit'); $('#cover_pane img').attr('src', cover); $('#cover_pane').css('visibility', 'visible'); + row.find(".tagdata_short").css('display', 'none'); + row.find(".tagdata_long").css('display', 'inherit'); } }); diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index caaaccb3d0..2ff24b0ddc 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -262,10 +262,11 @@ class Metadata(object): if other_lang and other_lang.lower() != 'und': self.language = other_lang - def format_series_index(self): + def format_series_index(self, val=None): from calibre.ebooks.metadata import fmt_sidx + v = self.series_index if val is None else val try: - x = float(self.series_index) + x = float(v) except ValueError: x = 1 return fmt_sidx(x) @@ -296,7 +297,7 @@ class Metadata(object): if datatype == 'text' and cmeta['is_multiple']: res = u', '.join(res) elif datatype == 'series': - res = res + ' [%s]'%self.format_series_index(self.get_extra(key)) + res = res + ' [%s]'%self.format_series_index(val=self.get_extra(key)) elif datatype == 'datetime': res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': diff --git a/src/calibre/library/server/utils.py b/src/calibre/library/server/utils.py index 23916aa75c..373653c15f 100644 --- a/src/calibre/library/server/utils.py +++ b/src/calibre/library/server/utils.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import time +import time, sys import cherrypy @@ -44,8 +44,8 @@ def strftime(fmt='%Y/%m/%d %H:%M:%S', dt=None): except: return _strftime(fmt, nowf().timetuple()) -def format_tag_string(tags, sep): - MAX = tweaks['max_content_server_tags_shown'] +def format_tag_string(tags, sep, ignore_max=False): + MAX = sys.maxint if ignore_max else tweaks['max_content_server_tags_shown'] if tags: tlist = [t.strip() for t in tags.split(sep)] else: @@ -53,5 +53,6 @@ def format_tag_string(tags, sep): tlist.sort(cmp=lambda x,y:cmp(x.lower(), y.lower())) if len(tlist) > MAX: tlist = tlist[:MAX]+['...'] - return u'%s'%(', '.join(tlist)) if tlist else '' + return u'%s:&:%s'%(tweaks['max_content_server_tags_shown'], + ', '.join(tlist)) if tlist else '' diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py index 5bf2783f96..8715dda7d0 100644 --- a/src/calibre/library/server/xml.py +++ b/src/calibre/library/server/xml.py @@ -89,7 +89,7 @@ class XMLServer(object): 'comments'): y = record[FM[x]] if x == 'tags': - y = format_tag_string(y, ',') + y = format_tag_string(y, ',', ignore_max=True) kwargs[x] = serialize(y) if y else '' c = kwargs.pop('comments') @@ -111,7 +111,9 @@ class XMLServer(object): name = CFM[key]['name'] custcols.append(k) if datatype == 'text' and CFM[key]['is_multiple']: - kwargs[k] = concat(name, format_tag_string(val,'|')) + kwargs[k] = concat('#T#'+name, + format_tag_string(val,'|', + ignore_max=True)) elif datatype == 'series': kwargs[k] = concat(name, '%s [%s]'%(val, fmt_sidx(record[CFM.cc_series_index_column_for(key)]))) From 6bad998546cc2c9891bdf48a5ff89ebe8a86b0cd Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 8 Sep 2010 16:52:40 +0100 Subject: [PATCH 014/412] Add custom fields to the 'unicode' function --- src/calibre/ebooks/metadata/book/base.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 2ff24b0ddc..648beb7b5c 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -338,7 +338,11 @@ class Metadata(object): fmt('Published', isoformat(self.pubdate)) if self.rights is not None: fmt('Rights', unicode(self.rights)) - # TODO: NEWMETA: What to do about custom fields? + for key in self.user_metadata_keys: + val = self.get(key, None) + if val is not None: + (name, val) = self.format_custom_field(key) + fmt(name, unicode(val)) return u'\n'.join(ans) def to_html(self): From 9155f838f1f43d878c083bd1a9b9ce955d1c32c8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 8 Sep 2010 19:39:57 +0100 Subject: [PATCH 015/412] Fix some bugs found after or introduced by trunk merges --- src/calibre/ebooks/metadata/book/__init__.py | 3 ++- src/calibre/ebooks/metadata/book/base.py | 26 ++++++++++---------- src/calibre/library/save_to_disk.py | 25 ++++++++++--------- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index ca7f4f7074..e7f58ce858 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -109,7 +109,8 @@ COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( CALIBRE_METADATA_FIELDS) - \ frozenset(['title', 'title_sort', 'authors', 'author_sort', 'author_sort_map' 'comments', - 'cover_data', 'tags', 'language', 'lpath']) + 'cover_data', 'tags', 'language', 'lpath', + 'size']) SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( USER_METADATA_FIELDS).union( diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 648beb7b5c..69a3c42f4d 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -201,6 +201,11 @@ class Metadata(object): Merge the information in C{other} into self. In case of conflicts, the information in C{other} takes precedence, unless the information in other is NULL. ''' + def copy_not_none(dest, src, attr): + v = getattr(src, attr, None) + if v is not None: + setattr(dest, attr, copy.deepcopy(v)) + if other.title and other.title != _('Unknown'): self.title = other.title if hasattr(other, 'title_sort'): @@ -220,21 +225,19 @@ class Metadata(object): self.tags = other.tags self.cover_data = getattr(other, 'cover_data', '') self.set_all_user_metadata(other.get_all_user_metadata(make_copy=True)) - self.comments = getattr(other, 'comments', '') - self.language = getattr(other, 'language', None) - lpath = getattr(other, 'lpath', None) - if lpath is not None: - self.lpath = lpath + copy_not_none(self, other, 'lpath') + copy_not_none(self, other, 'size') + copy_not_none(self, other, 'comments') + # language is handled below else: for attr in COPYABLE_METADATA_FIELDS: if hasattr(other, attr): + copy_not_none(self, other, attr) val = getattr(other, attr) if val is not None: setattr(self, attr, copy.deepcopy(val)) - if other.tags: self.tags += list(set(self.tags + other.tags)) - if getattr(other, 'cover_data', False): other_cover = other.cover_data[-1] self_cover = self.cover_data[-1] if self.cover_data else '' @@ -242,13 +245,11 @@ class Metadata(object): if not other_cover: other_cover = '' if len(other_cover) > len(self_cover): self.cover_data = other.cover_data - if getattr(other, 'user_metadata_keys', None): for x in other.user_metadata_keys: meta = other.get_user_metadata(x, make_copy=True) if meta is not None: self.set_user_metadata(x, meta) # get... did the deepcopy - my_comments = getattr(self, 'comments', '') other_comments = getattr(other, 'comments', '') if not my_comments: @@ -257,10 +258,9 @@ class Metadata(object): other_comments = '' if len(other_comments.strip()) > len(my_comments.strip()): self.comments = other_comments - - other_lang = getattr(other, 'language', None) - if other_lang and other_lang.lower() != 'und': - self.language = other_lang + other_lang = getattr(other, 'language', None) + if other_lang and other_lang.lower() != 'und': + self.language = other_lang def format_series_index(self, val=None): from calibre.ebooks.metadata import fmt_sidx diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index c940cc006b..d33cbb04b5 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -6,7 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, traceback, cStringIO, re +import os, traceback, cStringIO, re, string from calibre.utils.config import Config, StringConfig, tweaks from calibre.utils.filenames import shorten_components_to, supports_long_names, \ @@ -98,17 +98,20 @@ def preprocess_template(template): template = template.decode(preferred_encoding, 'replace') return template +class SafeFormat(string.Formatter): + ''' + Provides a format function that substitutes '' for any missing value + ''' + def get_value(self, key, args, kwargs): + try: + return kwargs[key] + except: + return '' +safe_formatter = SafeFormat() + def safe_format(x, format_args): - try: - ans = x.format(**format_args).strip() - return re.sub(r'\s+', ' ', ans) - except IndexError: # Thrown if user used [] and index is out of bounds - pass - except AttributeError: # Thrown if user used a non existing attribute - pass - except KeyError: # Thrown if user used custom field w/value None - pass - return '' + ans = safe_formatter.vformat(x, [], format_args).strip() + return re.sub(r'\s+', ' ', ans) def get_components(template, mi, id, timefmt='%b %Y', length=250, sanitize_func=ascii_filename, replace_whitespace=False, From 7603f208b39032cbcdc42939c0753ed8ddbbe987 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 8 Sep 2010 20:29:42 +0100 Subject: [PATCH 016/412] SLight cleanup --- src/calibre/library/save_to_disk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index d33cbb04b5..3fa40c68b2 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -118,7 +118,7 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, to_lowercase=False): library_order = tweaks['save_template_title_series_sorting'] == 'library_order' tsfmt = title_sort if library_order else lambda x: x - format_args = dict(**FORMAT_ARGS) + format_args = FORMAT_ARGS.copy() format_args.update(mi.get_all_non_none_attributes()) if mi.title: format_args['title'] = tsfmt(mi.title) From f175b8bf6d75ac8615227c2557dcccc341f493d4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 10 Sep 2010 20:12:12 -0600 Subject: [PATCH 017/412] ... --- src/calibre/ebooks/metadata/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index f64a269fd1..429ba06c6e 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -231,7 +231,7 @@ def MetaInformation(title, authors=(_('Unknown'),)): mi = title title = mi.title authors = mi.authors - return Metadata(title, authors, mi) + return Metadata(title, authors, other=mi) def check_isbn10(isbn): try: From 4f01b09ded8a0aa21f273596051ca8f32426bef2 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 11 Sep 2010 09:21:29 +0100 Subject: [PATCH 018/412] Check in the metadata class that custom field names begin with '#' --- src/calibre/ebooks/metadata/book/base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 69a3c42f4d..d0b428bf96 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -156,6 +156,9 @@ class Metadata(object): the key name not the label ''' if field is not None: + if not field.startswith('#'): + raise AttributeError( + 'Custom field name %s must begin with \'#\''%repr(field)) if metadata is None: traceback.print_stack() metadata = copy.deepcopy(metadata) From afe5546a15aa34fec849c875cb2b9b139c36ebd6 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 11 Sep 2010 09:23:03 +0100 Subject: [PATCH 019/412] Avoid spurious exceptions when adding None custom metadata --- src/calibre/ebooks/metadata/book/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index d0b428bf96..be9a4675c0 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -161,6 +161,7 @@ class Metadata(object): 'Custom field name %s must begin with \'#\''%repr(field)) if metadata is None: traceback.print_stack() + return metadata = copy.deepcopy(metadata) if '#value#' not in metadata: if metadata['datatype'] == 'text' and metadata['is_multiple']: From db54abd2b659290ba8a8d598f99fc16c853bf2f7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 12 Sep 2010 12:08:18 -0600 Subject: [PATCH 020/412] Various tweaks to the way smart_update works --- src/calibre/ebooks/metadata/book/base.py | 34 +++++++++++++++--------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index be9a4675c0..f52c41e4c5 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -202,12 +202,12 @@ class Metadata(object): def smart_update(self, other, replace_metadata=False): ''' - Merge the information in C{other} into self. In case of conflicts, the information - in C{other} takes precedence, unless the information in other is NULL. + Merge the information in `other` into self. In case of conflicts, the information + in `other` takes precedence, unless the information in `other` is NULL. ''' def copy_not_none(dest, src, attr): v = getattr(src, attr, None) - if v is not None: + if v not in (None, NULL_VALUES.get(attr, None)): setattr(dest, attr, copy.deepcopy(v)) if other.title and other.title != _('Unknown'): @@ -216,32 +216,38 @@ class Metadata(object): self.title_sort = other.title_sort if other.authors and other.authors[0] != _('Unknown'): - self.authors = other.authors + self.authors = list(other.authors) if hasattr(other, 'author_sort_map'): - self.author_sort_map = other.author_sort_map + self.author_sort_map = dict(other.author_sort_map) if hasattr(other, 'author_sort'): self.author_sort = other.author_sort if replace_metadata: + SPECIAL_FIELDS = frozenset(['lpath', 'size', 'comments']) for attr in COPYABLE_METADATA_FIELDS: setattr(self, attr, getattr(other, attr, 1.0 if \ attr == 'series_index' else None)) self.tags = other.tags - self.cover_data = getattr(other, 'cover_data', '') + self.cover_data = getattr(other, 'cover_data', + NULL_VALUES['cover_data']) self.set_all_user_metadata(other.get_all_user_metadata(make_copy=True)) - copy_not_none(self, other, 'lpath') - copy_not_none(self, other, 'size') - copy_not_none(self, other, 'comments') + for x in SPECIAL_FIELDS: + copy_not_none(self, other, x) # language is handled below else: for attr in COPYABLE_METADATA_FIELDS: if hasattr(other, attr): copy_not_none(self, other, attr) - val = getattr(other, attr) - if val is not None: - setattr(self, attr, copy.deepcopy(val)) if other.tags: - self.tags += list(set(self.tags + other.tags)) + # Case-insensitive but case preserving merging + lotags = [t.lower() for t in other.tags] + lstags = [t.lower() for t in self.tags] + ot, st = map(frozenset, (lotags, lstags)) + for t in st.interection(ot): + sidx = lstags.index(t) + oidx = lotags.index(t) + self.tags[sidx] = other.tags[oidx] + self.tags += [t for t in other.tags if t.lower() in ot-st] if getattr(other, 'cover_data', False): other_cover = other.cover_data[-1] self_cover = self.cover_data[-1] if self.cover_data else '' @@ -262,6 +268,7 @@ class Metadata(object): other_comments = '' if len(other_comments.strip()) > len(my_comments.strip()): self.comments = other_comments + other_lang = getattr(other, 'language', None) if other_lang and other_lang.lower() != 'und': self.language = other_lang @@ -383,3 +390,4 @@ class Metadata(object): return bool(self.title or self.author or self.comments or self.tags) # }}} + From b01b603358c0332d481a3c572fcd44d63d5cccdf Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 12 Sep 2010 13:28:22 -0600 Subject: [PATCH 021/412] json_codec: Handle dictionaries with bytsestring keys/vals as well --- .../ebooks/metadata/book/json_codec.py | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index 0e205c52b0..ea0de07342 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -12,23 +12,18 @@ from calibre.ebooks.metadata.book import SERIALIZABLE_FIELDS from calibre.constants import filesystem_encoding, preferred_encoding from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import parse_date, isoformat, UNDEFINED_DATE +from calibre import isbytestring # Translate datetimes to and from strings. The string form is the datetime in # UTC. The returned date is also UTC def string_to_datetime(src): if src == "None": return None -# dt = strptime(src, '%d %m %Y %H:%M:%S', assume_utc=True, as_utc=True) -# if dt == UNDEFINED_DATE: -# return None return parse_date(src) def datetime_to_string(dateval): if dateval is None or dateval == UNDEFINED_DATE: return "None" -# tt = date_to_utc(dateval).timetuple() -# res = "%02d %02d %04d %02d:%02d:%02d"%(tt.tm_mday, tt.tm_mon, tt.tm_year, -# tt.tm_hour, tt.tm_min, tt.tm_sec) return isoformat(dateval) def encode_thumbnail(thumbnail): @@ -47,6 +42,24 @@ def decode_thumbnail(tup): return None return (tup[0], tup[1], b64decode(tup[2])) +def object_to_unicode(obj, enc=preferred_encoding): + + def dec(x): + return x.decode(enc, 'replace') + + if isbytestring(obj): + return dec(obj) + if isinstance(obj, (list, tuple)): + return [dec(x) if isbytestring(x) else x for x in obj] + if isinstance(obj, dict): + ans = {} + for k, v in obj.items(): + k = object_to_unicode(k) + v = object_to_unicode(v) + ans[k] = v + return ans + return obj + class JsonCodec(object): def __init__(self): @@ -81,16 +94,13 @@ class JsonCodec(object): value = book.get(key) if key == 'thumbnail': return encode_thumbnail(value) - elif isinstance(value, str): # str includes bytes + elif isbytestring(value): # str includes bytes enc = filesystem_encoding if key == 'lpath' else preferred_encoding - return value.decode(enc, 'replace') - elif isinstance(value, (list, tuple)): - return [x.decode(preferred_encoding, 'replace') if - isinstance(x, str) else x for x in value] + return object_to_unicode(value, enc=enc) elif datatype == 'datetime': return datetime_to_string(value) else: - return value + return object_to_unicode(value) def decode_from_file(self, file, booklist, book_class, prefix): js = [] @@ -108,7 +118,6 @@ class JsonCodec(object): except: print 'exception during JSON decoding' traceback.print_exc() - booklist = [] def decode_metadata(self, key, value): if key == 'user_metadata': From ea3719c7737b4c4df60840ed0b86bed872e07a6c Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 20:52:26 +0100 Subject: [PATCH 022/412] Content server fixes --- src/calibre/library/server/mobile.py | 8 ++++++-- src/calibre/library/server/opds.py | 10 +++++++--- src/calibre/library/server/utils.py | 7 +++++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index 6e08581aed..ab5b39eed8 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -124,6 +124,7 @@ def build_index(books, num, search, sort, order, start, total, url_base, CKEYS): series = u'[%s - %s]'%(book['series'], book['series_index']) \ if book['series'] else '' tags = u'Tags=[%s]'%book['tags'] if book['tags'] else '' + print tags ctext = '' for key in CKEYS: @@ -217,7 +218,8 @@ class MobileServer(object): book['authors'] = authors book['series_index'] = fmt_sidx(float(record[FM['series_index']])) book['series'] = record[FM['series']] - book['tags'] = format_tag_string(record[FM['tags']], ',') + book['tags'] = format_tag_string(record[FM['tags']], ',', + no_tag_count=True) book['title'] = record[FM['title']] for x in ('timestamp', 'pubdate'): book[x] = strftime('%Y/%m/%d %H:%M:%S', record[FM[x]]) @@ -233,7 +235,9 @@ class MobileServer(object): continue name = CFM[key]['name'] if datatype == 'text' and CFM[key]['is_multiple']: - book[key] = concat(name, format_tag_string(val, '|')) + book[key] = concat(name, + format_tag_string(val, '|', + no_tag_count=True)) elif datatype == 'series': book[key] = concat(name, '%s [%s]'%(val, fmt_sidx(record[CFM.cc_series_index_column_for(key)]))) diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index c3a1d68749..e495598a2f 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -17,6 +17,7 @@ import routes from calibre.constants import __appname__ from calibre.ebooks.metadata import fmt_sidx from calibre.library.comments import comments_to_html +from calibre.library.server.utils import format_tag_string from calibre import guess_type from calibre.utils.ordered_dict import OrderedDict from calibre.utils.date import format_date @@ -147,8 +148,9 @@ def ACQUISITION_ENTRY(item, version, FM, updated, CFM, CKEYS): extra.append(_('RATING: %s
')%rating) tags = item[FM['tags']] if tags: - extra.append(_('TAGS: %s
')%\ - ', '.join(tags.split(','))) + extra.append(_('TAGS: %s
')%format_tag_string(tags, ',', + ignore_max=True, + no_tag_count=True)) series = item[FM['series']] if series: extra.append(_('SERIES: %s [%s]
')%\ @@ -160,7 +162,9 @@ def ACQUISITION_ENTRY(item, version, FM, updated, CFM, CKEYS): name = CFM[key]['name'] datatype = CFM[key]['datatype'] if datatype == 'text' and CFM[key]['is_multiple']: - extra.append('%s: %s
'%(name, ', '.join(val.split('|')))) + extra.append('%s: %s
'%(name, format_tag_string(val, '|', + ignore_max=True, + no_tag_count=True))) elif datatype == 'series': extra.append('%s: %s [%s]
'%(name, val, fmt_sidx(item[CFM.cc_series_index_column_for(key)]))) diff --git a/src/calibre/library/server/utils.py b/src/calibre/library/server/utils.py index 373653c15f..9a64948a3d 100644 --- a/src/calibre/library/server/utils.py +++ b/src/calibre/library/server/utils.py @@ -44,7 +44,7 @@ def strftime(fmt='%Y/%m/%d %H:%M:%S', dt=None): except: return _strftime(fmt, nowf().timetuple()) -def format_tag_string(tags, sep, ignore_max=False): +def format_tag_string(tags, sep, ignore_max=False, no_tag_count=False): MAX = sys.maxint if ignore_max else tweaks['max_content_server_tags_shown'] if tags: tlist = [t.strip() for t in tags.split(sep)] @@ -53,6 +53,9 @@ def format_tag_string(tags, sep, ignore_max=False): tlist.sort(cmp=lambda x,y:cmp(x.lower(), y.lower())) if len(tlist) > MAX: tlist = tlist[:MAX]+['...'] - return u'%s:&:%s'%(tweaks['max_content_server_tags_shown'], + if no_tag_count: + return ', '.join(tlist) if tlist else '' + else: + return u'%s:&:%s'%(tweaks['max_content_server_tags_shown'], ', '.join(tlist)) if tlist else '' From 240c9428f5da2c5452dd7f0ab6cc8a6c8cd67afe Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 12 Sep 2010 13:57:42 -0600 Subject: [PATCH 023/412] Revert change to how Metadata.thumbnail is interpreted in library.models --- src/calibre/gui2/library/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index b0aec7446a..b81628cd27 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -1055,8 +1055,8 @@ class DeviceBooksModel(BooksModel): # {{{ img = QImage() if hasattr(cdata, 'image_path'): img.load(cdata.image_path) - else: - img.loadFromData(cdata[2]) + elif cdata: + img.loadFromData(cdata) if img.isNull(): img = self.default_image data['cover'] = img From 0a2f80fdbff1b5fb541e567a8735ba5b8ca20ffa Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 21:13:35 +0100 Subject: [PATCH 024/412] Merge from trunk --- src/calibre/devices/usbms/books.py | 2 +- src/calibre/ebooks/metadata/book/__init__.py | 2 +- src/calibre/ebooks/metadata/book/base.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 3e13527bd0..4d5110b049 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -59,7 +59,7 @@ class Book(Metadata): return property(doc=doc, fget=fget) @dynamic_property - def thumbnail(self): + def thumbnail(self):' return None class BookList(_BookList): diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index e7f58ce858..84a88606f2 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -110,7 +110,7 @@ COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( frozenset(['title', 'title_sort', 'authors', 'author_sort', 'author_sort_map' 'comments', 'cover_data', 'tags', 'language', 'lpath', - 'size']) + 'size', 'thumbnail']) SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( USER_METADATA_FIELDS).union( diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index f52c41e4c5..647a9f467e 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -243,7 +243,7 @@ class Metadata(object): lotags = [t.lower() for t in other.tags] lstags = [t.lower() for t in self.tags] ot, st = map(frozenset, (lotags, lstags)) - for t in st.interection(ot): + for t in st.intersection(ot): sidx = lstags.index(t) oidx = lotags.index(t) self.tags[sidx] = other.tags[oidx] From db4b8d8216bd2299d471be43b114e3e05edf1f26 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 21:15:31 +0100 Subject: [PATCH 025/412] Fix some inadvertent changes --- src/calibre/devices/usbms/books.py | 2 +- src/calibre/ebooks/metadata/book/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 4d5110b049..3e13527bd0 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -59,7 +59,7 @@ class Book(Metadata): return property(doc=doc, fget=fget) @dynamic_property - def thumbnail(self):' + def thumbnail(self): return None class BookList(_BookList): diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index 84a88606f2..e7f58ce858 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -110,7 +110,7 @@ COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( frozenset(['title', 'title_sort', 'authors', 'author_sort', 'author_sort_map' 'comments', 'cover_data', 'tags', 'language', 'lpath', - 'size', 'thumbnail']) + 'size']) SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( USER_METADATA_FIELDS).union( From 6ca5263d005a10218008ba74a1a8942ca5c6f74f Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 21:36:23 +0100 Subject: [PATCH 026/412] Fix typo, add merge is_multiple --- src/calibre/ebooks/metadata/book/base.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 647a9f467e..f2031afd0e 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -259,7 +259,20 @@ class Metadata(object): for x in other.user_metadata_keys: meta = other.get_user_metadata(x, make_copy=True) if meta is not None: + self_tags = self.get(x, []) self.set_user_metadata(x, meta) # get... did the deepcopy + other_tags = other.get(x, []) + if meta['is_multiple']: + # Case-insensitive but case preserving merging + lotags = [t.lower() for t in other_tags] + lstags = [t.lower() for t in self_tags] + ot, st = map(frozenset, (lotags, lstags)) + for t in st.intersection(ot): + sidx = lstags.index(t) + oidx = lotags.index(t) + self_tags[sidx] = other.tags[oidx] + self_tags += [t for t in other.tags if t.lower() in ot-st] + setattr(self, x, self_tags) my_comments = getattr(self, 'comments', '') other_comments = getattr(other, 'comments', '') if not my_comments: From 8b554ee0cda99dd11c50ba6def1634ca2416396b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 22:04:10 +0100 Subject: [PATCH 027/412] Fixes for thumbnails. --- src/calibre/ebooks/metadata/book/__init__.py | 2 +- src/calibre/ebooks/metadata/book/base.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index e7f58ce858..84a88606f2 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -110,7 +110,7 @@ COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( frozenset(['title', 'title_sort', 'authors', 'author_sort', 'author_sort_map' 'comments', 'cover_data', 'tags', 'language', 'lpath', - 'size']) + 'size', 'thumbnail']) SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( USER_METADATA_FIELDS).union( diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index f2031afd0e..7812f81180 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -223,7 +223,7 @@ class Metadata(object): self.author_sort = other.author_sort if replace_metadata: - SPECIAL_FIELDS = frozenset(['lpath', 'size', 'comments']) + SPECIAL_FIELDS = frozenset(['lpath', 'size', 'comments', 'thumbnail']) for attr in COPYABLE_METADATA_FIELDS: setattr(self, attr, getattr(other, attr, 1.0 if \ attr == 'series_index' else None)) @@ -238,6 +238,7 @@ class Metadata(object): for attr in COPYABLE_METADATA_FIELDS: if hasattr(other, attr): copy_not_none(self, other, attr) + copy_not_none(self, other, 'thumbnail') if other.tags: # Case-insensitive but case preserving merging lotags = [t.lower() for t in other.tags] From 171ac9488aeadfe1b6fd0605c17bbc71662726ed Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 22:32:20 +0100 Subject: [PATCH 028/412] An attempt to make covers work. --- src/calibre/gui2/library/models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index b81628cd27..4e8e9a10bd 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -1056,7 +1056,10 @@ class DeviceBooksModel(BooksModel): # {{{ if hasattr(cdata, 'image_path'): img.load(cdata.image_path) elif cdata: - img.loadFromData(cdata) + if isinstance(cdata, tuple): + img.loadFromData(cdata[2]) + else: + img.loadFromData(cdata) if img.isNull(): img = self.default_image data['cover'] = img From e73b688ca8ee61b39a65dbfb40d36863b74800f2 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 22:44:36 +0100 Subject: [PATCH 029/412] Deal with the two thumbnail formats --- src/calibre/ebooks/metadata/book/json_codec.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index ea0de07342..a6235e64d5 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -12,6 +12,7 @@ from calibre.ebooks.metadata.book import SERIALIZABLE_FIELDS from calibre.constants import filesystem_encoding, preferred_encoding from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import parse_date, isoformat, UNDEFINED_DATE +from calibre.utils.magick.draw import identify_data from calibre import isbytestring # Translate datetimes to and from strings. The string form is the datetime in @@ -32,7 +33,12 @@ def encode_thumbnail(thumbnail): ''' if thumbnail is None: return None - return (thumbnail[0], thumbnail[1], b64encode(str(thumbnail[2]))) + if isinstance(thumbnail, tuple): + try: + thumbnail = identify_data(thumbnail) + except: + return None + return (0, 0, b64encode(str(thumbnail))) def decode_thumbnail(tup): ''' From e0261c2ba1e53300275849818df0b78729f99b98 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 12 Sep 2010 22:50:34 +0100 Subject: [PATCH 030/412] This time, do json thumbnails right. --- src/calibre/ebooks/metadata/book/json_codec.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index a6235e64d5..51b9722803 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -12,7 +12,7 @@ from calibre.ebooks.metadata.book import SERIALIZABLE_FIELDS from calibre.constants import filesystem_encoding, preferred_encoding from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import parse_date, isoformat, UNDEFINED_DATE -from calibre.utils.magick.draw import identify_data +from calibre.utils.magick import Image from calibre import isbytestring # Translate datetimes to and from strings. The string form is the datetime in @@ -33,12 +33,15 @@ def encode_thumbnail(thumbnail): ''' if thumbnail is None: return None - if isinstance(thumbnail, tuple): + if not isinstance(thumbnail, tuple): try: - thumbnail = identify_data(thumbnail) + img = Image() + img.load(thumbnail) + width, height = img.size + thumbnail = (width, height, thumbnail) except: return None - return (0, 0, b64encode(str(thumbnail))) + return (thumbnail[0], thumbnail[1], b64encode(str(thumbnail[2]))) def decode_thumbnail(tup): ''' From be95815b6ce234602f1fe6f76a51a3571db06535 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 12 Sep 2010 18:10:52 -0600 Subject: [PATCH 031/412] ... --- src/calibre/gui2/library/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 4e8e9a10bd..09a28fb04e 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -1056,8 +1056,8 @@ class DeviceBooksModel(BooksModel): # {{{ if hasattr(cdata, 'image_path'): img.load(cdata.image_path) elif cdata: - if isinstance(cdata, tuple): - img.loadFromData(cdata[2]) + if isinstance(cdata, (tuple, list)): + img.loadFromData(cdata[-1]) else: img.loadFromData(cdata) if img.isNull(): From 43adf4226a6d381cf121ad5871b9237af57c58af Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 13 Sep 2010 08:18:09 +0100 Subject: [PATCH 032/412] Rationalize how smart_update knows what to do. Introduced 2 more metadata groups. One is the list of attributes that smart_update is to process specially. The other is the list of attributes that are to be copied if not none (what you called SPECIAL_FIELDS). These two help keep the replace and merge branches in sync. --- src/calibre/ebooks/metadata/book/__init__.py | 17 ++++++++++----- src/calibre/ebooks/metadata/book/base.py | 23 ++++++++++++-------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index 84a88606f2..e087f8072d 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -101,16 +101,23 @@ STANDARD_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( DEVICE_METADATA_FIELDS).union( CALIBRE_METADATA_FIELDS) +# Metadata fields that smart update must do special processing to copy. + +SC_FIELDS_NOT_COPIED = frozenset(['title', 'title_sort', 'authors', + 'author_sort', 'author_sort_map', + 'cover_data', 'tags', 'language']) + +# Metadata fields that smart update should copy only if the source is not None +SC_FIELDS_COPY_NOT_NULL = frozenset(['lpath', 'size', 'comments', 'thumbnail']) + # Metadata fields that smart update should copy without special handling -COPYABLE_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union( +SC_COPYABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( PUBLICATION_METADATA_FIELDS).union( BOOK_STRUCTURE_FIELDS).union( DEVICE_METADATA_FIELDS).union( CALIBRE_METADATA_FIELDS) - \ - frozenset(['title', 'title_sort', 'authors', - 'author_sort', 'author_sort_map' 'comments', - 'cover_data', 'tags', 'language', 'lpath', - 'size', 'thumbnail']) + SC_FIELDS_NOT_COPIED.union( + SC_FIELDS_COPY_NOT_NULL) SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( USER_METADATA_FIELDS).union( diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 7812f81180..8538ed886c 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -9,7 +9,8 @@ import copy import traceback from calibre import prints -from calibre.ebooks.metadata.book import COPYABLE_METADATA_FIELDS +from calibre.ebooks.metadata.book import SC_COPYABLE_FIELDS +from calibre.ebooks.metadata.book import SC_FIELDS_COPY_NOT_NULL from calibre.ebooks.metadata.book import STANDARD_METADATA_FIELDS from calibre.ebooks.metadata.book import TOP_LEVEL_CLASSIFIERS from calibre.utils.date import isoformat, format_date @@ -223,22 +224,23 @@ class Metadata(object): self.author_sort = other.author_sort if replace_metadata: - SPECIAL_FIELDS = frozenset(['lpath', 'size', 'comments', 'thumbnail']) - for attr in COPYABLE_METADATA_FIELDS: + # SPECIAL_FIELDS = frozenset(['lpath', 'size', 'comments', 'thumbnail']) + for attr in SC_COPYABLE_FIELDS: setattr(self, attr, getattr(other, attr, 1.0 if \ attr == 'series_index' else None)) self.tags = other.tags self.cover_data = getattr(other, 'cover_data', - NULL_VALUES['cover_data']) + NULL_VALUES['cover_data']) self.set_all_user_metadata(other.get_all_user_metadata(make_copy=True)) - for x in SPECIAL_FIELDS: + for x in SC_FIELDS_COPY_NOT_NULL: copy_not_none(self, other, x) # language is handled below else: - for attr in COPYABLE_METADATA_FIELDS: - if hasattr(other, attr): - copy_not_none(self, other, attr) - copy_not_none(self, other, 'thumbnail') + for attr in SC_COPYABLE_FIELDS: + copy_not_none(self, other, attr) + for x in SC_FIELDS_COPY_NOT_NULL: + copy_not_none(self, other, x) + if other.tags: # Case-insensitive but case preserving merging lotags = [t.lower() for t in other.tags] @@ -249,6 +251,7 @@ class Metadata(object): oidx = lotags.index(t) self.tags[sidx] = other.tags[oidx] self.tags += [t for t in other.tags if t.lower() in ot-st] + if getattr(other, 'cover_data', False): other_cover = other.cover_data[-1] self_cover = self.cover_data[-1] if self.cover_data else '' @@ -256,6 +259,7 @@ class Metadata(object): if not other_cover: other_cover = '' if len(other_cover) > len(self_cover): self.cover_data = other.cover_data + if getattr(other, 'user_metadata_keys', None): for x in other.user_metadata_keys: meta = other.get_user_metadata(x, make_copy=True) @@ -274,6 +278,7 @@ class Metadata(object): self_tags[sidx] = other.tags[oidx] self_tags += [t for t in other.tags if t.lower() in ot-st] setattr(self, x, self_tags) + my_comments = getattr(self, 'comments', '') other_comments = getattr(other, 'comments', '') if not my_comments: From a85be2ba3229f2e27221fb7f64d25a7e48977ab7 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 13 Sep 2010 11:59:45 +0100 Subject: [PATCH 033/412] Several changes: 1) allow use of unusual standard fields in get_collections. Format them appropriately 2) change metadata.book.base.format_field to handle standard fields. 3) add standard metadata access methods to metadata.book.base. --- src/calibre/devices/usbms/books.py | 18 +----- src/calibre/ebooks/metadata/book/base.py | 71 +++++++++++++++++++++--- src/calibre/gui2/library/models.py | 2 +- src/calibre/library/field_metadata.py | 17 ++++-- 4 files changed, 76 insertions(+), 32 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 3e13527bd0..2b19027df4 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -105,21 +105,7 @@ class CollectionsBookList(BookList): attr_name = '' elif attr_name != '': attr_name = '(%s)'%attr_name - - if attr not in cust_field_meta: - cat_name = '%s %s'%(category, attr_name) - else: - fm = cust_field_meta[attr] - if fm['datatype'] == 'bool': - if category: - cat_name = '%s %s'%(_('Yes'), attr_name) - else: - cat_name = '%s %s'%(_('No'), attr_name) - elif fm['datatype'] == 'datetime': - cat_name = '%s %s'%(format_date(category, - fm['display'].get('date_format','dd MMM yyyy')), attr_name) - else: - cat_name = '%s %s'%(category, attr_name) + cat_name = '%s %s'%(category, attr_name) return cat_name.strip() def get_collections(self, collection_attributes): @@ -156,7 +142,7 @@ class CollectionsBookList(BookList): cust_field_meta = book.get_all_user_metadata(make_copy=False) for attr in attrs: attr = attr.strip() - val = meta_vals.get(attr, None) + ign, val = book.format_field(attr, ignore_series_index=True) if not val: continue if isbytestring(val): val = val.decode(preferred_encoding, 'replace') diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 8538ed886c..6e0351353f 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -13,6 +13,7 @@ from calibre.ebooks.metadata.book import SC_COPYABLE_FIELDS from calibre.ebooks.metadata.book import SC_FIELDS_COPY_NOT_NULL from calibre.ebooks.metadata.book import STANDARD_METADATA_FIELDS from calibre.ebooks.metadata.book import TOP_LEVEL_CLASSIFIERS +from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import isoformat, format_date @@ -30,6 +31,8 @@ NULL_VALUES = { 'language' : 'und' } +field_metadata = FieldMetadata() + class Metadata(object): ''' @@ -112,6 +115,31 @@ class Metadata(object): _data = object.__getattribute__(self, '_data') return frozenset(_data['user_metadata'].iterkeys()) + def get_standard_metadata(self, field, make_copy): + ''' + return field metadata from the field if it is there. Otherwise return + None. field is the key name, not the label. Return a copy if requested, + just in case the user wants to change values in the dict. + ''' + if field in field_metadata and field_metadata[field]['kind'] == 'field': + if make_copy: + return copy.deepcopy(field_metadata[field]) + return field_metadata[field] + return None + + def get_all_standard_metadata(self, make_copy): + ''' + return a dict containing all the standard field metadata associated with + the book. + ''' + if not make_copy: + return field_metadata + res = {} + for k in field_metadata: + if field_metadata[k]['kind'] == 'field': + res[k] = copy.deepcopy(field_metadata[k]) + return res + def get_all_user_metadata(self, make_copy): ''' return a dict containing all the custom field metadata associated with @@ -315,24 +343,49 @@ class Metadata(object): def format_rating(self): return unicode(self.rating) - def format_custom_field(self, key): + def format_field(self, key, ignore_series_index=False): + from calibre.ebooks.metadata import authors_to_string ''' returns the tuple (field_name, formatted_value) ''' - cmeta = self.get_user_metadata(key, make_copy=False) - name = unicode(cmeta['name']) - res = self.get(key, None) - if res is not None: + if key in self.user_metadata_keys: + res = self.get(key, None) + if res is None or res == '': + return (None, None) + cmeta = self.get_user_metadata(key, make_copy=False) + name = unicode(cmeta['name']) datatype = cmeta['datatype'] if datatype == 'text' and cmeta['is_multiple']: res = u', '.join(res) elif datatype == 'series': - res = res + ' [%s]'%self.format_series_index(val=self.get_extra(key)) + if not ignore_series_index: + res = res + \ + ' [%s]'%self.format_series_index(val=self.get_extra(key)) elif datatype == 'datetime': res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': res = _('Yes') if res else _('No') - return (name, unicode(res)) + return (name, unicode(res)) + + if key in field_metadata and field_metadata[key]['kind'] == 'field': + res = self.get(key, None) + if res is None or res == '': + return (None, None) + fmeta = field_metadata[key] + name = unicode(fmeta['name']) + datatype = fmeta['datatype'] + if key == 'authors': + res = authors_to_string(res) + elif datatype == 'text' and fmeta['is_multiple']: + res = u', '.join(res) + elif datatype == 'series': + if not ignore_series_index: + res = res + ' [%s]'%self.format_series_index() + elif datatype == 'datetime': + res = format_date(res, fmeta['display'].get('date_format','dd MMM yyyy')) + return (name, unicode(res)) + + return (None, None) def __unicode__(self): from calibre.ebooks.metadata import authors_to_string @@ -371,7 +424,7 @@ class Metadata(object): for key in self.user_metadata_keys: val = self.get(key, None) if val is not None: - (name, val) = self.format_custom_field(key) + (name, val) = self.format_field(key) fmt(name, unicode(val)) return u'\n'.join(ans) @@ -396,7 +449,7 @@ class Metadata(object): for key in self.user_metadata_keys: val = self.get(key, None) if val is not None: - (name, val) = self.format_custom_field(key) + (name, val) = self.format_field(key) ans += [(name, val)] for i, x in enumerate(ans): ans[i] = u'%s%s'%x diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 09a28fb04e..5fa514ae8a 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -320,7 +320,7 @@ class BooksModel(QAbstractTableModel): # {{{ (sidx, prepare_string_for_xml(series)) mi = self.db.get_metadata(idx) for key in mi.user_metadata_keys: - name, val = mi.format_custom_field(key) + name, val = mi.format_field(key) if val is not None: data[name] = val return data diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 276a6ba971..2773f573b2 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -5,6 +5,7 @@ Created on 25 May 2010 ''' from calibre.utils.ordered_dict import OrderedDict +from calibre.utils.config import tweaks class TagsIcons(dict): ''' @@ -213,7 +214,7 @@ class FieldMetadata(dict): 'datatype':'text', 'is_multiple':None, 'kind':'field', - 'name':None, + 'name':_('On Device'), 'search_terms':['ondevice'], 'is_custom':False, 'is_category':False}), @@ -231,7 +232,7 @@ class FieldMetadata(dict): 'datatype':'datetime', 'is_multiple':None, 'kind':'field', - 'name':None, + 'name':_('Published'), 'search_terms':['pubdate'], 'is_custom':False, 'is_category':False}), @@ -258,7 +259,7 @@ class FieldMetadata(dict): 'datatype':'float', 'is_multiple':None, 'kind':'field', - 'name':None, + 'name':_('Size (MB)'), 'search_terms':['size'], 'is_custom':False, 'is_category':False}), @@ -267,7 +268,7 @@ class FieldMetadata(dict): 'datatype':'datetime', 'is_multiple':None, 'kind':'field', - 'name':None, + 'name':_('Date'), 'search_terms':['date'], 'is_custom':False, 'is_category':False}), @@ -276,7 +277,7 @@ class FieldMetadata(dict): 'datatype':'text', 'is_multiple':None, 'kind':'field', - 'name':None, + 'name':_('Title'), 'search_terms':['title'], 'is_custom':False, 'is_category':False}), @@ -310,6 +311,10 @@ class FieldMetadata(dict): self._tb_cats[k]['display'] = {} self._tb_cats[k]['is_editable'] = True self._add_search_terms_to_map(k, v['search_terms']) + self._tb_cats['timestamp']['display'] = { + 'date_format': tweaks['gui_timestamp_display_format']} + self._tb_cats['pubdate']['display'] = { + 'date_format': tweaks['gui_pubdate_display_format']} self.custom_field_prefix = '#' self.get = self._tb_cats.get @@ -410,7 +415,7 @@ class FieldMetadata(dict): if datatype == 'series': key += '_index' self._tb_cats[key] = {'table':None, 'column':None, - 'datatype':'float', 'is_multiple':False, + 'datatype':'float', 'is_multiple':None, 'kind':'field', 'name':'', 'search_terms':[key], 'label':label+'_index', 'colnum':None, 'display':{}, From 2a654f3062401e864cdd357850033ad05937f34e Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 14 Sep 2010 07:41:06 +0100 Subject: [PATCH 034/412] Fix stupidity in collectiions_management where I broke tag splitting --- src/calibre/devices/usbms/books.py | 4 +++- src/calibre/ebooks/metadata/book/base.py | 13 ++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index cf60f1311c..d25787fc89 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -141,7 +141,9 @@ class CollectionsBookList(BookList): cust_field_meta = book.get_all_user_metadata(make_copy=False) for attr in attrs: attr = attr.strip() - ign, val = book.format_field(attr, ignore_series_index=True) + ign, val = book.format_field(attr, + ignore_series_index=True, + return_multiples_as_list=True) if not val: continue if isbytestring(val): val = val.decode(preferred_encoding, 'replace') diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 6e0351353f..7405f20a7c 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -343,7 +343,8 @@ class Metadata(object): def format_rating(self): return unicode(self.rating) - def format_field(self, key, ignore_series_index=False): + def format_field(self, key, ignore_series_index=False, + return_multiples_as_list=False): from calibre.ebooks.metadata import authors_to_string ''' returns the tuple (field_name, formatted_value) @@ -356,7 +357,8 @@ class Metadata(object): name = unicode(cmeta['name']) datatype = cmeta['datatype'] if datatype == 'text' and cmeta['is_multiple']: - res = u', '.join(res) + if not return_multiples_as_list: + res = u', '.join(res) elif datatype == 'series': if not ignore_series_index: res = res + \ @@ -365,7 +367,7 @@ class Metadata(object): res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': res = _('Yes') if res else _('No') - return (name, unicode(res)) + return (name, res) if key in field_metadata and field_metadata[key]['kind'] == 'field': res = self.get(key, None) @@ -377,13 +379,14 @@ class Metadata(object): if key == 'authors': res = authors_to_string(res) elif datatype == 'text' and fmeta['is_multiple']: - res = u', '.join(res) + if not return_multiples_as_list: + res = u', '.join(res) elif datatype == 'series': if not ignore_series_index: res = res + ' [%s]'%self.format_series_index() elif datatype == 'datetime': res = format_date(res, fmeta['display'].get('date_format','dd MMM yyyy')) - return (name, unicode(res)) + return (name, res) return (None, None) From 6653fff4cd3228629c879e0e534024a9cc203fd2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Sep 2010 21:20:55 -0600 Subject: [PATCH 035/412] OPF serialization of user metadata --- .../ebooks/metadata/book/json_codec.py | 2 +- src/calibre/ebooks/metadata/opf2.py | 108 ++++++++++++++++-- 2 files changed, 98 insertions(+), 12 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index 51b9722803..2550089473 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -33,7 +33,7 @@ def encode_thumbnail(thumbnail): ''' if thumbnail is None: return None - if not isinstance(thumbnail, tuple): + if not isinstance(thumbnail, (tuple, list)): try: img = Image() img.load(thumbnail) diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index be8507f478..236b2fa18f 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' lxml based OPF parser. ''' -import re, sys, unittest, functools, os, mimetypes, uuid, glob, cStringIO +import re, sys, unittest, functools, os, mimetypes, uuid, glob, cStringIO, json from urllib import unquote from urlparse import urlparse @@ -20,8 +20,9 @@ from calibre.ebooks.metadata import string_to_authors, MetaInformation from calibre.ebooks.metadata.book.base import Metadata from calibre.utils.date import parse_date, isoformat from calibre.utils.localization import get_lang +from calibre import prints -class Resource(object): +class Resource(object): # {{{ ''' Represents a resource (usually a file on the filesystem or a URL pointing to the web. Such resources are commonly referred to in OPF files. @@ -102,8 +103,9 @@ class Resource(object): def __repr__(self): return 'Resource(%s, %s)'%(repr(self.path), repr(self.href())) +# }}} -class ResourceCollection(object): +class ResourceCollection(object): # {{{ def __init__(self): self._resources = [] @@ -154,10 +156,9 @@ class ResourceCollection(object): for res in self: res.set_basedir(path) +# }}} - - -class ManifestItem(Resource): +class ManifestItem(Resource): # {{{ @staticmethod def from_opf_manifest_item(item, basedir): @@ -195,8 +196,9 @@ class ManifestItem(Resource): return self.media_type raise IndexError('%d out of bounds.'%index) +# }}} -class Manifest(ResourceCollection): +class Manifest(ResourceCollection): # {{{ @staticmethod def from_opf_manifest_element(items, dir): @@ -263,7 +265,9 @@ class Manifest(ResourceCollection): if i.id == id: return i.mime_type -class Spine(ResourceCollection): +# }}} + +class Spine(ResourceCollection): # {{{ class Item(Resource): @@ -335,7 +339,9 @@ class Spine(ResourceCollection): for i in self: yield i.path -class Guide(ResourceCollection): +# }}} + +class Guide(ResourceCollection): # {{{ class Reference(Resource): @@ -372,6 +378,7 @@ class Guide(ResourceCollection): self[-1].type = type self[-1].title = '' +# }}} class MetadataField(object): @@ -413,7 +420,29 @@ class MetadataField(object): elem = obj.create_metadata_element(self.name, is_dc=self.is_dc) obj.set_text(elem, unicode(val)) -class OPF(object): + +def serialize_user_metadata(metadata_elem, all_user_metadata, tail='\n'+(' '*8)): + from calibre.utils.config import to_json + from calibre.ebooks.metadata.book.json_codec import object_to_unicode + + for name, fm in all_user_metadata.items(): + try: + fm = object_to_unicode(fm) + fm = json.dumps(fm, default=to_json, ensure_ascii=False) + except: + prints('Failed to write user metadata:', name) + import traceback + traceback.print_exc() + continue + meta = metadata_elem.makeelement('meta') + meta.set('name', 'calibre:user_metadata:'+name) + meta.set('content', fm) + meta.tail = tail + metadata_elem.append(meta) + + +class OPF(object): # {{{ + MIMETYPE = 'application/oebps-package+xml' PARSER = etree.XMLParser(recover=True) NAMESPACES = { @@ -498,6 +527,34 @@ class OPF(object): self.guide = Guide.from_opf_guide(guide, basedir) if guide else None self.cover_data = (None, None) self.find_toc() + self.read_user_metadata() + + def read_user_metadata(self): + self.user_metadata = {} + from calibre.utils.config import from_json + elems = self.root.xpath('//*[name() = "meta" and starts-with(@name,' + '"calibre:user_metadata:") and @content]') + for elem in elems: + name = elem.get('name') + name = ':'.join(name.split(':')[2:]) + if not name or not name.startswith('#'): + continue + fm = elem.get('content') + try: + fm = json.loads(fm, object_hook=from_json) + except: + prints('Failed to read user metadata:', name) + import traceback + traceback.print_exc() + continue + self.user_metadata[name] = fm + + + def write_user_metadata(self): + for elem in self.user_metadata_path(self.root): + elem.getparent().remove(elem) + serialize_user_metadata(self.metadata, + self.user_metadata) def find_toc(self): self.toc = None @@ -912,6 +969,7 @@ class OPF(object): return elem def render(self, encoding='utf-8'): + self.write_user_metadata() raw = etree.tostring(self.root, encoding=encoding, pretty_print=True) if not raw.lstrip().startswith('\n'%encoding.upper()+raw @@ -926,6 +984,7 @@ class OPF(object): if val is not None and val != [] and val != (None, None): setattr(self, attr, val) +# }}} class OPFCreator(Metadata): @@ -1116,6 +1175,8 @@ class OPFCreator(Metadata): item.set('title', ref.title) guide.append(item) + serialize_user_metadata(metadata, self.get_all_user_metadata(False)) + root = E.package( metadata, manifest, @@ -1218,6 +1279,8 @@ def metadata_to_opf(mi, as_string=True): if mi.title_sort: meta('title_sort', mi.title_sort) + serialize_user_metadata(metadata, mi.get_all_user_metadata(False)) + metadata[-1].tail = '\n' +(' '*4) if mi.cover: @@ -1335,5 +1398,28 @@ def suite(): def test(): unittest.TextTestRunner(verbosity=2).run(suite()) +def test_user_metadata(): + from cStringIO import StringIO + mi = Metadata('Test title', ['test author1', 'test author2']) + um = { + '#myseries': { '#value#': u'test series\xe4', 'datatype':'text', + 'is_multiple': False, 'name': u'My Series'}, + '#myseries_index': { '#value#': 2.45, 'datatype': 'float', + 'is_multiple': False} + } + mi.set_all_user_metadata(um) + raw = metadata_to_opf(mi) + opfc = OPFCreator(os.getcwd(), other=mi) + out = StringIO() + opfc.render(out) + raw2 = out.getvalue() + f = StringIO(raw) + opf = OPF(f) + f2 = StringIO(raw2) + opf2 = OPF(f2) + assert um == opf.user_metadata + assert um == opf2.user_metadata + print raw + if __name__ == '__main__': - test() + test_user_metadata() From 420db7851b8650ae7e61f2b441b9a7822dddbd8b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Sep 2010 21:50:06 -0600 Subject: [PATCH 036/412] Fix use of OPF class to generate a Metadata object and have OPF.smart_update also update user metadata --- src/calibre/customize/builtins.py | 3 +-- src/calibre/ebooks/conversion/plumber.py | 2 +- src/calibre/ebooks/metadata/cli.py | 2 +- src/calibre/ebooks/metadata/epub.py | 2 +- src/calibre/ebooks/metadata/lit.py | 3 +-- src/calibre/ebooks/metadata/meta.py | 2 +- src/calibre/ebooks/metadata/opf2.py | 24 +++++++++++++++++------- src/calibre/ebooks/mobi/reader.py | 2 +- src/calibre/ebooks/oeb/reader.py | 3 +-- src/calibre/gui2/add.py | 2 +- src/calibre/library/cli.py | 2 +- 11 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 68df832048..1ddb2843a1 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -226,8 +226,7 @@ class OPFMetadataReader(MetadataReaderPlugin): def get_metadata(self, stream, ftype): from calibre.ebooks.metadata.opf2 import OPF - from calibre.ebooks.metadata import MetaInformation - return MetaInformation(OPF(stream, os.getcwd())) + return OPF(stream, os.getcwd()).to_book_metadata() class PDBMetadataReader(MetadataReaderPlugin): diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index 16282dd28d..38e47f6bf7 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -692,7 +692,7 @@ OptionRecommendation(name='timestamp', self.opts.read_metadata_from_opf) opf = OPF(open(self.opts.read_metadata_from_opf, 'rb'), os.path.dirname(self.opts.read_metadata_from_opf)) - mi = MetaInformation(opf) + mi = opf.to_book_metadata() self.opts_to_mi(mi) if mi.cover: if mi.cover.startswith('http:') or mi.cover.startswith('https:'): diff --git a/src/calibre/ebooks/metadata/cli.py b/src/calibre/ebooks/metadata/cli.py index 780d3febcf..a0be187512 100644 --- a/src/calibre/ebooks/metadata/cli.py +++ b/src/calibre/ebooks/metadata/cli.py @@ -109,7 +109,7 @@ def do_set_metadata(opts, mi, stream, stream_type): from_opf = getattr(opts, 'from_opf', None) if from_opf is not None: from calibre.ebooks.metadata.opf2 import OPF - opf_mi = MetaInformation(OPF(open(from_opf, 'rb'))) + opf_mi = OPF(open(from_opf, 'rb')).to_book_metadata() mi.smart_update(opf_mi) for pref in config().option_set.preferences: diff --git a/src/calibre/ebooks/metadata/epub.py b/src/calibre/ebooks/metadata/epub.py index ac6b5feebe..8984a252a3 100644 --- a/src/calibre/ebooks/metadata/epub.py +++ b/src/calibre/ebooks/metadata/epub.py @@ -167,7 +167,7 @@ def get_metadata(stream, extract_cover=True): """ Return metadata as a :class:`Metadata` object """ stream.seek(0) reader = OCFZipReader(stream) - mi = MetaInformation(reader.opf) + mi = reader.opf.to_book_metadata() if extract_cover: try: cdata = get_cover(reader.opf, reader.opf_path, stream, reader=reader) diff --git a/src/calibre/ebooks/metadata/lit.py b/src/calibre/ebooks/metadata/lit.py index 1a267b6858..3be1f22632 100644 --- a/src/calibre/ebooks/metadata/lit.py +++ b/src/calibre/ebooks/metadata/lit.py @@ -6,7 +6,6 @@ Support for reading the metadata from a LIT file. import cStringIO, os -from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata.opf2 import OPF def get_metadata(stream): @@ -16,7 +15,7 @@ def get_metadata(stream): src = litfile.get_metadata().encode('utf-8') litfile = litfile._litfile opf = OPF(cStringIO.StringIO(src), os.getcwd()) - mi = MetaInformation(opf) + mi = opf.to_book_metadata() covers = [] for item in opf.iterguide(): if 'cover' not in item.get('type', '').lower(): diff --git a/src/calibre/ebooks/metadata/meta.py b/src/calibre/ebooks/metadata/meta.py index eae8171362..68deca5e10 100644 --- a/src/calibre/ebooks/metadata/meta.py +++ b/src/calibre/ebooks/metadata/meta.py @@ -194,7 +194,7 @@ def opf_metadata(opfpath): try: opf = OPF(f, os.path.dirname(opfpath)) if opf.application_id is not None: - mi = MetaInformation(opf) + mi = opf.to_book_metadata() if hasattr(opf, 'cover') and opf.cover: cpath = os.path.join(os.path.dirname(opfpath), opf.cover) if os.access(cpath, os.R_OK): diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 236b2fa18f..96f1fa4832 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -530,7 +530,7 @@ class OPF(object): # {{{ self.read_user_metadata() def read_user_metadata(self): - self.user_metadata = {} + self._user_metadata_ = {} from calibre.utils.config import from_json elems = self.root.xpath('//*[name() = "meta" and starts-with(@name,' '"calibre:user_metadata:") and @content]') @@ -547,14 +547,21 @@ class OPF(object): # {{{ import traceback traceback.print_exc() continue - self.user_metadata[name] = fm + self._user_metadata_[name] = fm + def to_book_metadata(self): + ans = MetaInformation(self) + for n, v in self._user_metadata_.items(): + ans.set_user_metadata(n, v) + return ans def write_user_metadata(self): - for elem in self.user_metadata_path(self.root): + elems = self.root.xpath('//*[name() = "meta" and starts-with(@name,' + '"calibre:user_metadata:") and @content]') + for elem in elems: elem.getparent().remove(elem) serialize_user_metadata(self.metadata, - self.user_metadata) + self._user_metadata_) def find_toc(self): self.toc = None @@ -983,6 +990,9 @@ class OPF(object): # {{{ val = getattr(mi, attr, None) if val is not None and val != [] and val != (None, None): setattr(self, attr, val) + temp = self.to_book_metadata() + temp.smart_update(mi, replace_metadata=replace_metadata) + self._user_metadata_ = temp.get_all_user_metadata(True) # }}} @@ -1417,9 +1427,9 @@ def test_user_metadata(): opf = OPF(f) f2 = StringIO(raw2) opf2 = OPF(f2) - assert um == opf.user_metadata - assert um == opf2.user_metadata - print raw + assert um == opf._user_metadata_ + assert um == opf2._user_metadata_ + print opf.render() if __name__ == '__main__': test_user_metadata() diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 2a35c7cb45..6a44c2aa77 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -441,7 +441,7 @@ class MobiReader(object): html.tostring(elem, encoding='utf-8') + '' stream = cStringIO.StringIO(raw) opf = OPF(stream) - self.embedded_mi = MetaInformation(opf) + self.embedded_mi = opf.to_book_metadata() if guide is not None: for ref in guide.xpath('descendant::reference'): if 'cover' in ref.get('type', '').lower(): diff --git a/src/calibre/ebooks/oeb/reader.py b/src/calibre/ebooks/oeb/reader.py index d7d7bbf725..559421326c 100644 --- a/src/calibre/ebooks/oeb/reader.py +++ b/src/calibre/ebooks/oeb/reader.py @@ -126,10 +126,9 @@ class OEBReader(object): def _metadata_from_opf(self, opf): from calibre.ebooks.metadata.opf2 import OPF - from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.oeb.transforms.metadata import meta_info_to_oeb_metadata stream = cStringIO.StringIO(etree.tostring(opf)) - mi = MetaInformation(OPF(stream)) + mi = OPF(stream).to_book_metadata() if not mi.language: mi.language = get_lang().replace('_', '-') self.oeb.metadata.add('language', mi.language) diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index 5b9fb35be3..9f246aeb93 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -138,7 +138,7 @@ class DBAdder(Thread): # {{{ self.critical[name] = open(opf, 'rb').read().decode('utf-8', 'replace') else: try: - mi = MetaInformation(OPF(opf)) + mi = OPF(opf).to_book_metadata() except: import traceback mi = MetaInformation('', [_('Unknown')]) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 9a2d0b0a62..cd4e472807 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -448,7 +448,7 @@ def command_show_metadata(args, dbpath): return 0 def do_set_metadata(db, id, stream): - mi = OPF(stream) + mi = OPF(stream).to_book_metadata() db.set_metadata(id, mi) db.clean() do_show_metadata(db, id, False) From 4bc7aa1b710e00bdefdd82bed915c8a977b2523e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Sep 2010 21:56:02 -0600 Subject: [PATCH 037/412] More robust reading of user metadata from OPF --- src/calibre/ebooks/metadata/opf2.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 96f1fa4832..ecbef3194d 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -531,6 +531,7 @@ class OPF(object): # {{{ def read_user_metadata(self): self._user_metadata_ = {} + temp = Metadata('x', ['x']) from calibre.utils.config import from_json elems = self.root.xpath('//*[name() = "meta" and starts-with(@name,' '"calibre:user_metadata:") and @content]') @@ -542,12 +543,13 @@ class OPF(object): # {{{ fm = elem.get('content') try: fm = json.loads(fm, object_hook=from_json) + temp.set_user_metadata(name, fm) except: prints('Failed to read user metadata:', name) import traceback traceback.print_exc() continue - self._user_metadata_[name] = fm + self._user_metadata_ = temp.get_all_user_metadata(True) def to_book_metadata(self): ans = MetaInformation(self) From 56023722709d35816424cd3c77f5afe972103d0c Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 16 Sep 2010 12:24:56 +0100 Subject: [PATCH 038/412] Minor changes to OPF testing --- src/calibre/ebooks/metadata/opf2.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index ecbef3194d..8a4ff6a5bd 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -1415,9 +1415,11 @@ def test_user_metadata(): mi = Metadata('Test title', ['test author1', 'test author2']) um = { '#myseries': { '#value#': u'test series\xe4', 'datatype':'text', - 'is_multiple': False, 'name': u'My Series'}, + 'is_multiple': None, 'name': u'My Series'}, '#myseries_index': { '#value#': 2.45, 'datatype': 'float', - 'is_multiple': False} + 'is_multiple': None}, + '#mytags': {'#value#':['t1','t2','t3'], 'datatype':'text', + 'is_multiple': '|', 'name': u'My Tags'} } mi.set_all_user_metadata(um) raw = metadata_to_opf(mi) From e1dd08acef1b14c73a3da542f974acd9a10a1f79 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 16 Sep 2010 14:02:49 +0100 Subject: [PATCH 039/412] Several changes: 1) Add an option to specify the time format when sending to device. This is the analog of the same option that already exists for save to disk. 2) refactor the format_field code. Remove the special parameters on format_field. Add format_field_extended that returns a 4-element tuple (name, formatted val, original val, field metadata). 3) change (simplify) usbms collections management to use new format_field_extended method. 4) change device.py to not call sync_booklists twice. 5) add the fix for gui-not-updating, in hopes that we can avoid merge conflicts --- src/calibre/devices/usbms/books.py | 21 +++++++-------- src/calibre/devices/usbms/device.py | 4 ++- src/calibre/ebooks/metadata/book/base.py | 33 ++++++++++++------------ src/calibre/gui2/actions/add.py | 2 +- src/calibre/gui2/device.py | 28 ++++++++++++-------- src/calibre/gui2/preferences/sending.py | 3 +++ src/calibre/gui2/preferences/sending.ui | 15 ++++++++++- src/calibre/library/save_to_disk.py | 3 +++ 8 files changed, 68 insertions(+), 41 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index d25787fc89..eab625f7be 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -94,12 +94,12 @@ class CollectionsBookList(BookList): def supports_collections(self): return True - def compute_category_name(self, attr, category, cust_field_meta): + def compute_category_name(self, attr, category, field_meta): renames = tweaks['sony_collection_renaming_rules'] attr_name = renames.get(attr, None) if attr_name is None: - if attr in cust_field_meta: - attr_name = '(%s)'%cust_field_meta[attr]['name'] + if field_meta['is_custom']: + attr_name = '(%s)'%field_meta['name'] else: attr_name = '' elif attr_name != '': @@ -138,23 +138,23 @@ class CollectionsBookList(BookList): # specified 'on_connect' attrs = collection_attributes meta_vals = book.get_all_non_none_attributes() - cust_field_meta = book.get_all_user_metadata(make_copy=False) for attr in attrs: attr = attr.strip() - ign, val = book.format_field(attr, - ignore_series_index=True, - return_multiples_as_list=True) + ign, val, orig_val, fm = book.format_field_extended(attr) if not val: continue if isbytestring(val): val = val.decode(preferred_encoding, 'replace') if isinstance(val, (list, tuple)): val = list(val) + elif fm['datatype'] == 'series': + val = [orig_val] + elif fm['datatype'] == 'text' and fm['is_multiple']: + val = orig_val else: val = [val] for category in val: is_series = False - if attr in cust_field_meta: # is a custom field - fm = cust_field_meta[attr] + if fm['is_custom']: # is a custom field if fm['datatype'] == 'text' and len(category) > 1 and \ category[0] == '[' and category[-1] == ']': continue @@ -168,8 +168,7 @@ class CollectionsBookList(BookList): ('series' in collection_attributes and meta_vals.get('series', None) == category): is_series = True - cat_name = self.compute_category_name(attr, category, - cust_field_meta) + cat_name = self.compute_category_name(attr, category, fm) if cat_name not in collections: collections[cat_name] = [] collections_lpaths[cat_name] = set() diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index b954911242..928d00ad4a 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -829,12 +829,14 @@ class Device(DeviceConfig, DevicePlugin): ext = os.path.splitext(fname)[1] from calibre.library.save_to_disk import get_components + from calibre.library.save_to_disk import config + opts = config().parse() if not isinstance(template, unicode): template = template.decode('utf-8') app_id = str(getattr(mdata, 'application_id', '')) # The db id will be in the created filename extra_components = get_components(template, mdata, fname, - length=250-len(app_id)-1) + timefmt=opts.send_timefmt, length=250-len(app_id)-1) if not extra_components: extra_components.append(sanitize(self.filename_callback(fname, mdata))) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 7405f20a7c..b252f518da 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -343,8 +343,11 @@ class Metadata(object): def format_rating(self): return unicode(self.rating) - def format_field(self, key, ignore_series_index=False, - return_multiples_as_list=False): + def format_field(self, key): + name, val, ign, ign = self.format_field_extended(key) + return (name, val) + + def format_field_extended(self, key): from calibre.ebooks.metadata import authors_to_string ''' returns the tuple (field_name, formatted_value) @@ -352,43 +355,41 @@ class Metadata(object): if key in self.user_metadata_keys: res = self.get(key, None) if res is None or res == '': - return (None, None) + return (None, None, None, None) + orig_res = res cmeta = self.get_user_metadata(key, make_copy=False) name = unicode(cmeta['name']) datatype = cmeta['datatype'] if datatype == 'text' and cmeta['is_multiple']: - if not return_multiples_as_list: - res = u', '.join(res) + res = u', '.join(res) elif datatype == 'series': - if not ignore_series_index: - res = res + \ - ' [%s]'%self.format_series_index(val=self.get_extra(key)) + res = res + \ + ' [%s]'%self.format_series_index(val=self.get_extra(key)) elif datatype == 'datetime': res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': res = _('Yes') if res else _('No') - return (name, res) + return (name, res, orig_res, cmeta) if key in field_metadata and field_metadata[key]['kind'] == 'field': res = self.get(key, None) if res is None or res == '': - return (None, None) + return (None, None, None, None) + orig_res = res fmeta = field_metadata[key] name = unicode(fmeta['name']) datatype = fmeta['datatype'] if key == 'authors': res = authors_to_string(res) elif datatype == 'text' and fmeta['is_multiple']: - if not return_multiples_as_list: - res = u', '.join(res) + res = u', '.join(res) elif datatype == 'series': - if not ignore_series_index: - res = res + ' [%s]'%self.format_series_index() + res = res + ' [%s]'%self.format_series_index() elif datatype == 'datetime': res = format_date(res, fmeta['display'].get('date_format','dd MMM yyyy')) - return (name, res) + return (name, res, orig_res, fmeta) - return (None, None) + return (None, None, None, None) def __unicode__(self): from calibre.ebooks.metadata import authors_to_string diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index add7bf1d5b..aa20b8bc16 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -230,7 +230,7 @@ class AddAction(InterfaceAction): self._files_added(paths, names, infos, on_card=on_card) # set the in-library flags, and as a consequence send the library's # metadata for this book to the device. This sets the uuid to the - # correct value. + # correct value. Note that set_books_in_library might sync_booklists self.gui.set_books_in_library(booklists=[model.db], reset=True) model.reset() diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index f839e1d519..196e97f2a3 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -745,6 +745,7 @@ class DeviceMixin(object): # {{{ if job.failed: self.device_job_exception(job) return + # set_books_in_library might schedule a sync_booklists job self.set_books_in_library(job.result, reset=True) mainlist, cardalist, cardblist = job.result self.memory_view.set_database(mainlist) @@ -789,11 +790,12 @@ class DeviceMixin(object): # {{{ self.device_manager.remove_books_from_metadata(paths, self.booklists()) model.paths_deleted(paths) - self.upload_booklists() # Force recomputation the library's ondevice info. We need to call # set_books_in_library even though books were not added because - # the deleted book might have been an exact match. - self.set_books_in_library(self.booklists(), reset=True) + # the deleted book might have been an exact match. Upload the booklists + # if set_books_in_library did not. + if not self.set_books_in_library(self.booklists(), reset=True): + self.upload_booklists() self.book_on_device(None, None, reset=True) # We need to reset the ondevice flags in the library. Use a big hammer, # so we don't need to worry about whether some succeeded or not. @@ -1280,8 +1282,6 @@ class DeviceMixin(object): # {{{ self.device_manager.add_books_to_metadata(job.result, metadata, self.booklists()) - self.upload_booklists() - books_to_be_deleted = [] if memory and memory[1]: books_to_be_deleted = memory[1] @@ -1291,12 +1291,15 @@ class DeviceMixin(object): # {{{ # book already there with a different book. This happens frequently in # news. When this happens, the book match indication will be wrong # because the UUID changed. Force both the device and the library view - # to refresh the flags. - self.set_books_in_library(self.booklists(), reset=True) + # to refresh the flags. Set_books_in_library could upload the booklists. + # If it does not, then do it here. + if not self.set_books_in_library(self.booklists(), reset=True): + self.upload_booklists() self.book_on_device(None, reset=True) self.refresh_ondevice_info(device_connected = True) - view = self.card_a_view if on_card == 'carda' else self.card_b_view if on_card == 'cardb' else self.memory_view + view = self.card_a_view if on_card == 'carda' else \ + self.card_b_view if on_card == 'cardb' else self.memory_view view.model().resort(reset=False) view.model().research() for f in files: @@ -1371,7 +1374,7 @@ class DeviceMixin(object): # {{{ try: db = self.library_view.model().db except: - return + return False # Build a cache (map) of the library, so the search isn't On**2 self.db_book_title_cache = {} self.db_book_uuid_cache = {} @@ -1466,10 +1469,13 @@ class DeviceMixin(object): # {{{ # Set author_sort if it isn't already asort = getattr(book, 'author_sort', None) if not asort and book.authors: - book.author_sort = self.library_view.model().db.author_sort_from_authors(book.authors) + book.author_sort = self.library_view.model().db.\ + author_sort_from_authors(book.authors) if update_metadata: if self.device_manager.is_device_connected: - self.device_manager.sync_booklists(None, booklists) + self.device_manager.sync_booklists( + Dispatcher(self.metadata_synced), booklists) + return update_metadata # }}} diff --git a/src/calibre/gui2/preferences/sending.py b/src/calibre/gui2/preferences/sending.py index 748c6b2a2d..ac4abbcf41 100644 --- a/src/calibre/gui2/preferences/sending.py +++ b/src/calibre/gui2/preferences/sending.py @@ -22,6 +22,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): r = self.register + for x in ('send_timefmt',): + r(x, self.proxy) + choices = [(_('Manual management'), 'manual'), (_('Only on send'), 'on_send'), (_('Automatic management'), 'on_connect')] diff --git a/src/calibre/gui2/preferences/sending.ui b/src/calibre/gui2/preferences/sending.ui index e064646afd..b9d1d1e1d2 100644 --- a/src/calibre/gui2/preferences/sending.ui +++ b/src/calibre/gui2/preferences/sending.ui @@ -80,7 +80,20 @@ - + + + + Format &dates as: + + + opt_send_timefmt + + + + + + + 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->Advanced->Plugins diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 3fa40c68b2..71850abcd5 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -84,6 +84,9 @@ def config(defaults=None): x('timefmt', default='%b, %Y', help=_('The format in which to display dates. %d - day, %b - month, ' '%Y - year. Default is: %b, %Y')) + x('send_timefmt', default='%b, %Y', + help=_('The format in which to display dates. %d - day, %b - month, ' + '%Y - year. Default is: %b, %Y')) x('to_lowercase', default=False, help=_('Convert paths to lowercase.')) x('replace_whitespace', default=False, From 4645138a67193537ba3e91fc3e4942017d72e1de Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 16 Sep 2010 16:03:07 +0100 Subject: [PATCH 040/412] 1) Re-enable syntactic validation of save templates. 2) fix row numbering on send_to_device preferences ui template. --- src/calibre/gui2/preferences/save_template.py | 37 +++++++++++-------- src/calibre/gui2/preferences/sending.ui | 2 +- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/calibre/gui2/preferences/save_template.py b/src/calibre/gui2/preferences/save_template.py index 26dc02f259..0dbee5bf21 100644 --- a/src/calibre/gui2/preferences/save_template.py +++ b/src/calibre/gui2/preferences/save_template.py @@ -8,8 +8,10 @@ __docformat__ = 'restructuredtext en' from PyQt4.Qt import QWidget, pyqtSignal +from calibre.gui2 import error_dialog from calibre.gui2.preferences.save_template_ui import Ui_Form -from calibre.library.save_to_disk import FORMAT_ARG_DESCS +from calibre.library.save_to_disk import FORMAT_ARG_DESCS, preprocess_template,\ + safe_format class SaveTemplate(QWidget, Ui_Form): @@ -24,8 +26,11 @@ class SaveTemplate(QWidget, Ui_Form): variables = sorted(FORMAT_ARG_DESCS.keys()) rows = [] for var in variables: - rows.append(u'%s%s'% + rows.append(u'%s %s'% (var, FORMAT_ARG_DESCS[var])) + rows.append(u'%s  %s'%( + _('Any custom field'), + _('The lookup name of any custom field. These names begin with "#")'))) table = u'%s
'%(u'\n'.join(rows)) self.template_variables.setText(table) @@ -39,21 +44,21 @@ class SaveTemplate(QWidget, Ui_Form): self.changed_signal.emit() def validate(self): - # TODO: NEWMETA: I haven't figured out how to get the custom columns - # into here, so for the moment make all templates valid. + ''' + Do a syntax check on the format string. Doing a semantic check + (verifying that the fields exist) is not useful in the presence of + custom fields, because they may or may not exist. + ''' + tmpl = preprocess_template(self.opt_template.text()) + fa = {} + try: + safe_format(tmpl, fa) + except Exception, err: + error_dialog(self, _('Invalid template'), + '

'+_('The template %s is invalid:')%tmpl + \ + '
'+str(err), show=True) + return False return True -# tmpl = preprocess_template(self.opt_template.text()) -# fa = {} -# for x in FORMAT_ARG_DESCS.keys(): -# fa[x]='random long string' -# try: -# tmpl.format(**fa) -# except Exception, err: -# error_dialog(self, _('Invalid template'), -# '

'+_('The template %s is invalid:')%tmpl + \ -# '
'+str(err), show=True) -# return False -# return True def set_value(self, val): self.opt_template.set_value(val) diff --git a/src/calibre/gui2/preferences/sending.ui b/src/calibre/gui2/preferences/sending.ui index b9d1d1e1d2..75b1899a3a 100644 --- a/src/calibre/gui2/preferences/sending.ui +++ b/src/calibre/gui2/preferences/sending.ui @@ -103,7 +103,7 @@ - + From 788128627459035cf0e87fc6b0baa4da708cef3d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Sep 2010 11:08:33 +0100 Subject: [PATCH 041/412] 1) add the composite field custom datatype 2) clean up content server code so it uses the new formatting facilities --- src/calibre/devices/usbms/books.py | 7 ++- src/calibre/ebooks/metadata/book/__init__.py | 7 ++- src/calibre/ebooks/metadata/book/base.py | 35 +++++++++--- src/calibre/gui2/library/models.py | 33 ++++++++++-- src/calibre/gui2/preferences/columns.py | 3 +- .../gui2/preferences/create_custom_column.py | 30 ++++++++--- .../gui2/preferences/create_custom_column.ui | 53 ++++++++++++++++++- src/calibre/library/custom_columns.py | 6 +-- src/calibre/library/database2.py | 1 + src/calibre/library/field_metadata.py | 2 +- src/calibre/library/server/mobile.py | 36 +++++-------- src/calibre/library/server/opds.py | 24 ++++----- src/calibre/library/server/xml.py | 40 ++++++-------- 13 files changed, 181 insertions(+), 96 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index eab625f7be..13fcb90b49 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -137,7 +137,6 @@ class CollectionsBookList(BookList): # For existing books, modify the collections only if the user # specified 'on_connect' attrs = collection_attributes - meta_vals = book.get_all_non_none_attributes() for attr in attrs: attr = attr.strip() ign, val, orig_val, fm = book.format_field_extended(attr) @@ -166,7 +165,7 @@ class CollectionsBookList(BookList): continue if attr == 'series' or \ ('series' in collection_attributes and - meta_vals.get('series', None) == category): + book.get('series', None) == category): is_series = True cat_name = self.compute_category_name(attr, category, fm) if cat_name not in collections: @@ -177,10 +176,10 @@ class CollectionsBookList(BookList): collections_lpaths[cat_name].add(lpath) if is_series: collections[cat_name].append( - (book, meta_vals.get(attr+'_index', sys.maxint))) + (book, book.get(attr+'_index', sys.maxint))) else: collections[cat_name].append( - (book, meta_vals.get('title_sort', 'zzzz'))) + (book, book.get('title_sort', 'zzzz'))) # Sort collections result = {} for category, books in collections.items(): diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index e087f8072d..e6dff9110b 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -81,9 +81,8 @@ DEVICE_METADATA_FIELDS = frozenset([ CALIBRE_METADATA_FIELDS = frozenset([ 'application_id', # An application id, currently set to the db_id. - # the calibre primary key of the item. 'db_id', # the calibre primary key of the item. - # TODO: NEWMETA: May want to remove once Sony's no longer use it + 'formats', # list of formats (extensions) for this book ] ) @@ -124,5 +123,5 @@ SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( PUBLICATION_METADATA_FIELDS).union( CALIBRE_METADATA_FIELDS).union( DEVICE_METADATA_FIELDS) - \ - frozenset(['device_collections']) - # device_collections is rebuilt when needed + frozenset(['device_collections', 'formats']) + # these are rebuilt when needed diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index b252f518da..31485dfe1b 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -5,8 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import copy -import traceback +import copy, re, string, traceback from calibre import prints from calibre.ebooks.metadata.book import SC_COPYABLE_FIELDS @@ -33,6 +32,23 @@ NULL_VALUES = { field_metadata = FieldMetadata() +class SafeFormat(string.Formatter): + ''' + Provides a format function that substitutes '' for any missing value + ''' + def get_value(self, key, args, mi): + ign, v = mi.format_field(key, series_with_index=False) + if v is None: + return '' + return v + +composite_formatter = SafeFormat() +compress_spaces = re.compile(r'\s+') + +def format_composite(x, mi): + ans = composite_formatter.vformat(x, [], mi).strip() + return compress_spaces.sub(' ', ans) + class Metadata(object): ''' @@ -343,18 +359,19 @@ class Metadata(object): def format_rating(self): return unicode(self.rating) - def format_field(self, key): - name, val, ign, ign = self.format_field_extended(key) + def format_field(self, key, series_with_index=True): + name, val, ign, ign = self.format_field_extended(key, series_with_index) return (name, val) - def format_field_extended(self, key): + def format_field_extended(self, key, series_with_index=True): from calibre.ebooks.metadata import authors_to_string ''' returns the tuple (field_name, formatted_value) ''' if key in self.user_metadata_keys: res = self.get(key, None) - if res is None or res == '': + cmeta = self.get_user_metadata(key, make_copy=False) + if cmeta['datatype'] != 'composite' and (res is None or res == ''): return (None, None, None, None) orig_res = res cmeta = self.get_user_metadata(key, make_copy=False) @@ -362,13 +379,15 @@ class Metadata(object): datatype = cmeta['datatype'] if datatype == 'text' and cmeta['is_multiple']: res = u', '.join(res) - elif datatype == 'series': + elif datatype == 'series' and series_with_index: res = res + \ ' [%s]'%self.format_series_index(val=self.get_extra(key)) elif datatype == 'datetime': res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': res = _('Yes') if res else _('No') + elif datatype == 'composite': + res = format_composite(cmeta['display']['composite_template'], self) return (name, res, orig_res, cmeta) if key in field_metadata and field_metadata[key]['kind'] == 'field': @@ -383,7 +402,7 @@ class Metadata(object): res = authors_to_string(res) elif datatype == 'text' and fmeta['is_multiple']: res = u', '.join(res) - elif datatype == 'series': + elif datatype == 'series' and series_with_index: res = res + ' [%s]'%self.format_series_index() elif datatype == 'datetime': res = format_date(res, fmeta['display'].get('date_format','dd MMM yyyy')) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index e9e688c93b..7839b89d7e 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -86,6 +86,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.last_search = '' # The last search performed on this model self.column_map = [] self.headers = {} + self.metadata_cache = {} self.alignment_map = {} self.buffer_size = buffer self.cover_cache = None @@ -114,6 +115,16 @@ class BooksModel(QAbstractTableModel): # {{{ def clear_caches(self): if self.cover_cache: self.cover_cache.clear_cache() + self.metadata_cache = {} + + def get_cached_metadata(self, idx): + if idx not in self.metadata_cache: + self.metadata_cache[idx] = self.db.get_metadata(idx) + return self.metadata_cache[idx] + + def remove_cached_metadata(self, idx): + if idx in self.metadata_cache: + del self.metadata_cache[idx] def read_config(self): self.use_roman_numbers = config['use_roman_numerals_for_series_number'] @@ -146,6 +157,7 @@ class BooksModel(QAbstractTableModel): # {{{ elif col in self.custom_columns: self.headers[col] = self.custom_columns[col]['name'] + self.metadata_cache = {} self.build_data_convertors() self.reset() self.database_changed.emit(db) @@ -159,11 +171,13 @@ class BooksModel(QAbstractTableModel): # {{{ db.add_listener(refresh_cover) def refresh_ids(self, ids, current_row=-1): + self.metadata_cache = {} rows = self.db.refresh_ids(ids) if rows: self.refresh_rows(rows, current_row=current_row) def refresh_rows(self, rows, current_row=-1): + self.metadata_cache = {} for row in rows: if row == current_row: self.new_bookdisplay_data.emit( @@ -193,6 +207,7 @@ class BooksModel(QAbstractTableModel): # {{{ return ret def count_changed(self, *args): + self.metadata_cache = {} self.count_changed_signal.emit(self.db.count()) def row_indices(self, index): @@ -262,6 +277,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.sorting_done.emit(self.db.index) def refresh(self, reset=True): + self.metadata_cache = {} self.db.refresh(field=None) self.resort(reset=reset) @@ -318,7 +334,7 @@ class BooksModel(QAbstractTableModel): # {{{ data[_('Series')] = \ _('Book %s of %s.')%\ (sidx, prepare_string_for_xml(series)) - mi = self.db.get_metadata(idx) + mi = self.get_cached_metadata(idx) for key in mi.user_metadata_keys: name, val = mi.format_field(key) if val is not None: @@ -327,6 +343,7 @@ class BooksModel(QAbstractTableModel): # {{{ def set_cache(self, idx): l, r = 0, self.count()-1 + self.remove_cached_metadata(idx) if self.cover_cache is not None: l = max(l, idx-self.buffer_size) r = min(r, idx+self.buffer_size) @@ -586,6 +603,10 @@ class BooksModel(QAbstractTableModel): # {{{ def number_type(r, idx=-1): return QVariant(self.db.data[r][idx]) + def composite_type(r, key=None): + mi = self.get_cached_metadata(r) + return QVariant(mi.format_field(key)[1]) + self.dc = { 'title' : functools.partial(text_type, idx=self.db.field_metadata['title']['rec_index'], mult=False), @@ -620,7 +641,8 @@ class BooksModel(QAbstractTableModel): # {{{ idx = self.custom_columns[col]['rec_index'] datatype = self.custom_columns[col]['datatype'] if datatype in ('text', 'comments'): - self.dc[col] = functools.partial(text_type, idx=idx, mult=self.custom_columns[col]['is_multiple']) + self.dc[col] = functools.partial(text_type, idx=idx, + mult=self.custom_columns[col]['is_multiple']) elif datatype in ('int', 'float'): self.dc[col] = functools.partial(number_type, idx=idx) elif datatype == 'datetime': @@ -628,13 +650,15 @@ class BooksModel(QAbstractTableModel): # {{{ elif datatype == 'bool': self.dc[col] = functools.partial(bool_type, idx=idx) self.dc_decorator[col] = functools.partial( - bool_type_decorator, idx=idx, - bool_cols_are_tristate=tweaks['bool_custom_columns_are_tristate'] == 'yes') + bool_type_decorator, idx=idx, + bool_cols_are_tristate=tweaks['bool_custom_columns_are_tristate'] == 'yes') elif datatype == 'rating': self.dc[col] = functools.partial(rating_type, idx=idx) elif datatype == 'series': self.dc[col] = functools.partial(series_type, idx=idx, siix=self.db.field_metadata.cc_series_index_column_for(col)) + elif datatype == 'composite': + self.dc[col] = functools.partial(composite_type, key=col) else: print 'What type is this?', col, datatype # build a index column to data converter map, to remove the string lookup in the data loop @@ -729,6 +753,7 @@ class BooksModel(QAbstractTableModel): # {{{ if role == Qt.EditRole: row, col = index.row(), index.column() column = self.column_map[col] + self.remove_cached_metadata(row) if self.is_custom_column(column): if not self.set_custom_column_data(row, column, value): return False diff --git a/src/calibre/gui2/preferences/columns.py b/src/calibre/gui2/preferences/columns.py index c1b9230f42..761a9880b1 100644 --- a/src/calibre/gui2/preferences/columns.py +++ b/src/calibre/gui2/preferences/columns.py @@ -155,7 +155,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): name=self.custcols[c]['name'], datatype=self.custcols[c]['datatype'], is_multiple=self.custcols[c]['is_multiple'], - display = self.custcols[c]['display']) + display = self.custcols[c]['display'], + editable = self.custcols[c]['editable']) must_restart = True elif '*deleteme' in self.custcols[c]: db.delete_custom_column(label=self.custcols[c]['label']) diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index e8ab8707e2..4b21301ccd 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -38,6 +38,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): 'is_multiple':False}, 8:{'datatype':'bool', 'text':_('Yes/No'), 'is_multiple':False}, + 8:{'datatype':'composite', + 'text':_('Field built from other fields'), 'is_multiple':False}, } def __init__(self, parent, editing, standard_colheads, standard_colnames): @@ -86,6 +88,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): if ct == 'datetime': if c['display'].get('date_format', None): self.date_format_box.setText(c['display'].get('date_format', '')) + elif ct == 'composite': + self.composite_box.setText(c['display'].get('composite_template', '')) self.datatype_changed() self.exec_() @@ -94,9 +98,10 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): col_type = self.column_types[self.column_type_box.currentIndex()]['datatype'] except: col_type = None - df_visible = col_type == 'datetime' for x in ('box', 'default_label', 'label'): - getattr(self, 'date_format_'+x).setVisible(df_visible) + getattr(self, 'date_format_'+x).setVisible(col_type == 'datetime') + for x in ('box', 'default_label', 'label'): + getattr(self, 'composite_'+x).setVisible(col_type == 'composite') def accept(self): @@ -122,6 +127,7 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): bad_col = True if bad_col: return self.simple_error('', _('The lookup name %s is already used')%col) + bad_head = False for t in self.parent.custcols: if self.parent.custcols[t]['name'] == col_heading: @@ -133,12 +139,20 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): if bad_head: return self.simple_error('', _('The heading %s is already used')%col_heading) - date_format = {} + display_dict = {} if col_type == 'datetime': if self.date_format_box.text(): - date_format = {'date_format':unicode(self.date_format_box.text())} + display_dict = {'date_format':unicode(self.date_format_box.text())} else: - date_format = {'date_format': None} + display_dict = {'date_format': None} + + if col_type == 'composite': + if not self.composite_box.text(): + return self.simple_error('', _('You must enter a template for composite fields')%col_heading) + display_dict = {'composite_template':unicode(self.composite_box.text())} + is_editable = False + else: + is_editable = True db = self.parent.gui.library_view.model().db key = db.field_metadata.custom_field_prefix+col @@ -148,8 +162,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): 'label':col, 'name':col_heading, 'datatype':col_type, - 'editable':True, - 'display':date_format, + 'editable':is_editable, + 'display':display_dict, 'normalized':None, 'colnum':None, 'is_multiple':is_multiple, @@ -164,7 +178,7 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): item.setText(col_heading) self.parent.custcols[self.orig_column_name]['label'] = col self.parent.custcols[self.orig_column_name]['name'] = col_heading - self.parent.custcols[self.orig_column_name]['display'].update(date_format) + self.parent.custcols[self.orig_column_name]['display'].update(display_dict) self.parent.custcols[self.orig_column_name]['*edited'] = True self.parent.custcols[self.orig_column_name]['*must_restart'] = True QDialog.accept(self) diff --git a/src/calibre/gui2/preferences/create_custom_column.ui b/src/calibre/gui2/preferences/create_custom_column.ui index 5cb9494845..640becca8c 100644 --- a/src/calibre/gui2/preferences/create_custom_column.ui +++ b/src/calibre/gui2/preferences/create_custom_column.ui @@ -147,9 +147,59 @@ + + + + + + + 0 + 0 + + + + <p>Field template. Uses the same syntax as save templates. + + + + + + + Similar to save templates. For example, {title} {isbn} + + + Default: (nothing) + + + + + + + + + &Template + + + composite_box + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + - + Qt::Horizontal @@ -184,6 +234,7 @@ column_heading_box column_type_box date_format_box + composite_box button_box diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index 4ba664dadc..d74024280e 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -18,7 +18,7 @@ from calibre.utils.date import parse_date class CustomColumns(object): CUSTOM_DATA_TYPES = frozenset(['rating', 'text', 'comments', 'datetime', - 'int', 'float', 'bool', 'series']) + 'int', 'float', 'bool', 'series', 'composite']) def custom_table_names(self, num): return 'custom_column_%d'%num, 'books_custom_column_%d_link'%num @@ -540,7 +540,7 @@ class CustomColumns(object): if datatype not in self.CUSTOM_DATA_TYPES: raise ValueError('%r is not a supported data type'%datatype) normalized = datatype not in ('datetime', 'comments', 'int', 'bool', - 'float') + 'float', 'composite') is_multiple = is_multiple and datatype in ('text',) num = self.conn.execute( ('INSERT INTO ' @@ -551,7 +551,7 @@ class CustomColumns(object): if datatype in ('rating', 'int'): dt = 'INT' - elif datatype in ('text', 'comments', 'series'): + elif datatype in ('text', 'comments', 'series', 'composite'): dt = 'TEXT' elif datatype in ('float',): dt = 'REAL' diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 9e9e75a26e..d06d217b76 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -538,6 +538,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.pubdate = self.pubdate(idx, index_is_id=index_is_id) mi.uuid = self.uuid(idx, index_is_id=index_is_id) mi.title_sort = self.title_sort(idx, index_is_id=index_is_id) + mi.formats = self.formats(idx, index_is_id=index_is_id).split(',') tags = self.tags(idx, index_is_id=index_is_id) if tags: mi.tags = [i.strip() for i in tags.split(',')] diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 2773f573b2..dcdfcfd9d6 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -68,7 +68,7 @@ class FieldMetadata(dict): ''' VALID_DATA_TYPES = frozenset([None, 'rating', 'text', 'comments', 'datetime', - 'int', 'float', 'bool', 'series']) + 'int', 'float', 'bool', 'series', 'composite']) # Builtin metadata {{{ diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index ab5b39eed8..8e7c75b0ac 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -228,29 +228,19 @@ class MobileServer(object): for key in CKEYS: def concat(name, val): return '%s:#:%s'%(name, unicode(val)) - val = record[CFM[key]['rec_index']] - if val: - datatype = CFM[key]['datatype'] - if datatype in ['comments']: - continue - name = CFM[key]['name'] - if datatype == 'text' and CFM[key]['is_multiple']: - book[key] = concat(name, - format_tag_string(val, '|', - no_tag_count=True)) - elif datatype == 'series': - book[key] = concat(name, '%s [%s]'%(val, - fmt_sidx(record[CFM.cc_series_index_column_for(key)]))) - elif datatype == 'datetime': - book[key] = concat(name, - format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy'))) - elif datatype == 'bool': - if val: - book[key] = concat(name, __builtin__._('Yes')) - else: - book[key] = concat(name, __builtin__._('No')) - else: - book[key] = concat(name, val) + mi = self.db.get_metadata(record[CFM['id']['rec_index']], index_is_id=True) + name, val = mi.format_field(key) + if val is None: + continue + datatype = CFM[key]['datatype'] + if datatype in ['comments']: + continue + if datatype == 'text' and CFM[key]['is_multiple']: + book[key] = concat(name, + format_tag_string(val, ',', + no_tag_count=True)) + else: + book[key] = concat(name, val) updated = self.db.last_modified() diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index e495598a2f..0eb7379ac5 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -132,7 +132,8 @@ def CATALOG_GROUP_ENTRY(item, category, base_href, version, updated): link ) -def ACQUISITION_ENTRY(item, version, FM, updated, CFM, CKEYS): +def ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS): + FM = db.FIELD_MAP title = item[FM['title']] if not title: title = _('Unknown') @@ -157,22 +158,16 @@ def ACQUISITION_ENTRY(item, version, FM, updated, CFM, CKEYS): (series, fmt_sidx(float(item[FM['series_index']])))) for key in CKEYS: - val = item[CFM[key]['rec_index']] + mi = db.get_metadata(item[CFM['id']['rec_index']], index_is_id=True) + name, val = mi.format_field(key) if val is not None: - name = CFM[key]['name'] datatype = CFM[key]['datatype'] if datatype == 'text' and CFM[key]['is_multiple']: - extra.append('%s: %s
'%(name, format_tag_string(val, '|', + extra.append('%s: %s
'%(name, format_tag_string(val, ',', ignore_max=True, no_tag_count=True))) - elif datatype == 'series': - extra.append('%s: %s [%s]
'%(name, val, - fmt_sidx(item[CFM.cc_series_index_column_for(key)]))) - elif datatype == 'datetime': - extra.append('%s: %s
'%(name, - format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy')))) else: - extra.append('%s: %s
' % (CFM[key]['name'], val)) + extra.append('%s: %s
'%(name, val)) comments = item[FM['comments']] if comments: comments = comments_to_html(comments) @@ -280,13 +275,14 @@ class NavFeed(Feed): class AcquisitionFeed(NavFeed): def __init__(self, updated, id_, items, offsets, page_url, up_url, version, - FM, CFM): + db): NavFeed.__init__(self, id_, updated, version, offsets, page_url, up_url) + CFM = db.field_metadata CKEYS = [key for key in sorted(CFM.get_custom_fields(), cmp=lambda x,y: cmp(CFM[x]['name'].lower(), CFM[y]['name'].lower()))] for item in items: - self.root.append(ACQUISITION_ENTRY(item, version, FM, updated, + self.root.append(ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS)) class CategoryFeed(NavFeed): @@ -384,7 +380,7 @@ class OPDSServer(object): cherrypy.response.headers['Last-Modified'] = self.last_modified(updated) cherrypy.response.headers['Content-Type'] = 'application/atom+xml;profile=opds-catalog' return str(AcquisitionFeed(updated, id_, items, offsets, - page_url, up_url, version, self.db.FIELD_MAP, self.db.field_metadata)) + page_url, up_url, version, self.db)) def opds_search(self, query=None, version=0, offset=0): try: diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py index 8715dda7d0..7f5bc31e70 100644 --- a/src/calibre/library/server/xml.py +++ b/src/calibre/library/server/xml.py @@ -102,31 +102,21 @@ class XMLServer(object): for key in CKEYS: def concat(name, val): return '%s:#:%s'%(name, unicode(val)) - val = record[CFM[key]['rec_index']] - if val: - datatype = CFM[key]['datatype'] - if datatype in ['comments']: - continue - k = str('CF_'+key[1:]) - name = CFM[key]['name'] - custcols.append(k) - if datatype == 'text' and CFM[key]['is_multiple']: - kwargs[k] = concat('#T#'+name, - format_tag_string(val,'|', - ignore_max=True)) - elif datatype == 'series': - kwargs[k] = concat(name, '%s [%s]'%(val, - fmt_sidx(record[CFM.cc_series_index_column_for(key)]))) - elif datatype == 'datetime': - kwargs[k] = concat(name, - format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy'))) - elif datatype == 'bool': - if val: - kwargs[k] = concat(name, __builtin__._('Yes')) - else: - kwargs[k] = concat(name, __builtin__._('No')) - else: - kwargs[k] = concat(name, val) + mi = self.db.get_metadata(record[CFM['id']['rec_index']], index_is_id=True) + name, val = mi.format_field(key) + if not val: + continue + datatype = CFM[key]['datatype'] + if datatype in ['comments']: + continue + k = str('CF_'+key[1:]) + name = CFM[key]['name'] + custcols.append(k) + if datatype == 'text' and CFM[key]['is_multiple']: + kwargs[k] = concat('#T#'+name, format_tag_string(val,',', + ignore_max=True)) + else: + kwargs[k] = concat(name, val) kwargs['custcols'] = ','.join(custcols) books.append(E.book(c, **kwargs)) From 83fc5b2cc0452533cdcdc342d8ce21e3ab5501a4 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Sep 2010 11:38:51 +0100 Subject: [PATCH 042/412] Small cleanup of composite field code. --- src/calibre/ebooks/metadata/book/base.py | 12 ++++++++---- src/calibre/gui2/library/models.py | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 31485dfe1b..ce6e2ee78d 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -46,7 +46,10 @@ composite_formatter = SafeFormat() compress_spaces = re.compile(r'\s+') def format_composite(x, mi): - ans = composite_formatter.vformat(x, [], mi).strip() + try: + ans = composite_formatter.vformat(x, [], mi).strip() + except: + ans = x return compress_spaces.sub(' ', ans) class Metadata(object): @@ -86,7 +89,10 @@ class Metadata(object): except AttributeError: pass if field in _data['user_metadata'].iterkeys(): - return _data['user_metadata'][field]['#value#'] + d = _data['user_metadata'][field] + if d['datatype'] != 'composite': + return d['#value#'] + return format_composite(d['display']['composite_template'], self) raise AttributeError( 'Metadata object has no attribute named: '+ repr(field)) @@ -386,8 +392,6 @@ class Metadata(object): res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': res = _('Yes') if res else _('No') - elif datatype == 'composite': - res = format_composite(cmeta['display']['composite_template'], self) return (name, res, orig_res, cmeta) if key in field_metadata and field_metadata[key]['kind'] == 'field': diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 7839b89d7e..2a116f6f3d 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -605,7 +605,7 @@ class BooksModel(QAbstractTableModel): # {{{ def composite_type(r, key=None): mi = self.get_cached_metadata(r) - return QVariant(mi.format_field(key)[1]) + return QVariant(mi.get(key, '')) self.dc = { 'title' : functools.partial(text_type, From c59545a96a968488221f494fcee0baccab642a63 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Sep 2010 13:45:01 +0100 Subject: [PATCH 043/412] Change composites to use the cache correctly, so that searches & sorts used. In the process, remove the metadata cache from models.py. Fix some bugs introduced by composite columns: 1) no edit widget in bulk_metadata edit 2) explicitly do not make a delegate in views.py --- src/calibre/gui2/custom_column_widgets.py | 2 ++ src/calibre/gui2/library/models.py | 28 ++--------------------- src/calibre/gui2/library/views.py | 3 +++ src/calibre/library/caches.py | 20 +++++++++++++++- src/calibre/library/database2.py | 11 ++++----- 5 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 67ab94d29a..d16233be1a 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -348,6 +348,8 @@ def populate_metadata_page(layout, db, book_id, bulk=False, two_column=False, pa ans = [] column = row = comments_row = 0 for col in cols: + if not x[col]['editable']: + continue dt = x[col]['datatype'] if dt == 'comments': continue diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 2a116f6f3d..be1bf9bc2d 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -86,7 +86,6 @@ class BooksModel(QAbstractTableModel): # {{{ self.last_search = '' # The last search performed on this model self.column_map = [] self.headers = {} - self.metadata_cache = {} self.alignment_map = {} self.buffer_size = buffer self.cover_cache = None @@ -115,16 +114,6 @@ class BooksModel(QAbstractTableModel): # {{{ def clear_caches(self): if self.cover_cache: self.cover_cache.clear_cache() - self.metadata_cache = {} - - def get_cached_metadata(self, idx): - if idx not in self.metadata_cache: - self.metadata_cache[idx] = self.db.get_metadata(idx) - return self.metadata_cache[idx] - - def remove_cached_metadata(self, idx): - if idx in self.metadata_cache: - del self.metadata_cache[idx] def read_config(self): self.use_roman_numbers = config['use_roman_numerals_for_series_number'] @@ -157,7 +146,6 @@ class BooksModel(QAbstractTableModel): # {{{ elif col in self.custom_columns: self.headers[col] = self.custom_columns[col]['name'] - self.metadata_cache = {} self.build_data_convertors() self.reset() self.database_changed.emit(db) @@ -171,13 +159,11 @@ class BooksModel(QAbstractTableModel): # {{{ db.add_listener(refresh_cover) def refresh_ids(self, ids, current_row=-1): - self.metadata_cache = {} rows = self.db.refresh_ids(ids) if rows: self.refresh_rows(rows, current_row=current_row) def refresh_rows(self, rows, current_row=-1): - self.metadata_cache = {} for row in rows: if row == current_row: self.new_bookdisplay_data.emit( @@ -207,7 +193,6 @@ class BooksModel(QAbstractTableModel): # {{{ return ret def count_changed(self, *args): - self.metadata_cache = {} self.count_changed_signal.emit(self.db.count()) def row_indices(self, index): @@ -277,7 +262,6 @@ class BooksModel(QAbstractTableModel): # {{{ self.sorting_done.emit(self.db.index) def refresh(self, reset=True): - self.metadata_cache = {} self.db.refresh(field=None) self.resort(reset=reset) @@ -334,7 +318,7 @@ class BooksModel(QAbstractTableModel): # {{{ data[_('Series')] = \ _('Book %s of %s.')%\ (sidx, prepare_string_for_xml(series)) - mi = self.get_cached_metadata(idx) + mi = self.db.get_metadata(idx) for key in mi.user_metadata_keys: name, val = mi.format_field(key) if val is not None: @@ -343,7 +327,6 @@ class BooksModel(QAbstractTableModel): # {{{ def set_cache(self, idx): l, r = 0, self.count()-1 - self.remove_cached_metadata(idx) if self.cover_cache is not None: l = max(l, idx-self.buffer_size) r = min(r, idx+self.buffer_size) @@ -603,10 +586,6 @@ class BooksModel(QAbstractTableModel): # {{{ def number_type(r, idx=-1): return QVariant(self.db.data[r][idx]) - def composite_type(r, key=None): - mi = self.get_cached_metadata(r) - return QVariant(mi.get(key, '')) - self.dc = { 'title' : functools.partial(text_type, idx=self.db.field_metadata['title']['rec_index'], mult=False), @@ -640,7 +619,7 @@ class BooksModel(QAbstractTableModel): # {{{ for col in self.custom_columns: idx = self.custom_columns[col]['rec_index'] datatype = self.custom_columns[col]['datatype'] - if datatype in ('text', 'comments'): + if datatype in ('text', 'comments', 'composite'): self.dc[col] = functools.partial(text_type, idx=idx, mult=self.custom_columns[col]['is_multiple']) elif datatype in ('int', 'float'): @@ -657,8 +636,6 @@ class BooksModel(QAbstractTableModel): # {{{ elif datatype == 'series': self.dc[col] = functools.partial(series_type, idx=idx, siix=self.db.field_metadata.cc_series_index_column_for(col)) - elif datatype == 'composite': - self.dc[col] = functools.partial(composite_type, key=col) else: print 'What type is this?', col, datatype # build a index column to data converter map, to remove the string lookup in the data loop @@ -753,7 +730,6 @@ class BooksModel(QAbstractTableModel): # {{{ if role == Qt.EditRole: row, col = index.row(), index.column() column = self.column_map[col] - self.remove_cached_metadata(row) if self.is_custom_column(column): if not self.set_custom_column_data(row, column, value): return False diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index d67d286aeb..9951edf21b 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -391,6 +391,9 @@ class BooksView(QTableView): # {{{ self.setItemDelegateForColumn(cm.index(colhead), self.cc_bool_delegate) elif cc['datatype'] == 'rating': self.setItemDelegateForColumn(cm.index(colhead), self.rating_delegate) + elif cc['datatype'] == 'composite': + pass + # no delegate for composite columns, as they are not editable else: dattr = colhead+'_delegate' delegate = colhead if hasattr(self, dattr) else 'text' diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 4f795ab733..a013d23cb9 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -121,6 +121,11 @@ class ResultCache(SearchQueryParser): self.build_date_relop_dict() self.build_numeric_relop_dict() + self.composites = [] + for key in field_metadata: + if field_metadata[key]['datatype'] == 'composite': + self.composites.append((key, field_metadata[key]['rec_index'])) + def __getitem__(self, row): return self._data[self._map_filtered[row]] @@ -372,7 +377,7 @@ class ResultCache(SearchQueryParser): if len(self.field_metadata[x]['search_terms']): db_col[x] = self.field_metadata[x]['rec_index'] if self.field_metadata[x]['datatype'] not in \ - ['text', 'comments', 'series']: + ['composite', 'text', 'comments', 'series']: exclude_fields.append(db_col[x]) col_datatype[db_col[x]] = self.field_metadata[x]['datatype'] is_multiple_cols[db_col[x]] = self.field_metadata[x]['is_multiple'] @@ -534,6 +539,10 @@ class ResultCache(SearchQueryParser): self._data[id] = db.conn.get('SELECT * from meta2 WHERE id=?', (id,))[0] self._data[id].append(db.has_cover(id, index_is_id=True)) self._data[id].append(db.book_on_device_string(id)) + if len(self.composites) > 0: + mi = db.get_metadata(id, index_is_id=True) + for k,c in self.composites: + self._data[id][c] = mi.format_field(k)[1] except IndexError: return None try: @@ -550,6 +559,10 @@ class ResultCache(SearchQueryParser): self._data[id] = db.conn.get('SELECT * from meta2 WHERE id=?', (id,))[0] self._data[id].append(db.has_cover(id, index_is_id=True)) self._data[id].append(db.book_on_device_string(id)) + if len(self.composites) > 0: + mi = db.get_metadata(id, index_is_id=True) + for k,c in self.composites: + self._data[id][c] = mi.format_field(k)[1] self._map[0:0] = ids self._map_filtered[0:0] = ids @@ -575,6 +588,11 @@ class ResultCache(SearchQueryParser): if item is not None: item.append(db.has_cover(item[0], index_is_id=True)) item.append(db.book_on_device_string(item[0])) + if len(self.composites) > 0: + mi = db.get_metadata(item[0], index_is_id=True) + for k,c in self.composites: + item[c] = mi.format_field(k)[1] + self._map = [i[0] for i in self._data if i is not None] if field is not None: self.sort(field, ascending) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index d06d217b76..d51a8a62c0 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -323,12 +323,6 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.has_id = self.data.has_id self.count = self.data.count - self.refresh_ondevice = functools.partial(self.data.refresh_ondevice, self) - - self.refresh() - self.last_update_check = self.last_modified() - - for prop in ('author_sort', 'authors', 'comment', 'comments', 'isbn', 'publisher', 'rating', 'series', 'series_index', 'tags', 'title', 'timestamp', 'uuid', 'pubdate', 'ondevice'): @@ -337,6 +331,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): setattr(self, 'title_sort', functools.partial(self.get_property, loc=self.FIELD_MAP['sort'])) + self.refresh_ondevice = functools.partial(self.data.refresh_ondevice, self) + self.refresh() + self.last_update_check = self.last_modified() + + def initialize_database(self): metadata_sqlite = open(P('metadata_sqlite.sql'), 'rb').read() self.conn.executescript(metadata_sqlite) From ed7597ae5f142998c3444f1ad941725fa4d21b0d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 18 Sep 2010 19:40:44 +0100 Subject: [PATCH 044/412] Playing with search & replace. Added 'global' template values to the replace expression. Also fixed some problems with exceptions, and problems with case-insensitive matching in the history boxes. --- src/calibre/ebooks/metadata/book/base.py | 9 +++ src/calibre/gui2/dialogs/metadata_bulk.py | 68 +++++++++++++++++++---- 2 files changed, 66 insertions(+), 11 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index ce6e2ee78d..1eae2e5326 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -12,6 +12,7 @@ from calibre.ebooks.metadata.book import SC_COPYABLE_FIELDS from calibre.ebooks.metadata.book import SC_FIELDS_COPY_NOT_NULL from calibre.ebooks.metadata.book import STANDARD_METADATA_FIELDS from calibre.ebooks.metadata.book import TOP_LEVEL_CLASSIFIERS +from calibre.ebooks.metadata.book import ALL_METADATA_FIELDS from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import isoformat, format_date @@ -131,6 +132,14 @@ class Metadata(object): def set(self, field, val, extra=None): self.__setattr__(field, val, extra) + @property + def all_keys(self): + ''' + All attribute keys known by this instance, even if their value is None + ''' + _data = object.__getattribute__(self, '_data') + return frozenset(ALL_METADATA_FIELDS.union(_data['user_metadata'].iterkeys())) + @property def user_metadata_keys(self): 'The set of user metadata names this object knows about' diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index b7d1d0c54b..1fb889757f 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -4,15 +4,15 @@ __copyright__ = '2008, Kovid Goyal ' '''Dialog to edit metadata in bulk''' from threading import Thread -import re +import re, string -from PyQt4.Qt import QDialog, QGridLayout +from PyQt4.Qt import Qt, QDialog, QGridLayout from PyQt4 import QtGui from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.ebooks.metadata import string_to_authors, \ - authors_to_string + authors_to_string, MetaInformation from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre.gui2.dialogs.progress import BlockingBusy from calibre.gui2 import error_dialog, Dispatcher @@ -99,6 +99,26 @@ class Worker(Thread): self.callback() +class SafeFormat(string.Formatter): + ''' + Provides a format function that substitutes '' for any missing value + ''' + def get_value(self, key, args, vals): + v = vals.get(key, None) + if v is None: + return '' + if isinstance(v, (tuple, list)): + v = ','.join(v) + return v + +composite_formatter = SafeFormat() + +def format_composite(x, mi): + try: + ans = composite_formatter.vformat(x, [], mi).strip() + except: + ans = x + return ans class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): @@ -163,7 +183,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.s_r_number_of_books = min(7, len(self.ids)) for i in range(1,self.s_r_number_of_books+1): w = QtGui.QLabel(self.tabWidgetPage3) - w.setText(_('Book %d:'%i)) + w.setText(_('Book %d:')%i) self.gridLayout1.addWidget(w, i+offset, 0, 1, 1) w = QtGui.QLineEdit(self.tabWidgetPage3) w.setReadOnly(True) @@ -205,6 +225,10 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.test_text.editTextChanged[str].connect(self.s_r_paint_results) self.central_widget.setCurrentIndex(0) + self.search_for.completer().setCaseSensitivity(Qt.CaseSensitive) + self.replace_with.completer().setCaseSensitivity(Qt.CaseSensitive) + + def s_r_field_changed(self, txt): txt = unicode(txt) for i in range(0, self.s_r_number_of_books): @@ -220,6 +244,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): if val: val.sort(cmp=lambda x,y: cmp(x.lower(), y.lower())) val = val[0] + if txt == 'authors': + val = val.replace('|', ',') else: val = '' else: @@ -239,37 +265,55 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): for i in range(0,self.s_r_number_of_books): getattr(self, 'book_%d_result'%(i+1)).setText('') + field_match_re = re.compile(r'(^|[^\\])(\\g<)([^>]+)(>)') + def s_r_func(self, match): - rf = self.s_r_functions[unicode(self.replace_func.currentText())] - rv = unicode(self.replace_with.text()) - val = match.expand(rv) - return rf(val) + rfunc = self.s_r_functions[unicode(self.replace_func.currentText())] + rtext = unicode(self.replace_with.text()) + mi_data = self.mi.get_all_non_none_attributes() + + def fm_func(m): + try: + if m.group(3) not in self.mi.all_keys: return m.group(0) + else: return '%s{%s}'%(m.group(1), m.group(3)) + except: + import traceback + traceback.print_exc() + return m.group(0) + + rtext = re.sub(self.field_match_re, fm_func, rtext) + rtext = match.expand(rtext) + rtext = format_composite(rtext, mi_data) + return rfunc(rtext) def s_r_paint_results(self, txt): self.s_r_error = None self.s_r_set_colors() try: self.s_r_obj = re.compile(unicode(self.search_for.text())) - except re.error as e: + except Exception as e: self.s_r_obj = None self.s_r_error = e self.s_r_set_colors() return try: + self.mi = MetaInformation(None, None) self.test_result.setText(self.s_r_obj.sub(self.s_r_func, unicode(self.test_text.text()))) - except re.error as e: + except Exception as e: self.s_r_error = e self.s_r_set_colors() return for i in range(0,self.s_r_number_of_books): + id = self.ids[i] + self.mi = self.db.get_metadata(id, index_is_id=True) wt = getattr(self, 'book_%d_text'%(i+1)) wr = getattr(self, 'book_%d_result'%(i+1)) try: wr.setText(self.s_r_obj.sub(self.s_r_func, unicode(wt.text()))) - except re.error as e: + except Exception as e: self.s_r_error = e self.s_r_set_colors() break @@ -303,6 +347,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): # The standard tags and authors values want to be lists. # All custom columns are to be strings val = fm['is_multiple'].join(val) + elif field == 'authors': + val = [v.replace('|', ',') for v in val] else: val = apply_pattern(val) From 3f763407a02f5c00599bdbe43f053a821fb0a3e3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 18 Sep 2010 20:37:59 -0600 Subject: [PATCH 045/412] Refactor to use new field formatting infrastructure of Metadata class --- src/calibre/devices/usbms/books.py | 7 ++-- src/calibre/ebooks/metadata/book/__init__.py | 7 ++-- src/calibre/ebooks/metadata/book/base.py | 12 +++--- src/calibre/library/database2.py | 1 + src/calibre/library/server/mobile.py | 36 +++++++----------- src/calibre/library/server/opds.py | 25 +++++------- src/calibre/library/server/xml.py | 40 ++++++++------------ 7 files changed, 51 insertions(+), 77 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index eab625f7be..13fcb90b49 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -137,7 +137,6 @@ class CollectionsBookList(BookList): # For existing books, modify the collections only if the user # specified 'on_connect' attrs = collection_attributes - meta_vals = book.get_all_non_none_attributes() for attr in attrs: attr = attr.strip() ign, val, orig_val, fm = book.format_field_extended(attr) @@ -166,7 +165,7 @@ class CollectionsBookList(BookList): continue if attr == 'series' or \ ('series' in collection_attributes and - meta_vals.get('series', None) == category): + book.get('series', None) == category): is_series = True cat_name = self.compute_category_name(attr, category, fm) if cat_name not in collections: @@ -177,10 +176,10 @@ class CollectionsBookList(BookList): collections_lpaths[cat_name].add(lpath) if is_series: collections[cat_name].append( - (book, meta_vals.get(attr+'_index', sys.maxint))) + (book, book.get(attr+'_index', sys.maxint))) else: collections[cat_name].append( - (book, meta_vals.get('title_sort', 'zzzz'))) + (book, book.get('title_sort', 'zzzz'))) # Sort collections result = {} for category, books in collections.items(): diff --git a/src/calibre/ebooks/metadata/book/__init__.py b/src/calibre/ebooks/metadata/book/__init__.py index e087f8072d..e6dff9110b 100644 --- a/src/calibre/ebooks/metadata/book/__init__.py +++ b/src/calibre/ebooks/metadata/book/__init__.py @@ -81,9 +81,8 @@ DEVICE_METADATA_FIELDS = frozenset([ CALIBRE_METADATA_FIELDS = frozenset([ 'application_id', # An application id, currently set to the db_id. - # the calibre primary key of the item. 'db_id', # the calibre primary key of the item. - # TODO: NEWMETA: May want to remove once Sony's no longer use it + 'formats', # list of formats (extensions) for this book ] ) @@ -124,5 +123,5 @@ SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union( PUBLICATION_METADATA_FIELDS).union( CALIBRE_METADATA_FIELDS).union( DEVICE_METADATA_FIELDS) - \ - frozenset(['device_collections']) - # device_collections is rebuilt when needed + frozenset(['device_collections', 'formats']) + # these are rebuilt when needed diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index b252f518da..8868709db2 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -343,26 +343,26 @@ class Metadata(object): def format_rating(self): return unicode(self.rating) - def format_field(self, key): - name, val, ign, ign = self.format_field_extended(key) + def format_field(self, key, series_with_index=True): + name, val, ign, ign = self.format_field_extended(key, series_with_index) return (name, val) - def format_field_extended(self, key): + def format_field_extended(self, key, series_with_index=True): from calibre.ebooks.metadata import authors_to_string ''' returns the tuple (field_name, formatted_value) ''' if key in self.user_metadata_keys: res = self.get(key, None) + cmeta = self.get_user_metadata(key, make_copy=False) if res is None or res == '': return (None, None, None, None) orig_res = res - cmeta = self.get_user_metadata(key, make_copy=False) name = unicode(cmeta['name']) datatype = cmeta['datatype'] if datatype == 'text' and cmeta['is_multiple']: res = u', '.join(res) - elif datatype == 'series': + elif datatype == 'series' and series_with_index: res = res + \ ' [%s]'%self.format_series_index(val=self.get_extra(key)) elif datatype == 'datetime': @@ -383,7 +383,7 @@ class Metadata(object): res = authors_to_string(res) elif datatype == 'text' and fmeta['is_multiple']: res = u', '.join(res) - elif datatype == 'series': + elif datatype == 'series' and series_with_index: res = res + ' [%s]'%self.format_series_index() elif datatype == 'datetime': res = format_date(res, fmeta['display'].get('date_format','dd MMM yyyy')) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 9e9e75a26e..d06d217b76 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -538,6 +538,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.pubdate = self.pubdate(idx, index_is_id=index_is_id) mi.uuid = self.uuid(idx, index_is_id=index_is_id) mi.title_sort = self.title_sort(idx, index_is_id=index_is_id) + mi.formats = self.formats(idx, index_is_id=index_is_id).split(',') tags = self.tags(idx, index_is_id=index_is_id) if tags: mi.tags = [i.strip() for i in tags.split(',')] diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index ab5b39eed8..8e7c75b0ac 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -228,29 +228,19 @@ class MobileServer(object): for key in CKEYS: def concat(name, val): return '%s:#:%s'%(name, unicode(val)) - val = record[CFM[key]['rec_index']] - if val: - datatype = CFM[key]['datatype'] - if datatype in ['comments']: - continue - name = CFM[key]['name'] - if datatype == 'text' and CFM[key]['is_multiple']: - book[key] = concat(name, - format_tag_string(val, '|', - no_tag_count=True)) - elif datatype == 'series': - book[key] = concat(name, '%s [%s]'%(val, - fmt_sidx(record[CFM.cc_series_index_column_for(key)]))) - elif datatype == 'datetime': - book[key] = concat(name, - format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy'))) - elif datatype == 'bool': - if val: - book[key] = concat(name, __builtin__._('Yes')) - else: - book[key] = concat(name, __builtin__._('No')) - else: - book[key] = concat(name, val) + mi = self.db.get_metadata(record[CFM['id']['rec_index']], index_is_id=True) + name, val = mi.format_field(key) + if val is None: + continue + datatype = CFM[key]['datatype'] + if datatype in ['comments']: + continue + if datatype == 'text' and CFM[key]['is_multiple']: + book[key] = concat(name, + format_tag_string(val, ',', + no_tag_count=True)) + else: + book[key] = concat(name, val) updated = self.db.last_modified() diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index e495598a2f..d495f58fa1 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -20,7 +20,6 @@ from calibre.library.comments import comments_to_html from calibre.library.server.utils import format_tag_string from calibre import guess_type from calibre.utils.ordered_dict import OrderedDict -from calibre.utils.date import format_date BASE_HREFS = { 0 : '/stanza', @@ -132,7 +131,8 @@ def CATALOG_GROUP_ENTRY(item, category, base_href, version, updated): link ) -def ACQUISITION_ENTRY(item, version, FM, updated, CFM, CKEYS): +def ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS): + FM = db.FIELD_MAP title = item[FM['title']] if not title: title = _('Unknown') @@ -157,22 +157,16 @@ def ACQUISITION_ENTRY(item, version, FM, updated, CFM, CKEYS): (series, fmt_sidx(float(item[FM['series_index']])))) for key in CKEYS: - val = item[CFM[key]['rec_index']] + mi = db.get_metadata(item[CFM['id']['rec_index']], index_is_id=True) + name, val = mi.format_field(key) if val is not None: - name = CFM[key]['name'] datatype = CFM[key]['datatype'] if datatype == 'text' and CFM[key]['is_multiple']: - extra.append('%s: %s
'%(name, format_tag_string(val, '|', + extra.append('%s: %s
'%(name, format_tag_string(val, ',', ignore_max=True, no_tag_count=True))) - elif datatype == 'series': - extra.append('%s: %s [%s]
'%(name, val, - fmt_sidx(item[CFM.cc_series_index_column_for(key)]))) - elif datatype == 'datetime': - extra.append('%s: %s
'%(name, - format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy')))) else: - extra.append('%s: %s
' % (CFM[key]['name'], val)) + extra.append('%s: %s
'%(name, val)) comments = item[FM['comments']] if comments: comments = comments_to_html(comments) @@ -280,13 +274,14 @@ class NavFeed(Feed): class AcquisitionFeed(NavFeed): def __init__(self, updated, id_, items, offsets, page_url, up_url, version, - FM, CFM): + db): NavFeed.__init__(self, id_, updated, version, offsets, page_url, up_url) + CFM = db.field_metadata CKEYS = [key for key in sorted(CFM.get_custom_fields(), cmp=lambda x,y: cmp(CFM[x]['name'].lower(), CFM[y]['name'].lower()))] for item in items: - self.root.append(ACQUISITION_ENTRY(item, version, FM, updated, + self.root.append(ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS)) class CategoryFeed(NavFeed): @@ -384,7 +379,7 @@ class OPDSServer(object): cherrypy.response.headers['Last-Modified'] = self.last_modified(updated) cherrypy.response.headers['Content-Type'] = 'application/atom+xml;profile=opds-catalog' return str(AcquisitionFeed(updated, id_, items, offsets, - page_url, up_url, version, self.db.FIELD_MAP, self.db.field_metadata)) + page_url, up_url, version, self.db)) def opds_search(self, query=None, version=0, offset=0): try: diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py index 8715dda7d0..7f5bc31e70 100644 --- a/src/calibre/library/server/xml.py +++ b/src/calibre/library/server/xml.py @@ -102,31 +102,21 @@ class XMLServer(object): for key in CKEYS: def concat(name, val): return '%s:#:%s'%(name, unicode(val)) - val = record[CFM[key]['rec_index']] - if val: - datatype = CFM[key]['datatype'] - if datatype in ['comments']: - continue - k = str('CF_'+key[1:]) - name = CFM[key]['name'] - custcols.append(k) - if datatype == 'text' and CFM[key]['is_multiple']: - kwargs[k] = concat('#T#'+name, - format_tag_string(val,'|', - ignore_max=True)) - elif datatype == 'series': - kwargs[k] = concat(name, '%s [%s]'%(val, - fmt_sidx(record[CFM.cc_series_index_column_for(key)]))) - elif datatype == 'datetime': - kwargs[k] = concat(name, - format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy'))) - elif datatype == 'bool': - if val: - kwargs[k] = concat(name, __builtin__._('Yes')) - else: - kwargs[k] = concat(name, __builtin__._('No')) - else: - kwargs[k] = concat(name, val) + mi = self.db.get_metadata(record[CFM['id']['rec_index']], index_is_id=True) + name, val = mi.format_field(key) + if not val: + continue + datatype = CFM[key]['datatype'] + if datatype in ['comments']: + continue + k = str('CF_'+key[1:]) + name = CFM[key]['name'] + custcols.append(k) + if datatype == 'text' and CFM[key]['is_multiple']: + kwargs[k] = concat('#T#'+name, format_tag_string(val,',', + ignore_max=True)) + else: + kwargs[k] = concat(name, val) kwargs['custcols'] = ','.join(custcols) books.append(E.book(c, **kwargs)) From 7eaf417bb10e9d87038b47941c524ea9aa121ad2 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 19 Sep 2010 07:47:03 +0100 Subject: [PATCH 046/412] Fix content server tags display problem --- resources/content_server/gui.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/content_server/gui.js b/resources/content_server/gui.js index afc21137e1..bd0743a854 100644 --- a/resources/content_server/gui.js +++ b/resources/content_server/gui.js @@ -84,7 +84,10 @@ function render_book(book) { } title += '' title += '' title += '

'+_('The template %s is invalid:')%tmpl + \ diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 71850abcd5..d5300d93e9 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -113,7 +113,10 @@ class SafeFormat(string.Formatter): safe_formatter = SafeFormat() def safe_format(x, format_args): - ans = safe_formatter.vformat(x, [], format_args).strip() + try: + ans = safe_formatter.vformat(x, [], format_args).strip() + except: + ans = '' return re.sub(r'\s+', ' ', ans) def get_components(template, mi, id, timefmt='%b %Y', length=250, From 89f64db891cfbc3c1ab276c87dc2eb8e826edb56 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 20 Sep 2010 09:51:04 +0100 Subject: [PATCH 056/412] Field interface, including refactoring (renaming) some existing methods. --- src/calibre/ebooks/metadata/book/base.py | 88 +++++++++++++++-------- src/calibre/gui2/dialogs/metadata_bulk.py | 4 +- src/calibre/gui2/library/models.py | 2 +- src/calibre/gui2/ui.py | 3 + src/calibre/library/caches.py | 2 +- src/calibre/library/database2.py | 36 ++++++++++ src/calibre/library/field_metadata.py | 46 +++++------- src/calibre/library/save_to_disk.py | 2 +- src/calibre/library/server/content.py | 2 +- 9 files changed, 123 insertions(+), 62 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 7b8eb07908..3d6d6b1bb8 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -138,20 +138,66 @@ class Metadata(object): def set(self, field, val, extra=None): self.__setattr__(field, val, extra) - @property - def all_keys(self): + # field-oriented interface. Intended to be the same as in LibraryDatabase + + def standard_field_keys(self): ''' - All attribute keys known by this instance, even if their value is None + return a list of all possible keys, even if this book doesn't have them + ''' + return STANDARD_METADATA_FIELDS + + def custom_field_keys(self): + ''' + return a list of the custom fields in this book + ''' + return object.__getattribute__(self, '_data')['user_metadata'].iterkeys() + + def all_field_keys(self): + ''' + All field keys known by this instance, even if their value is None ''' _data = object.__getattribute__(self, '_data') return frozenset(ALL_METADATA_FIELDS.union(_data['user_metadata'].iterkeys())) - @property + def metadata_for_field(self, key): + ''' + return metadata describing a standard or custom field. + ''' + if key in self.user_metadata_keys(): + return self.get_standard_metadata(self, key, make_copy=False) + return self.get_user_metadata(key, make_copy=False) + def user_metadata_keys(self): - 'The set of user metadata names this object knows about' + ''' + Return the standard keys actually in this book. + ''' _data = object.__getattribute__(self, '_data') return frozenset(_data['user_metadata'].iterkeys()) + def all_non_none_fields(self): + ''' + Return a dictionary containing all non-None metadata fields, including + the custom ones. + ''' + result = {} + _data = object.__getattribute__(self, '_data') + for attr in STANDARD_METADATA_FIELDS: + v = _data.get(attr, None) + if v is not None: + result[attr] = v + for attr in _data['user_metadata'].iterkeys(): + v = _data['user_metadata'][attr]['#value#'] + if v is not None: + result[attr] = v + if _data['user_metadata'][attr]['datatype'] == 'series': + result[attr+'_index'] = _data['user_metadata'][attr]['#extra#'] + return result + + # End of field-oriented interface + + # Extended interfaces. These permit one to get copies of metadata dictionaries, and to + # get and set custom field metadata + def get_standard_metadata(self, field, make_copy): ''' return field metadata from the field if it is there. Otherwise return @@ -237,30 +283,11 @@ class Metadata(object): _data = object.__getattribute__(self, '_data') _data['user_metadata'][field] = metadata - def get_all_non_none_attributes(self): - ''' - Return a dictionary containing all non-None metadata fields, including - the custom ones. - ''' - result = {} - _data = object.__getattribute__(self, '_data') - for attr in STANDARD_METADATA_FIELDS: - v = _data.get(attr, None) - if v is not None: - result[attr] = v - for attr in _data['user_metadata'].iterkeys(): - v = _data['user_metadata'][attr]['#value#'] - if v is not None: - result[attr] = v - if _data['user_metadata'][attr]['datatype'] == 'series': - result[attr+'_index'] = _data['user_metadata'][attr]['#extra#'] - return result - # Old Metadata API {{{ def print_all_attributes(self): for x in STANDARD_METADATA_FIELDS: prints('%s:'%x, getattr(self, x, 'None')) - for x in self.user_metadata_keys: + for x in self.user_metadata_keys(): meta = self.get_user_metadata(x, make_copy=False) if meta is not None: prints(x, meta) @@ -326,7 +353,7 @@ class Metadata(object): self.cover_data = other.cover_data if getattr(other, 'user_metadata_keys', None): - for x in other.user_metadata_keys: + for x in other.user_metadata_keys(): meta = other.get_user_metadata(x, make_copy=True) if meta is not None: self_tags = self.get(x, []) @@ -389,7 +416,7 @@ class Metadata(object): ''' returns the tuple (field_name, formatted_value) ''' - if key in self.user_metadata_keys: + if key in self.user_metadata_keys(): res = self.get(key, None) cmeta = self.get_user_metadata(key, make_copy=False) if cmeta['datatype'] != 'composite' and (res is None or res == ''): @@ -432,6 +459,9 @@ class Metadata(object): return (None, None, None, None) + def expand_template(self, template): + return format_composite(template, self) + def __unicode__(self): from calibre.ebooks.metadata import authors_to_string ans = [] @@ -466,7 +496,7 @@ class Metadata(object): fmt('Published', isoformat(self.pubdate)) if self.rights is not None: fmt('Rights', unicode(self.rights)) - for key in self.user_metadata_keys: + for key in self.user_metadata_keys(): val = self.get(key, None) if val is not None: (name, val) = self.format_field(key) @@ -491,7 +521,7 @@ class Metadata(object): ans += [(_('Published'), unicode(self.pubdate.isoformat(' ')))] if self.rights is not None: ans += [(_('Rights'), unicode(self.rights))] - for key in self.user_metadata_keys: + for key in self.user_metadata_keys(): val = self.get(key, None) if val is not None: (name, val) = self.format_field(key) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 1fb889757f..83cf6278e5 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -270,11 +270,11 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): def s_r_func(self, match): rfunc = self.s_r_functions[unicode(self.replace_func.currentText())] rtext = unicode(self.replace_with.text()) - mi_data = self.mi.get_all_non_none_attributes() + mi_data = self.mi.all_non_none_fields() def fm_func(m): try: - if m.group(3) not in self.mi.all_keys: return m.group(0) + if m.group(3) not in self.mi.all_field_keys(): return m.group(0) else: return '%s{%s}'%(m.group(1), m.group(3)) except: import traceback diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index be1bf9bc2d..6941869e44 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -319,7 +319,7 @@ class BooksModel(QAbstractTableModel): # {{{ _('Book %s of %s.')%\ (sidx, prepare_string_for_xml(series)) mi = self.db.get_metadata(idx) - for key in mi.user_metadata_keys: + for key in mi.user_metadata_keys(): name, val = mi.format_field(key) if val is not None: data[name] = val diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index f8d50d1cd2..647e31ff51 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -533,6 +533,9 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ # Save the current field_metadata for applications like calibre2opds # Goes here, because if cf is valid, db is valid. db.prefs['field_metadata'] = db.field_metadata.all_metadata() + if db.gm_count > 0: + print 'get_metadata cache: {0:d} calls, {1:4.2f}% misses'.format( + db.gm_count, (db.gm_missed*100.0)/db.gm_count) for action in self.iactions.values(): if not action.shutting_down(): return diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 770a362a1d..5f7fbdccc9 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -621,7 +621,7 @@ class ResultCache(SearchQueryParser): def multisort(self, fields=[], subsort=False): fields = [(self.sanitize_sort_field_name(x), bool(y)) for x, y in fields] - keys = self.field_metadata.sortable_keys() + keys = self.field_metadata.sortable_field_keys() fields = [x for x in fields if x[0] in keys] if subsort and 'sort' not in [x[0] for x in fields]: fields += [('sort', True)] diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 106b498ee8..f5a474edbc 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -325,6 +325,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.has_id = self.data.has_id self.count = self.data.count + # Count times get_metadata is called, and how many times in the cache + self.gm_count = 0 + self.gm_missed = 0 + for prop in ('author_sort', 'authors', 'comment', 'comments', 'isbn', 'publisher', 'rating', 'series', 'series_index', 'tags', 'title', 'timestamp', 'uuid', 'pubdate', 'ondevice'): @@ -520,15 +524,47 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): f.close() return ans + ### The field-style interface. These use field keys. + + def get_field(self, idx, key, default=None, index_is_id=False): + mi = self.get_metadata(idx, index_is_id=index_is_id, get_cover=True) + try: + return mi[key] + except: + return default + + def standard_field_keys(self): + return self.field_metadata.standard_field_keys() + + def custom_field_keys(self): + return self.field_metadata.custom_field_keys() + + def all_field_keys(self): + return self.field_metadata.all_field_keys() + + def sortable_field_keys(self): + return self.field_metadata.sortable_field_keys() + + def searchable_fields(self): + return self.field_metadata.searchable_field_keys() + + def search_term_to_field_key(self, term): + return self.field_metadata.search_term_to_key(term) + + def metadata_for_field(self, key): + return self.field_metadata[key] + def get_metadata(self, idx, index_is_id=False, get_cover=False): ''' Convenience method to return metadata as a :class:`Metadata` object. ''' + self.gm_count += 1 mi = self.data.get(idx, self.FIELD_MAP['all_metadata'], row_is_id = index_is_id) if mi is not None: return mi + self.gm_missed += 1 mi = Metadata(None) self.data.set(idx, self.FIELD_MAP['all_metadata'], mi, row_is_id = index_is_id) diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index e4a4f5270d..a8031e5172 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -348,11 +348,24 @@ class FieldMetadata(dict): def keys(self): return self._tb_cats.keys() - def sortable_keys(self): + def sortable_field_keys(self): return [k for k in self._tb_cats.keys() if self._tb_cats[k]['kind']=='field' and self._tb_cats[k]['datatype'] is not None] + def standard_field_keys(self): + return [k for k in self._tb_cats.keys() + if self._tb_cats[k]['kind']=='field' and + not self._tb_cats[k]['is_custom']] + + def custom_field_keys(self): + return [k for k in self._tb_cats.keys() + if self._tb_cats[k]['kind']=='field' and + self._tb_cats[k]['is_custom']] + + def all_field_keys(self): + return [k for k in self._tb_cats.keys() if self._tb_cats[k]['kind']=='field'] + def iterkeys(self): for key in self._tb_cats: yield key @@ -474,36 +487,10 @@ class FieldMetadata(dict): key = self.custom_field_prefix+label self._tb_cats[key]['rec_index'] = index # let the exception fly ... - -# DEFAULT_LOCATIONS = frozenset([ -# 'all', -# 'author', # compatibility -# 'authors', -# 'comment', # compatibility -# 'comments', -# 'cover', -# 'date', -# 'format', # compatibility -# 'formats', -# 'isbn', -# 'ondevice', -# 'pubdate', -# 'publisher', -# 'search', -# 'series', -# 'rating', -# 'tag', # compatibility -# 'tags', -# 'title', -# ]) - def get_search_terms(self): s_keys = sorted(self._search_term_map.keys()) for v in self.search_items: s_keys.append(v) -# if set(s_keys) != self.DEFAULT_LOCATIONS: -# print 'search labels and default_locations do not match:' -# print set(s_keys) ^ self.DEFAULT_LOCATIONS return s_keys def _add_search_terms_to_map(self, key, terms): @@ -518,3 +505,8 @@ class FieldMetadata(dict): if term in self._search_term_map: return self._search_term_map[term] return term + + def searchable_field_keys(self): + return [k for k in self._tb_cats.keys() + if self._tb_cats[k]['kind']=='field' and + len(self._tb_cats[k]['search_terms']) > 0] diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index d5300d93e9..fe62dcb7fd 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -125,7 +125,7 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, library_order = tweaks['save_template_title_series_sorting'] == 'library_order' tsfmt = title_sort if library_order else lambda x: x format_args = FORMAT_ARGS.copy() - format_args.update(mi.get_all_non_none_attributes()) + format_args.update(mi.all_non_none_fields()) if mi.title: format_args['title'] = tsfmt(mi.title) if mi.authors: diff --git a/src/calibre/library/server/content.py b/src/calibre/library/server/content.py index c3a662c0fd..041ea78051 100644 --- a/src/calibre/library/server/content.py +++ b/src/calibre/library/server/content.py @@ -56,7 +56,7 @@ class ContentServer(object): def sort(self, items, field, order): field = self.db.data.sanitize_sort_field_name(field) - if field not in self.db.field_metadata.sortable_keys(): + if field not in self.db.field_metadata.sortable_field_keys(): raise cherrypy.HTTPError(400, '%s is not a valid sort field'%field) keyg = CSSortKeyGenerator([(field, order)], self.db.field_metadata) items.sort(key=keyg, reverse=not order) From e721bd44eeb674b89346baf0ab13c053bd26e149 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 20 Sep 2010 14:52:53 +0100 Subject: [PATCH 057/412] Interim release --- src/calibre/gui2/dialogs/metadata_bulk.py | 248 ++++++++++++++-------- src/calibre/gui2/dialogs/metadata_bulk.ui | 152 +++++++++++-- src/calibre/library/database2.py | 5 +- 3 files changed, 294 insertions(+), 111 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 83cf6278e5..3659547b13 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -122,12 +122,20 @@ def format_composite(x, mi): class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): - s_r_functions = { - '' : lambda x: x, - _('Lower Case') : lambda x: x.lower(), - _('Upper Case') : lambda x: x.upper(), - _('Title Case') : lambda x: x.title(), - } + s_r_functions = { '' : lambda x: x, + _('Lower Case') : lambda x: x.lower(), + _('Upper Case') : lambda x: x.upper(), + _('Title Case') : lambda x: x.title(), + } + + s_r_match_modes = [ _('Character match'), + _('Regular Expression'), + ] + + s_r_replace_modes = [ _('Replace field'), + _('Prepend to field'), + _('Append to field'), + ] def __init__(self, window, rows, db): QDialog.__init__(self, window) @@ -179,27 +187,34 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): fields.sort() self.search_field.addItems(fields) self.search_field.setMaxVisibleItems(min(len(fields), 20)) + self.destination_field.addItems(fields) + self.destination_field.setMaxVisibleItems(min(len(fields), 20)) offset = 10 self.s_r_number_of_books = min(7, len(self.ids)) for i in range(1,self.s_r_number_of_books+1): w = QtGui.QLabel(self.tabWidgetPage3) w.setText(_('Book %d:')%i) - self.gridLayout1.addWidget(w, i+offset, 0, 1, 1) + self.testgrid.addWidget(w, i+offset, 0, 1, 1) w = QtGui.QLineEdit(self.tabWidgetPage3) w.setReadOnly(True) name = 'book_%d_text'%i setattr(self, name, w) self.book_1_text.setObjectName(name) - self.gridLayout1.addWidget(w, i+offset, 1, 1, 1) + self.testgrid.addWidget(w, i+offset, 1, 1, 1) w = QtGui.QLineEdit(self.tabWidgetPage3) w.setReadOnly(True) name = 'book_%d_result'%i setattr(self, name, w) self.book_1_text.setObjectName(name) - self.gridLayout1.addWidget(w, i+offset, 2, 1, 1) + self.testgrid.addWidget(w, i+offset, 2, 1, 1) self.s_r_heading.setText('

'+ - _('Search and replace in text fields using ' + _('You can destroy your library ' + 'using this feature. Changes are permanent. There ' + 'is no undo function. You are strongly encouraged ' + 'to back up your library before proceeding.' + ) + '

' + _( + 'Search and replace in text fields using ' 'regular expressions. The search text is an ' 'arbitrary python-compatible regular expression. ' 'The replacement text can contain backreferences ' @@ -209,51 +224,86 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): ' ' 'this reference ' 'for more information, and in particular the \'sub\' ' - 'function.') + '

' + _( - 'Note: you can destroy your library ' - 'using this feature. Changes are permanent. There ' - 'is no undo function. You are strongly encouraged ' - 'to back up your library before proceeding.')) + 'function.' + )) + self.search_mode.addItems(self.s_r_match_modes) + self.search_mode.setCurrentIndex(0) + self.replace_mode.addItems(self.s_r_replace_modes) + self.replace_mode.setCurrentIndex(0) + + self.s_r_search_mode = 0 self.s_r_error = None self.s_r_obj = None self.replace_func.addItems(sorted(self.s_r_functions.keys())) - self.search_field.currentIndexChanged[str].connect(self.s_r_field_changed) + self.search_mode.currentIndexChanged[int].connect(self.s_r_search_mode_changed) + self.search_field.currentIndexChanged[str].connect(self.s_r_search_field_changed) + self.destination_field.currentIndexChanged[str].connect(self.s_r_destination_field_changed) + + self.replace_mode.currentIndexChanged[int].connect(self.s_r_paint_results) self.replace_func.currentIndexChanged[str].connect(self.s_r_paint_results) self.search_for.editTextChanged[str].connect(self.s_r_paint_results) self.replace_with.editTextChanged[str].connect(self.s_r_paint_results) self.test_text.editTextChanged[str].connect(self.s_r_paint_results) + self.comma_separated.stateChanged.connect(self.s_r_paint_results) + self.case_sensitive.stateChanged.connect(self.s_r_paint_results) self.central_widget.setCurrentIndex(0) self.search_for.completer().setCaseSensitivity(Qt.CaseSensitive) self.replace_with.completer().setCaseSensitivity(Qt.CaseSensitive) + self.s_r_search_mode_changed(0) - def s_r_field_changed(self, txt): + def s_r_get_field(self, mi, field): + if field: + fm = self.db.metadata_for_field(field) + val = mi.get(field, None) + if val is None: + val = [] + elif not fm['is_multiple']: + val = [val] + elif field == 'authors': + val = [v.replace(',', '|') for v in val] + else: + val = [] + return val + + def s_r_search_field_changed(self, txt): txt = unicode(txt) for i in range(0, self.s_r_number_of_books): - if txt: - fm = self.db.field_metadata[txt] - id = self.ids[i] - val = self.db.get_property(id, index_is_id=True, - loc=fm['rec_index']) - if val is None: - val = '' - if fm['is_multiple']: - val = [t.strip() for t in val.split(fm['is_multiple']) if t.strip()] - if val: - val.sort(cmp=lambda x,y: cmp(x.lower(), y.lower())) - val = val[0] - if txt == 'authors': - val = val.replace('|', ',') - else: - val = '' - else: - val = '' w = getattr(self, 'book_%d_text'%(i+1)) - w.setText(val) + mi = self.db.get_metadata(self.ids[i], index_is_id=True) + src = unicode(self.search_field.currentText()) + t = self.s_r_get_field(mi, src) + w.setText(''.join(t[0:1])) self.s_r_paint_results(None) + def s_r_destination_field_changed(self, txt): + txt = unicode(txt) + self.comma_separated.setEnabled(True) + if txt: + fm = self.db.metadata_for_field(txt) + if fm['is_multiple']: + self.comma_separated.setEnabled(False) + self.comma_separated.setChecked(True) + self.s_r_paint_results(None) + + def s_r_search_mode_changed(self, val): + if val == 0: + self.destination_field.setCurrentIndex(0) + self.destination_field.setVisible(False) + self.destination_field_label.setVisible(False) + self.replace_mode.setCurrentIndex(0) + self.replace_mode.setVisible(False) + self.replace_mode_label.setVisible(False) + self.comma_separated.setVisible(False) + else: + self.destination_field.setVisible(True) + self.destination_field_label.setVisible(True) + self.replace_mode.setVisible(True) + self.replace_mode_label.setVisible(True) + self.comma_separated.setVisible(True) + def s_r_set_colors(self): if self.s_r_error is not None: col = 'rgb(255, 0, 0, 20%)' @@ -265,32 +315,66 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): for i in range(0,self.s_r_number_of_books): getattr(self, 'book_%d_result'%(i+1)).setText('') - field_match_re = re.compile(r'(^|[^\\])(\\g<)([^>]+)(>)') - def s_r_func(self, match): rfunc = self.s_r_functions[unicode(self.replace_func.currentText())] rtext = unicode(self.replace_with.text()) - mi_data = self.mi.all_non_none_fields() - - def fm_func(m): - try: - if m.group(3) not in self.mi.all_field_keys(): return m.group(0) - else: return '%s{%s}'%(m.group(1), m.group(3)) - except: - import traceback - traceback.print_exc() - return m.group(0) - - rtext = re.sub(self.field_match_re, fm_func, rtext) rtext = match.expand(rtext) - rtext = format_composite(rtext, mi_data) return rfunc(rtext) + def s_r_do_regexp(self, mi): + src_field = unicode(self.search_field.currentText()) + src = self.s_r_get_field(mi, src_field) + result = [] + for s in src: + result.append(self.s_r_obj.sub(self.s_r_func, s)) + return result + + def s_r_do_destination(self, mi, val): + src = unicode(self.search_field.currentText()) + if src == '': + return '' + dest = unicode(self.destination_field.currentText()) + if dest == '': + dest = src + dest_mode = self.replace_mode.currentIndex() + + if dest_mode != 0: + dest_val = mi.get(dest, '') + if dest_val is None: + dest_val = [] + elif isinstance(dest_val, list): + if dest == 'authors': + dest_val = [v.replace(',', '|') for v in dest_val] + else: + dest_val = [dest_val] + else: + dest_val = [] + + if len(val) > 0: + if src == 'authors': + val = [v.replace(',', '|') for v in val] + if dest_mode == 1: + val.extend(dest_val) + elif dest_mode == 2: + val[0:0] = dest_val + return val + + def s_r_replace_mode_separator(self): + if self.comma_separated.isChecked(): + return ',' + return '' + def s_r_paint_results(self, txt): self.s_r_error = None self.s_r_set_colors() + + if self.case_sensitive.isChecked(): + flags = 0 + else: + flags = re.I + try: - self.s_r_obj = re.compile(unicode(self.search_for.text())) + self.s_r_obj = re.compile(unicode(self.search_for.text()), flags) except Exception as e: self.s_r_obj = None self.s_r_error = e @@ -298,7 +382,6 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): return try: - self.mi = MetaInformation(None, None) self.test_result.setText(self.s_r_obj.sub(self.s_r_func, unicode(self.test_text.text()))) except Exception as e: @@ -307,60 +390,53 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): return for i in range(0,self.s_r_number_of_books): - id = self.ids[i] - self.mi = self.db.get_metadata(id, index_is_id=True) - wt = getattr(self, 'book_%d_text'%(i+1)) + mi = self.db.get_metadata(self.ids[i], index_is_id=True) wr = getattr(self, 'book_%d_result'%(i+1)) try: - wr.setText(self.s_r_obj.sub(self.s_r_func, unicode(wt.text()))) + result = self.s_r_do_regexp(mi) + t = self.s_r_do_destination(mi, result[0:1]) + t = self.s_r_replace_mode_separator().join(t) + wr.setText(t) except Exception as e: + import traceback + traceback.print_exc() self.s_r_error = e self.s_r_set_colors() break def do_search_replace(self): - field = unicode(self.search_field.currentText()) - if not field or not self.s_r_obj: + source = unicode(self.search_field.currentText()) + if not source or not self.s_r_obj: return - - fm = self.db.field_metadata[field] - - def apply_pattern(val): - try: - return self.s_r_obj.sub(self.s_r_func, val) - except: - return val + dest = unicode(self.destination_field.currentText()) + if not dest: + dest = source + dfm = self.db.field_metadata[source] for id in self.ids: - val = self.db.get_property(id, index_is_id=True, - loc=fm['rec_index']) + mi = self.db.get_metadata(id, index_is_id=True,) + val = mi.get(source) if val is None: continue - if fm['is_multiple']: - res = [] - for val in [t.strip() for t in val.split(fm['is_multiple'])]: - v = apply_pattern(val).strip() - if v: - res.append(v) - val = res - if fm['is_custom']: + val = self.s_r_do_regexp(mi) + val = self.s_r_do_destination(mi, val) + if dfm['is_multiple']: + if dfm['is_custom']: # The standard tags and authors values want to be lists. # All custom columns are to be strings - val = fm['is_multiple'].join(val) - elif field == 'authors': - val = [v.replace('|', ',') for v in val] + val = dfm['is_multiple'].join(val) else: - val = apply_pattern(val) + val = self.s_r_replace_mode_separator().join(val) - if fm['is_custom']: - extra = self.db.get_custom_extra(id, label=fm['label'], index_is_id=True) - self.db.set_custom(id, val, label=fm['label'], extra=extra, + if dfm['is_custom']: + extra = self.db.get_custom_extra(id, label=dfm['label'], index_is_id=True) + self.db.set_custom(id, val, label=dfm['label'], extra=extra, commit=False) else: - if field == 'comments': + if dest == 'comments': setter = self.db.set_comment else: - setter = getattr(self.db, 'set_'+field) + setter = getattr(self.db, 'set_'+dest) setter(id, val, notify=False, commit=False) self.db.commit() diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index aca7b0cb75..e433aaf327 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -319,7 +319,7 @@ Future conversion of these books will use the default settings. &Search and replace (experimental) - + QLayout::SetMinimumSize @@ -351,6 +351,39 @@ Future conversion of these books will use the default settings. + + + + + + + + Search mode: + + + search_field + + + + + + + + + + Qt::Horizontal + + + + 20 + 10 + + + + + + + &Search for: @@ -360,7 +393,20 @@ Future conversion of these books will use the default settings. - + + + + + + + Case sensitive + + + true + + + + &Replace with: @@ -370,29 +416,93 @@ Future conversion of these books will use the default settings. - - - - - - - + - - + + + + + + Apply function after replace: + + + replace_func + + + + + + + + + + Qt::Horizontal + + + + 20 + 10 + + + + + + + + - Apply function &after replace: + &Destination field: - replace_func + destination_field - - - + + + + + + + + Mode: + + + replace_mode + + + + + + + + + + use comma + + + true + + + + + + + Qt::Horizontal + + + + 20 + 10 + + + + + + + Test &text @@ -402,8 +512,8 @@ Future conversion of these books will use the default settings. - - + + Test re&sult @@ -412,17 +522,17 @@ Future conversion of these books will use the default settings. - + Your test: - + - + diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index f5a474edbc..2f9f9b6f89 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -528,10 +528,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def get_field(self, idx, key, default=None, index_is_id=False): mi = self.get_metadata(idx, index_is_id=index_is_id, get_cover=True) - try: - return mi[key] - except: - return default + return mi.get(key, default) def standard_field_keys(self): return self.field_metadata.standard_field_keys() From ea44e9053faf49c85df6d7e6abf8392ef37ffd12 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 20 Sep 2010 17:03:53 +0100 Subject: [PATCH 058/412] Finish search and replace. Fix a bug in database2 that seems to be triggered by interactions with the cover cache. --- src/calibre/gui2/dialogs/metadata_bulk.py | 60 +++++++++++++---------- src/calibre/library/database2.py | 23 ++++++--- 2 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 3659547b13..b01869deaa 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -11,11 +11,11 @@ from PyQt4 import QtGui from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog from calibre.gui2.dialogs.tag_editor import TagEditor -from calibre.ebooks.metadata import string_to_authors, \ - authors_to_string, MetaInformation +from calibre.ebooks.metadata import string_to_authors, authors_to_string from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre.gui2.dialogs.progress import BlockingBusy from calibre.gui2 import error_dialog, Dispatcher +from calibre.utils.config import dynamic class Worker(Thread): @@ -208,26 +208,27 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.book_1_text.setObjectName(name) self.testgrid.addWidget(w, i+offset, 2, 1, 1) - self.s_r_heading.setText('

'+ - _('You can destroy your library ' - 'using this feature. Changes are permanent. There ' - 'is no undo function. You are strongly encouraged ' - 'to back up your library before proceeding.' - ) + '

' + _( - 'Search and replace in text fields using ' - 'regular expressions. The search text is an ' - 'arbitrary python-compatible regular expression. ' - 'The replacement text can contain backreferences ' - 'to parenthesized expressions in the pattern. ' - 'The search is not anchored, and can match and ' - 'replace multiple times on the same string. See ' - ' ' - 'this reference ' - 'for more information, and in particular the \'sub\' ' - 'function.' - )) + self.s_r_heading.setText('

'+ _( + 'You can destroy your library using this feature. ' + 'Changes are permanent. There is no undo function. ' + ' This feature is experimental, and there may be bugs. ' + 'You are strongly encouraged to back up your library ' + 'before proceeding.' + ) + '

' + _( + 'Search and replace in text fields using character matching ' + 'or regular expressions. In character mode, search text ' + 'found in the specified field is replaced with replace ' + 'text. In regular expression mode, the search text is an ' + 'arbitrary python-compatible regular expression. The ' + 'replacement text can contain backreferences to parenthesized ' + 'expressions in the pattern. The search is not anchored, ' + 'and can match and replace multiple times on the same string. ' + 'See ' + 'this reference for more information, and in particular ' + 'the \'sub\' function.' + )) self.search_mode.addItems(self.s_r_match_modes) - self.search_mode.setCurrentIndex(0) + self.search_mode.setCurrentIndex(dynamic.get('s_r_search_mode', 0)) self.replace_mode.addItems(self.s_r_replace_modes) self.replace_mode.setCurrentIndex(0) @@ -252,7 +253,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.search_for.completer().setCaseSensitivity(Qt.CaseSensitive) self.replace_with.completer().setCaseSensitivity(Qt.CaseSensitive) - self.s_r_search_mode_changed(0) + self.s_r_search_mode_changed(self.search_mode.currentIndex()) def s_r_get_field(self, mi, field): if field: @@ -303,6 +304,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.replace_mode.setVisible(True) self.replace_mode_label.setVisible(True) self.comma_separated.setVisible(True) + self.s_r_paint_results(None) def s_r_set_colors(self): if self.s_r_error is not None: @@ -325,8 +327,12 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): src_field = unicode(self.search_field.currentText()) src = self.s_r_get_field(mi, src_field) result = [] + rfunc = self.s_r_functions[unicode(self.replace_func.currentText())] for s in src: - result.append(self.s_r_obj.sub(self.s_r_func, s)) + t = self.s_r_obj.sub(self.s_r_func, s) + if self.search_mode.currentIndex() == 0: + t = rfunc(t) + result.append(t) return result def s_r_do_destination(self, mi, val): @@ -374,7 +380,10 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): flags = re.I try: - self.s_r_obj = re.compile(unicode(self.search_for.text()), flags) + if self.search_mode.currentIndex() == 0: + self.s_r_obj = re.compile(re.escape(unicode(self.search_for.text())), flags) + else: + self.s_r_obj = re.compile(unicode(self.search_for.text()), flags) except Exception as e: self.s_r_obj = None self.s_r_error = e @@ -411,7 +420,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): dest = unicode(self.destination_field.currentText()) if not dest: dest = source - dfm = self.db.field_metadata[source] + dfm = self.db.field_metadata[dest] for id in self.ids: mi = self.db.get_metadata(id, index_is_id=True,) @@ -439,6 +448,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): setter = getattr(self.db, 'set_'+dest) setter(id, val, notify=False, commit=False) self.db.commit() + dynamic['s_r_search_mode'] = self.search_mode.currentIndex() def create_custom_column_editors(self): w = self.central_widget.widget(1) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 2f9f9b6f89..c1ada94a84 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -464,11 +464,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # change case don't cause any changes to the directories in the file # system. This can lead to having the directory names not match the # title/author, which leads to trouble when libraries are copied to - # a case-sensitive system. The following code fixes this by checking - # each segment. If they are different because of case, then rename - # the segment to some temp file name, then rename it back to the - # correct name. Note that the code above correctly handles files in - # the directories, so no need to do them here. + # a case-sensitive system. The following code attempts to fix this + # by checking each segment. If they are different because of case, + # then rename the segment to some temp file name, then rename it + # back to the correct name. Note that the code above correctly + # handles files in the directories, so no need to do them here. for oldseg, newseg in zip(c1, c2): if oldseg.lower() == newseg.lower() and oldseg != newseg: while True: @@ -476,8 +476,17 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): tempname = os.path.join(curpath, 'TEMP.%f'%time.time()) if not os.path.exists(tempname): break - os.rename(os.path.join(curpath, oldseg), tempname) - os.rename(tempname, os.path.join(curpath, newseg)) + try: + os.rename(os.path.join(curpath, oldseg), tempname) + except (IOError, OSError): + # Windows (at least) sometimes refuses to do the rename + # probably because a file such a cover is open in the + # hierarchy. Just go on -- nothing is hurt beyond the + # case of the filesystem not matching the case in + # name stored by calibre + print 'rename of library component failed' + else: + os.rename(tempname, os.path.join(curpath, newseg)) curpath = os.path.join(curpath, newseg) def add_listener(self, listener): From e2f4b969bc6d36fbb285818cb50184cf83efed6e Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 20 Sep 2010 19:49:03 +0100 Subject: [PATCH 059/412] 1) add tooltips 2) change main heading text depending on the mode 3) add an error if attempting to assign '' to authors or title --- src/calibre/gui2/dialogs/metadata_bulk.py | 48 +++++++++++++++++---- src/calibre/gui2/dialogs/metadata_bulk.ui | 52 +++++++++++++++++++---- 2 files changed, 84 insertions(+), 16 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index b01869deaa..681f65b19e 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -208,25 +208,43 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.book_1_text.setObjectName(name) self.testgrid.addWidget(w, i+offset, 2, 1, 1) - self.s_r_heading.setText('

'+ _( + self.main_heading = _( 'You can destroy your library using this feature. ' 'Changes are permanent. There is no undo function. ' ' This feature is experimental, and there may be bugs. ' 'You are strongly encouraged to back up your library ' 'before proceeding.' - ) + '

' + _( + + '

' + 'Search and replace in text fields using character matching ' - 'or regular expressions. In character mode, search text ' - 'found in the specified field is replaced with replace ' - 'text. In regular expression mode, the search text is an ' + 'or regular expressions. ') + + self.character_heading = _( + 'In character mode, the field is searched for the entered ' + 'search text. The text is replaced by the specified replacement ' + 'text everywhere it is found in the specified field. After ' + 'replacement is finished, the text can be changed to ' + 'upper-case, lower-case, or title-case. If the case-sensitive ' + 'check box is checked, the search text must match exactly. If ' + 'it is unchecked, the search text will match both upper- and ' + 'lower-case letters' + ) + + self.regexp_heading = _( + 'In regular expression mode, the search text is an ' 'arbitrary python-compatible regular expression. The ' 'replacement text can contain backreferences to parenthesized ' 'expressions in the pattern. The search is not anchored, ' 'and can match and replace multiple times on the same string. ' + 'The modification functions (lower-case etc) are applied to the ' + 'matched text, not to the field as a whole. ' + 'The destination box specifies the field where the result after ' + 'matching and replacement is to be assigned. You can replace ' + 'the text in the field, or prepend or append the matched text. ' 'See ' - 'this reference for more information, and in particular ' - 'the \'sub\' function.' - )) + 'this reference for more information on python\'s regular ' + 'expressions, and in particular the \'sub\' function.' + ) + self.search_mode.addItems(self.s_r_match_modes) self.search_mode.setCurrentIndex(dynamic.get('s_r_search_mode', 0)) self.replace_mode.addItems(self.s_r_replace_modes) @@ -298,12 +316,14 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.replace_mode.setVisible(False) self.replace_mode_label.setVisible(False) self.comma_separated.setVisible(False) + self.s_r_heading.setText('

'+self.main_heading + self.character_heading) else: self.destination_field.setVisible(True) self.destination_field_label.setVisible(True) self.replace_mode.setVisible(True) self.replace_mode_label.setVisible(True) self.comma_separated.setVisible(True) + self.s_r_heading.setText('

'+self.main_heading + self.regexp_heading) self.s_r_paint_results(None) def s_r_set_colors(self): @@ -434,8 +454,20 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): # The standard tags and authors values want to be lists. # All custom columns are to be strings val = dfm['is_multiple'].join(val) + if dest == 'authors' and len(val) == 0: + error_dialog(self, _('Search/replace invalid'), + _('Authors cannot be set to the empty string. ' + 'Book title %s not processed')%mi.title, + show=True) + continue else: val = self.s_r_replace_mode_separator().join(val) + if dest == 'title' and len(val) == 0: + error_dialog(self, _('Search/replace invalid'), + _('Title cannot be set to the empty string. ' + 'Book title %s not processed')%mi.title, + show=True) + continue if dfm['is_custom']: extra = self.db.get_custom_extra(id, label=dfm['label'], index_is_id=True) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index e433aaf327..b2a3e11b4a 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -351,7 +351,11 @@ Future conversion of these books will use the default settings. - + + + The name of the field that you want to search + + @@ -361,12 +365,16 @@ Future conversion of these books will use the default settings. Search mode: - search_field + search_mode - + + + Choose whether to use basic text matching or advanced regular expression matching + + @@ -394,7 +402,11 @@ Future conversion of these books will use the default settings. - + + + Enter the what you are looking for, either plain text or a regular expression, depending on the mode + + @@ -404,6 +416,9 @@ Future conversion of these books will use the default settings. true + + Check this box if the search string must match exactly upper and lower case. Uncheck it if case is to be ignored + @@ -417,7 +432,11 @@ Future conversion of these books will use the default settings. - + + + The replacement text. The matched search text will be replaced with this string + + @@ -432,7 +451,12 @@ Future conversion of these books will use the default settings. - + + + Specify how the text is to be processed after matching and replacement. In character mode, the entire +field is processed. In regular expression mode, only the matched text is processed + + @@ -460,7 +484,11 @@ Future conversion of these books will use the default settings. - + + + The field that the text will be put into after all replacements. If blank, the source field is used. + + @@ -475,7 +503,11 @@ Future conversion of these books will use the default settings. - + + + Specify how the text should be copied into the destination. + + @@ -485,6 +517,10 @@ Future conversion of these books will use the default settings. true + + If the replace mode is prepend or append, then this box indicates whether a comma or +nothing should be put between the original text and the inserted text + From 57a8705ec1b869d97d04ceab75db9caf1426faad Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 20 Sep 2010 13:27:55 -0600 Subject: [PATCH 060/412] Don't maintain a separate prompt buffer --- src/calibre/utils/pyconsole/editor.py | 49 +++++++++++++++------------ 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/calibre/utils/pyconsole/editor.py b/src/calibre/utils/pyconsole/editor.py index 68b83539f2..431a10eda5 100644 --- a/src/calibre/utils/pyconsole/editor.py +++ b/src/calibre/utils/pyconsole/editor.py @@ -58,7 +58,6 @@ class Editor(QTextEdit): QTextEdit.__init__(self, parent) self.buf = '' self.prompt_frame = None - self.current_prompt = [''] self.allow_output = False self.prompt_frame_format = QTextFrameFormat() self.prompt_frame_format.setBorder(1) @@ -84,11 +83,21 @@ class Editor(QTextEdit): self.interpreter = Interpreter(parent=self) self.interpreter.show_error.connect(self.show_error) - #it = self.prompt_frame.begin() - #while not it.atEnd(): - # bl = it.currentBlock() - # prints(repr(bl.text())) - # it += 1 + print list(self.prompt()) + + + def prompt(self, strip_prompt_strings=True): + if not self.prompt_frame: + yield u'' if strip_prompt_strings else self.formatter.prompt + else: + it = self.prompt_frame.begin() + while not it.atEnd(): + bl = it.currentBlock() + t = unicode(bl.text()) + if strip_prompt_strings: + t = t[self.prompt_len:] + yield t + it += 1 # Rendering {{{ @@ -113,15 +122,16 @@ class Editor(QTextEdit): c.setPosition(self.prompt_frame.firstPosition()) def render_current_prompt(self): + cp = list(self.prompt()) self.clear_current_prompt() - for i, line in enumerate(self.current_prompt): + for i, line in enumerate(cp): start = i == 0 - end = i == len(self.current_prompt) - 1 + end = i == len(cp) - 1 self.formatter.render_prompt(not start, self.cursor) self.formatter.render(self.lexer.get_tokens(line), self.cursor) if not end: - self.cursor.insertText('\n') + self.cursor.insertBlock() def show_error(self, is_syntax_err, tb): if self.prompt_frame is not None: @@ -194,32 +204,29 @@ class Editor(QTextEdit): def enter_pressed(self): if self.prompt_frame is None: return - if self.current_prompt[0]: + cp = list(self.prompt()) + if cp[0]: c = self.root_frame.lastCursorPosition() self.setTextCursor(c) old_pf = self.prompt_frame self.prompt_frame = None oldbuf = self.buf self.buf = '' - ret = self.interpreter.runsource('\n'.join(self.current_prompt)) + ret = self.interpreter.runsource('\n'.join(cp)) if ret: # Incomplete command self.buf = oldbuf self.prompt_frame = old_pf - self.current_prompt.append('') + c = old_pf.lastCursorPosition() + c.insertBlock() + self.setTextCursor(c) else: # Command completed - self.current_prompt = [''] old_pf.setFrameFormat(QTextFrameFormat()) self.render_current_prompt() def text_typed(self, text): - if not self.current_prompt[0]: - self.cursor.beginEditBlock() - else: - self.cursor.joinPreviousEditBlock() - self.current_prompt[-1] += text - self.render_current_prompt() - self.cursor.endEditBlock() - + if self.prompt_frame is not None: + self.cursor.insertText(text) + self.render_current_prompt() # }}} From 111c73ab80549913cc405d86d09ca69ef648e583 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 20 Sep 2010 13:46:11 -0600 Subject: [PATCH 061/412] ... --- .../utils/pyconsole/{editor.py => console.py} | 31 ++++++++++++------- src/calibre/utils/pyconsole/main.py | 4 +-- 2 files changed, 21 insertions(+), 14 deletions(-) rename src/calibre/utils/pyconsole/{editor.py => console.py} (96%) diff --git a/src/calibre/utils/pyconsole/editor.py b/src/calibre/utils/pyconsole/console.py similarity index 96% rename from src/calibre/utils/pyconsole/editor.py rename to src/calibre/utils/pyconsole/console.py index 431a10eda5..d95e86c7ef 100644 --- a/src/calibre/utils/pyconsole/editor.py +++ b/src/calibre/utils/pyconsole/console.py @@ -29,7 +29,7 @@ class EditBlock(object): # {{{ self.cursor.endEditBlock() # }}} -class Editor(QTextEdit): +class Console(QTextEdit): @property def doc(self): @@ -86,6 +86,8 @@ class Editor(QTextEdit): print list(self.prompt()) + # Prompt management {{{ + def prompt(self, strip_prompt_strings=True): if not self.prompt_frame: yield u'' if strip_prompt_strings else self.formatter.prompt @@ -99,15 +101,8 @@ class Editor(QTextEdit): yield t it += 1 - - # Rendering {{{ - - def render_block(self, text, restore_prompt=True): - self.formatter.render(self.lexer.get_tokens(text), self.cursor) - self.cursor.insertBlock() - self.cursor.movePosition(self.cursor.End) - if restore_prompt: - self.render_current_prompt() + def set_prompt(self, lines): + self.render_current_prompt(lines) def clear_current_prompt(self): if self.prompt_frame is None: @@ -121,8 +116,8 @@ class Editor(QTextEdit): c.removeSelectedText() c.setPosition(self.prompt_frame.firstPosition()) - def render_current_prompt(self): - cp = list(self.prompt()) + def render_current_prompt(self, lines=None): + cp = list(self.prompt()) if lines is None else lines self.clear_current_prompt() for i, line in enumerate(cp): @@ -133,6 +128,18 @@ class Editor(QTextEdit): if not end: self.cursor.insertBlock() + # }}} + + + # Non-prompt Rendering {{{ + + def render_block(self, text, restore_prompt=True): + self.formatter.render(self.lexer.get_tokens(text), self.cursor) + self.cursor.insertBlock() + self.cursor.movePosition(self.cursor.End) + if restore_prompt: + self.render_current_prompt() + def show_error(self, is_syntax_err, tb): if self.prompt_frame is not None: # At a prompt, so redirect output diff --git a/src/calibre/utils/pyconsole/main.py b/src/calibre/utils/pyconsole/main.py index c2694aae5f..af99ec66bb 100644 --- a/src/calibre/utils/pyconsole/main.py +++ b/src/calibre/utils/pyconsole/main.py @@ -10,7 +10,7 @@ from PyQt4.Qt import QMainWindow, QToolBar, QStatusBar, QLabel, QFont, Qt, \ QApplication from calibre.constants import __appname__, __version__ -from calibre.utils.pyconsole.editor import Editor +from calibre.utils.pyconsole.console import Console class MainWindow(QMainWindow): @@ -37,7 +37,7 @@ class MainWindow(QMainWindow): self.tool_bar.setToolButtonStyle(Qt.ToolButtonTextOnly) # }}} - self.editor = Editor(parent=self) + self.editor = Console(parent=self) self.setCentralWidget(self.editor) From f770aa43bbf4a175cb614e437694732361209637 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 20 Sep 2010 14:24:42 -0600 Subject: [PATCH 062/412] Left and right arrow keys work --- src/calibre/utils/pyconsole/console.py | 64 ++++++++++++++++++-------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index d95e86c7ef..73a19e7958 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -45,18 +45,30 @@ class Console(QTextEdit): @property def cursor_pos(self): - pass - #pos = self.cursor.position() - self.prompt_frame.firstPosition() - #i = 0 - #for line in self.current_prompt: - # i += self.prompt_len + ''' + Return cursor position in prompt frame as (row, col). + row starts at 0 for the first line + col is 0 if the cursor is at the start of the line, 1 if it is after + the first character, n if it is after the nth char. + ''' + if self.prompt_frame is not None: + pos = self.cursor.position() + it = self.prompt_frame.begin() + lineno = 0 + while not it.atEnd(): + bl = it.currentBlock() + if bl.contains(pos): + return (lineno, pos - bl.position()) + it += 1 + lineno += 1 + return (-1, -1) def __init__(self, prompt='>>> ', continuation='... ', parent=None): QTextEdit.__init__(self, parent) - self.buf = '' + self.buf = [] self.prompt_frame = None self.allow_output = False self.prompt_frame_format = QTextFrameFormat() @@ -130,7 +142,6 @@ class Console(QTextEdit): # }}} - # Non-prompt Rendering {{{ def render_block(self, text, restore_prompt=True): @@ -143,26 +154,25 @@ class Console(QTextEdit): def show_error(self, is_syntax_err, tb): if self.prompt_frame is not None: # At a prompt, so redirect output - return prints(tb) + return prints(tb, end='') try: - self.buf += tb + self.buf.append(tb) if is_syntax_err: self.formatter.render_syntax_error(tb, self.cursor) else: self.formatter.render(self.tb_lexer.get_tokens(tb), self.cursor) except: - prints(tb) + prints(tb, end='') def show_output(self, raw): if self.prompt_frame is not None: # At a prompt, so redirect output - return prints(raw) + return prints(raw, end='') try: - self.current_prompt_range = None - self.buf += raw + self.buf.append(raw) self.formatter.render_raw(raw, self.cursor) except: - prints(raw) + prints(raw, end='') # }}} @@ -187,13 +197,29 @@ class Console(QTextEdit): QTextEdit.keyPressEvent(self, ev) def left_pressed(self): - pass + lineno, pos = self.cursor_pos + if lineno < 0: return + if pos > self.prompt_len: + c = self.cursor + c.movePosition(c.PreviousCharacter) + self.setTextCursor(c) + elif lineno > 0: + c = self.cursor + c.movePosition(c.Up) + c.movePosition(c.EndOfLine) + self.setTextCursor(c) def right_pressed(self): - if self.prompt_frame is not None: - c = self.cursor + lineno, pos = self.cursor_pos + if lineno < 0: return + c = self.cursor + lineno, pos = self.cursor_pos + cp = list(self.prompt(False)) + if pos < len(cp[lineno]): c.movePosition(c.NextCharacter) - self.setTextCursor(c) + elif lineno < len(cp)-1: + c.movePosition(c.NextCharacter, n=1+self.prompt_len) + self.setTextCursor(c) def home_pressed(self): if self.prompt_frame is not None: @@ -218,7 +244,7 @@ class Console(QTextEdit): old_pf = self.prompt_frame self.prompt_frame = None oldbuf = self.buf - self.buf = '' + self.buf = [] ret = self.interpreter.runsource('\n'.join(cp)) if ret: # Incomplete command self.buf = oldbuf From acec240ef8a8ad5be4a02deb52e7eb72f01bfa0f Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 20 Sep 2010 21:48:52 +0100 Subject: [PATCH 063/412] Add scroll bar. Increase number of books to 10 --- src/calibre/gui2/dialogs/metadata_bulk.py | 2 +- src/calibre/gui2/dialogs/metadata_bulk.ui | 42 +++++++++++++++++------ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 681f65b19e..7122fe14fa 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -190,7 +190,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.destination_field.addItems(fields) self.destination_field.setMaxVisibleItems(min(len(fields), 20)) offset = 10 - self.s_r_number_of_books = min(7, len(self.ids)) + self.s_r_number_of_books = min(10, len(self.ids)) for i in range(1,self.s_r_number_of_books+1): w = QtGui.QLabel(self.tabWidgetPage3) w.setText(_('Book %d:')%i) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index ec5a952346..f28f3fb57c 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -319,7 +319,7 @@ Future conversion of these books will use the default settings. &Search and replace (experimental) - + QLayout::SetMinimumSize @@ -406,6 +406,12 @@ Future conversion of these books will use the default settings. Enter the what you are looking for, either plain text or a regular expression, depending on the mode + + + 100 + 0 + + @@ -558,19 +564,33 @@ nothing should be put between the original text and the inserted text - - - - Your test: + + + + QFrame::NoFrame + + true + + + + + + + Your test: + + + + + + + + + + + - - - - - - From 4b981a5257be82a9f4cfaeb8fca32f48f54dc7d0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 20 Sep 2010 14:58:24 -0600 Subject: [PATCH 064/412] Inserting, not just appending text now works --- src/calibre/utils/pyconsole/console.py | 68 +++++++++++++++++--------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index 73a19e7958..19a24dfdd7 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -43,25 +43,6 @@ class Console(QTextEdit): def root_frame(self): return self.doc.rootFrame() - @property - def cursor_pos(self): - ''' - Return cursor position in prompt frame as (row, col). - row starts at 0 for the first line - col is 0 if the cursor is at the start of the line, 1 if it is after - the first character, n if it is after the nth char. - ''' - if self.prompt_frame is not None: - pos = self.cursor.position() - it = self.prompt_frame.begin() - lineno = 0 - while not it.atEnd(): - bl = it.currentBlock() - if bl.contains(pos): - return (lineno, pos - bl.position()) - it += 1 - lineno += 1 - return (-1, -1) def __init__(self, prompt='>>> ', @@ -95,11 +76,48 @@ class Console(QTextEdit): self.interpreter = Interpreter(parent=self) self.interpreter.show_error.connect(self.show_error) - print list(self.prompt()) - # Prompt management {{{ + @dynamic_property + def cursor_pos(self): + doc = ''' + The cursor position in the prompt has the form (row, col). + row starts at 0 for the first line + col is 0 if the cursor is at the start of the line, 1 if it is after + the first character, n if it is after the nth char. + ''' + + def fget(self): + if self.prompt_frame is not None: + pos = self.cursor.position() + it = self.prompt_frame.begin() + lineno = 0 + while not it.atEnd(): + bl = it.currentBlock() + if bl.contains(pos): + return (lineno, pos - bl.position()) + it += 1 + lineno += 1 + return (-1, -1) + + def fset(self, val): + row, col = val + if self.prompt_frame is not None: + it = self.prompt_frame.begin() + lineno = 0 + while not it.atEnd(): + if lineno == row: + c = self.cursor + c.setPosition(it.currentBlock().position()) + c.movePosition(c.NextCharacter, n=col) + self.setTextCursor(c) + break + it += 1 + lineno += 1 + + return property(fget=fget, fset=fset, doc=doc) + def prompt(self, strip_prompt_strings=True): if not self.prompt_frame: yield u'' if strip_prompt_strings else self.formatter.prompt @@ -128,7 +146,8 @@ class Console(QTextEdit): c.removeSelectedText() c.setPosition(self.prompt_frame.firstPosition()) - def render_current_prompt(self, lines=None): + def render_current_prompt(self, lines=None, restore_cursor=False): + row, col = self.cursor_pos cp = list(self.prompt()) if lines is None else lines self.clear_current_prompt() @@ -140,6 +159,9 @@ class Console(QTextEdit): if not end: self.cursor.insertBlock() + if row > -1 and restore_cursor: + self.cursor_pos = (row, col) + # }}} # Non-prompt Rendering {{{ @@ -259,7 +281,7 @@ class Console(QTextEdit): def text_typed(self, text): if self.prompt_frame is not None: self.cursor.insertText(text) - self.render_current_prompt() + self.render_current_prompt(restore_cursor=True) # }}} From fe6d962bee771a34dd4937b6f332e0d0d4114676 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 20 Sep 2010 19:33:17 -0600 Subject: [PATCH 065/412] Use dialog instead of main window. Set console stylesheet based on pygments style. Don't block if there is a lot of output --- imgsrc/console.svg | 4339 ++++++++++++++++++++++ resources/images/console.png | Bin 0 -> 5110 bytes src/calibre/utils/pyconsole/__init__.py | 9 + src/calibre/utils/pyconsole/console.py | 117 +- src/calibre/utils/pyconsole/formatter.py | 14 +- src/calibre/utils/pyconsole/main.py | 44 +- 6 files changed, 4482 insertions(+), 41 deletions(-) create mode 100644 imgsrc/console.svg create mode 100644 resources/images/console.png diff --git a/imgsrc/console.svg b/imgsrc/console.svg new file mode 100644 index 0000000000..0d502bb1da --- /dev/null +++ b/imgsrc/console.svg @@ -0,0 +1,4339 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/console.png b/resources/images/console.png new file mode 100644 index 0000000000000000000000000000000000000000..168f0ccb2a177087d2ee6157bb67166688c84c05 GIT binary patch literal 5110 zcmVxU{8 zPX+SQ2HuQqEW9l2vVZVDFa={E2%3ks4|OUPwOKoMg@^=5$wNZbR$+}383{v5y#|{) zyEePt#rEF4GjsYdf9{zx-#K$;?wz}{*YlIcXJ*ddIp6pFzVDowy#{hz*Dy5h%gW@) zE|}yz1W~vKcNDmDs%(zzfpIAVU~}iBB8Zk=aE}szB6s9UkbUsNx46TEqX;$#B`CS6 zC;TFSb^smj(e9S<*Z^Gl9NB#QUXx{+5vnGzzy!P6hNC>E?0nT zLR0_~Ko!6>09V`ta1U2e zwR!XArvXd=xCG!ToPaRE0NxXNOF(}4SG?z*d+xY&=@Q1r$H7BqB2^Qdq+UJ!)Z0HL z5M2Q^Gp|yqV0LyEj4`ZTyLJ<5mhZXnfD7RLx|dnt4r9rZC2bcjTtFisT3OV2Bl^+l zU#A@v6=x}La&i*w?d=^1FX02=wL%J>_IWf~U^3|R(}=M&>v_@wuMm|=g;J2vLq$gR zwr$4>R)B@K@J5#rpI`L5S;-Uc3wh*2QZ68H#1(!LWXZy1WwJ!?x_P#31Htz>A(Uhp zRD-8Zox;@AR8*B53y2jfR$#-14FL3(j*$w$V|scT!^6YLMwX)~ICSWcFL;*$l!(Ou z9=f`^uxj;6tXjPaot-zpFbsMP%K(O2>SVboW6oNHO1W};{aPOUGVscRtD{&?i(?9m zO*N*-v4!W1TB|n_j4{m5&*RdiOZf83FEKki8_JJDECuj<;;PjvvF>|!DJlgLUp&0P z#1d|2H9?B`if8dlsh&49CN7Pbr+}_Sj!h_)Vhm*%20A)AaP!SK0{~`cX9IDI4g-im zUUs;nIL#s+hKLBS-rFc)vfen=Kz*3Uk;!qBVrXm zB9Q`gb#+P0)Naz3Iu_>@3{JhM2{fC8X_sIhp&lvX2sV+bMUw^Zp`)V%0Mcau56Wej zglfYVlB!G;I6(nKlZoj+)R1CK6jLpbz(r6pNsR$iVQqE!8Alt~-9n^ztZtpenQ1Bpi9 z70#ox#SB`o$_Lh@c%6C+<^TCNf8tv}&)TUaxeAH)0c2&u;grncgp?6Wt3W+TzkdI! z!AVD?)=*+e8X6;^lu78HF&22|;+=a!)uD2#&E_*eprVlSmoX{6;r?I3Cekq}>kGFc zToW%`QP7P*Q(Ztqmw!@$iy1VV)V=)E(Jm(TDj7dxuq?|LvM1Dw&C>8wJjf;Ol25s%Z6=R zFii`VZGqVg{yTvMSoW#VPz8{E9~Uf4U+P$#m!}sS#GrpMb?fVljWNKoE!dVLaND-R zFN30CUJr?(=uUOwrlBbu;z|U9h(R&1pP@*6HSQ$l5Dsn$xC8!a{uor zm2F$FOv@L1=vx3~WEdhH06wObfP0>x@N@ zjq6&fgBcTi^J4%h)iOc)qBBl!`R56o3f!Uu7KllF!G~QM|7=;Ie;~dBXuS-g{%lIN z{OjG-i*K#|RH7dq zq1tKB?YCp+qdRf#+Nv8ydrP*-yN(y>v+ zG9-8ksqOHq#7$B!Sw+0Q;# zP%V>MoMl@uP1E0FmyTEYFp@rR2XA{vU|H574kLf;{~0cfSP#L!nUck7B8a zHEX_u!Ka3?ZR;agvEnAK1G&X9+eWoIk89Vip;D>9G)?J4DR%(_0t|GWh=l@K*^s-B zxF3ba`oj(0AS;B=-~DBviJ zA+`v!YQnNiSeEmfMvSmPrIt&mnhXmf>Md6PuZzUXK$XQ!OibV({_*e8b9)aSc;G>- z`Su#{-gpC-XD-uCD&{!(#~-b=`v=4i0_%$bD2hec;y(QF6rMe>AOH5#f5ptqj2|0# zD~pbf4*dC_ZNZQK?#HzjNWPZQzuHoTa8(bIU^HGM%||L5LE)Q$gf=pwonQR&7wGNV zg`fQMVa&|Tpja#hj?T_5b>Nkh{zDBBRTaS~9UEki{yn7rHZbnTAGU2d{@pZT6bdL6 zi^|_5X&C(n>eFM3ej_Q#&z{@?q___d+6Yq7zYEK>P&G~1mIW9FzW@Ed#QlGDKb9?9 z9?>b)hX(zNso;xrm`awX#X=cC)0TlMpK6&F=BrgO+Xe%$e*Jp<&0jx+TW`Hp+TQu| z=kc>+M~Rj_fhQjnX~+@vV#f>_M9Oai!-8@wzUseczvGUzc=(}*aeGgXbSBS?pTX$p zPx1cyzafPjNARTTC~3TPmVX|a`#RXoax8w{|3I>*XC)qf=wW>KyMH3}_2c7bFgiMl z_s4z{{M<@N)nikXl?9{jKauUL*dTjy_tBiUfu7(k$Kw4RI{=UG>chs3e~MzUK+e+_ zU!2F!jvd3V-}@COi0Gh_A4}}zUpO34Jg`CuGc0%t4O0MdBgk_1=sm$Z1)XHmrcFd6 z!1&p5jE;_C?8N&-JFc~$mkykz6{bqA_k~b=9HGopN)@?cJJO3Ze6wfBVF3!@c&5= zYa_^KfZ9Crm%)n$S)B8O*OEFhpk^Vu{l)12Q+XXMHXa>#$@4^;Qdu0pP%4$`pZG*$ z)2yE{r21Jncej?R1gQGKy{|A8K;h{hP z7z`;mAu`m28u+Up+43*m*cJ;5r1Hn1)DlpTLo`AGpW5O8hEG2EgoysRl(}LRQgJm9 z=uT^F#DgwEG{gn)i25QZGywOXkiZr7{Zbl!Tgo8Pn;J}&w*N^P;-~vjNTvXSrHZ~Z zNVT+-b?84-O~aUFF$p~;y;x>3`TvH06BxPsr@UFaSC7Rd`S>Hyyat;nhm?J}Cq{iP z0FX|ORN&w<)Pha&I|O7n5mB#|{C~q4fNnfOfSNB_MAYs7Rg~0%AAe9tMFEsQ67BvI zhvFOV|4G3|u@GIq73e>XvLL-eeUO zAf}7bs+VyzWgh^5bduC;Ao2I!l{S~xQc~blJ1S2U$CtDi5-$Tq($u5cAYxIi#Q)bW zBz<3JAAdAyAHYRIi&O0qhnkW4e^G!!KRPjqSch+Iamn3BbM^sZ`c@r_)AIik$uc23 z5=1acjsJQ;9SjgnwZU>UwEVw>{&fT{Do1E+g!U{}`Ujfi0_aIqfUr0ns!i|PfBJN> z(?8JEeEcS2i4f9VvAVtNm2jXKo>L{&=x1&O6%hf@1B&Y^t{xfLaHvH zhImw)g#NXPsDer+i$!SmX$AkE1hF=PLhk}nw7C3-ACsZE`v5#tv#zpKssAV1X2fl| zJ}6_qR`vf){2m}owRFHoqi+ANtap8U{Lu*1zYOG|VR1TCn|S%hm{KpI#?}ffurMw_ zI;m=llhc26y%^y{uqmoe3kcprbN2xj`r{AH*g%h|u0Q$*>V6xj0AX=;(|@48$Og&2 z{r8`wMdY69_W;UI!eUyS7X6E<5dD#CKtaJmts;02sm1{9?d^eUsldT!&;m{J@rT$i zl_#s$iUA*mVzC&jd@Kbhm&*V=0Yq6UjW~iQdr&ATj90vjY%-bC*Lu6%XH?UfrqAXQtOmj4$+dA>yWwj4w-8X9y9 zpi-$Ms+ULsKK=AlImIG;D&ER}__6VroSaNlPy0urcsFqF^Ybta11ned;D*l5U_rv- zbf`A};m2f{o14Sr^p@(0SCw0ES^;cz75G4<7XI4Gs?Cg%@7% zuLlMO@Z59H`PWZA`6Qlw_F4bBudfgL_wVR`mx6z!|vU?{p+1OcjD=% zpZ5FTv112@hK78_*tTsO1_uZI@{c_72nGfQ{OfJowqa;!$iLpPV+Te?Mgr~g{q5Sd zD=?nNAAdYB-Y1@TBJe!@{r!RGed?*F@ci@7``1H5LwNDU7yavzkrBM~(o6pJo;`c; z$}6w<*ZcPE!>g~p>R&(e%rkiHwb#%nBw7aY=x|?(S}Bf3ot8f&qsG+5vO| zSOMUh?y&+u=La8ra4<>G$DcPk0F<>Y3jl%a1#XSXi^As3o3{YC0N^5kuK>&g@Rta6 zxd4&=hlYlHx-$%er2hj44*1tP^uK4%9{<{-e^0O;{d?f)-!Kep-MSS60|WjOrh!pa_qSbm?40XP$eAL$`6<4`a;F_XH%;eH5Lm#^bfm_a|$g zzZToqoiECrBtfJLIC=8qL7=g;o#r`z&oGQk&~%!4QHbjT7;$JVy#@yd19T_Se}8|! zPydEt`1J3!-P_w+``(wd;Qfx|Gpe4l!Stjkgdrnx{njhs_2|wJ?NCz&5xpc z72QUy7Iem2&uSq7{gd+bTtFKnE?{hI>~Bk@QVB?ps?$0LuJ0{i+qSFs-h1y~Am{?B zh;RY6doTcOVq)S#WKRjutldQss)=ibJRX-XUp|AHEJ+l&Oi%EZdzb*M!-o&QV_BA& z_BL%)8*%%gSb#z+j1g{EV=K# z`)+&i!3Q^Xc6N4(6ziQA3WdPEq-FSfUU{*cPTL;%iL-4xa4kmDjIqFLRFQ5e`i*Ln z%BNDX->5bz7>2FlAPz109z>NTw z!x8>+xC#I#STwjgIkE-Dr6zzm0J8wT1aQesXWaW1R~{wQmI)Ss3Vr$Q2;V;1$4zBkXxNGOVDs`xjCGLpU$EM+r_`;2pW}vkzVgECg3`{L(%E zQJ@BQ6u5J$Y>w=KR|1a>0^9l`WI`30A;;nZlbq+skt0Wr96562$dMyQjvP61 -1 and restore_cursor: self.cursor_pos = (row, col) + self.ensureCursorVisible() + # }}} # Non-prompt Rendering {{{ @@ -185,16 +237,26 @@ class Console(QTextEdit): self.formatter.render(self.tb_lexer.get_tokens(tb), self.cursor) except: prints(tb, end='') + self.ensureCursorVisible() + QCoreApplication.processEvents() def show_output(self, raw): + def do_show(): + try: + self.buf.append(raw) + self.formatter.render_raw(raw, self.cursor) + except: + import traceback + prints(traceback.format_exc()) + prints(raw, end='') + if self.prompt_frame is not None: - # At a prompt, so redirect output - return prints(raw, end='') - try: - self.buf.append(raw) - self.formatter.render_raw(raw, self.cursor) - except: - prints(raw, end='') + with Prepender(self): + do_show() + else: + do_show() + self.ensureCursorVisible() + QCoreApplication.processEvents() # }}} @@ -203,16 +265,11 @@ class Console(QTextEdit): def keyPressEvent(self, ev): text = unicode(ev.text()) key = ev.key() - if key in (Qt.Key_Enter, Qt.Key_Return): - self.enter_pressed() - elif key == Qt.Key_Home: - self.home_pressed() - elif key == Qt.Key_End: - self.end_pressed() - elif key == Qt.Key_Left: - self.left_pressed() - elif key == Qt.Key_Right: - self.right_pressed() + action = self.key_dispatcher.get(key, None) + if callable(action): + action() + elif key in (Qt.Key_Escape,): + QTextEdit.keyPressEvent(self, ev) elif text: self.text_typed(text) else: @@ -230,6 +287,7 @@ class Console(QTextEdit): c.movePosition(c.Up) c.movePosition(c.EndOfLine) self.setTextCursor(c) + self.ensureCursorVisible() def right_pressed(self): lineno, pos = self.cursor_pos @@ -242,6 +300,7 @@ class Console(QTextEdit): elif lineno < len(cp)-1: c.movePosition(c.NextCharacter, n=1+self.prompt_len) self.setTextCursor(c) + self.ensureCursorVisible() def home_pressed(self): if self.prompt_frame is not None: @@ -249,12 +308,14 @@ class Console(QTextEdit): c.movePosition(c.StartOfLine) c.movePosition(c.NextCharacter, n=self.prompt_len) self.setTextCursor(c) + self.ensureCursorVisible() def end_pressed(self): if self.prompt_frame is not None: c = self.cursor c.movePosition(c.EndOfLine) self.setTextCursor(c) + self.ensureCursorVisible() def enter_pressed(self): if self.prompt_frame is None: @@ -267,7 +328,13 @@ class Console(QTextEdit): self.prompt_frame = None oldbuf = self.buf self.buf = [] - ret = self.interpreter.runsource('\n'.join(cp)) + self.running.emit() + try: + ret = self.interpreter.runsource('\n'.join(cp)) + except SystemExit: + ret = False + self.show_output('Raising SystemExit not allowed\n') + self.running_done.emit() if ret: # Incomplete command self.buf = oldbuf self.prompt_frame = old_pf @@ -275,7 +342,13 @@ class Console(QTextEdit): c.insertBlock() self.setTextCursor(c) else: # Command completed - old_pf.setFrameFormat(QTextFrameFormat()) + try: + old_pf.setFrameFormat(QTextFrameFormat()) + except RuntimeError: + # Happens if enough lines of output that the old + # frame was deleted + pass + self.render_current_prompt() def text_typed(self, text): diff --git a/src/calibre/utils/pyconsole/formatter.py b/src/calibre/utils/pyconsole/formatter.py index 7f99983ef6..9409007ec6 100644 --- a/src/calibre/utils/pyconsole/formatter.py +++ b/src/calibre/utils/pyconsole/formatter.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' from PyQt4.Qt import QTextCharFormat, QFont, QBrush, QColor from pygments.formatter import Formatter as PF -from pygments.token import Token +from pygments.token import Token, Generic class Formatter(object): @@ -22,11 +22,16 @@ class Formatter(object): pf = PF(**options) self.styles = {} self.normal = self.base_fmt() + self.background_color = pf.style.background_color + self.color = 'black' + for ttype, ndef in pf.style: fmt = self.base_fmt() if ndef['color']: fmt.setForeground(QBrush(QColor('#%s'%ndef['color']))) fmt.setUnderlineColor(QColor('#%s'%ndef['color'])) + if ttype == Generic.Output: + self.color = '#%s'%ndef['color'] if ndef['bold']: fmt.setFontWeight(QFont.Bold) if ndef['italic']: @@ -40,6 +45,11 @@ class Formatter(object): self.styles[ttype] = fmt + self.stylesheet = ''' + QTextEdit { color: %s; background-color: %s } + '''%(self.color, self.background_color) + + def base_fmt(self): fmt = QTextCharFormat() fmt.setFontFamily('monospace') @@ -74,7 +84,7 @@ class Formatter(object): def render_prompt(self, is_continuation, cursor): pr = self.continuation if is_continuation else self.prompt - fmt = self.styles[Token.Generic.Subheading] + fmt = self.styles[Generic.Prompt] cursor.insertText(pr, fmt) diff --git a/src/calibre/utils/pyconsole/main.py b/src/calibre/utils/pyconsole/main.py index af99ec66bb..f098ce2ee2 100644 --- a/src/calibre/utils/pyconsole/main.py +++ b/src/calibre/utils/pyconsole/main.py @@ -6,19 +6,31 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' __version__ = '0.1.0' -from PyQt4.Qt import QMainWindow, QToolBar, QStatusBar, QLabel, QFont, Qt, \ - QApplication +from functools import partial + +from PyQt4.Qt import QDialog, QToolBar, QStatusBar, QLabel, QFont, Qt, \ + QApplication, QIcon, QVBoxLayout from calibre.constants import __appname__, __version__ from calibre.utils.pyconsole.console import Console -class MainWindow(QMainWindow): +class MainWindow(QDialog): - def __init__(self, default_status_msg): + def __init__(self, + default_status_msg=_('Welcome to') + ' ' + __appname__+' console', + parent=None): - QMainWindow.__init__(self) + QDialog.__init__(self, parent) + self.l = QVBoxLayout() + self.setLayout(self.l) - self.resize(600, 700) + self.resize(800, 600) + + # Setup tool bar {{{ + self.tool_bar = QToolBar(self) + self.tool_bar.setToolButtonStyle(Qt.ToolButtonTextOnly) + self.l.addWidget(self.tool_bar) + # }}} # Setup status bar {{{ self.status_bar = QStatusBar(self) @@ -28,25 +40,23 @@ class MainWindow(QMainWindow): self.status_bar._font.setBold(True) self.status_bar.defmsg.setFont(self.status_bar._font) self.status_bar.addWidget(self.status_bar.defmsg) - self.setStatusBar(self.status_bar) # }}} - # Setup tool bar {{{ - self.tool_bar = QToolBar(self) - self.addToolBar(Qt.BottomToolBarArea, self.tool_bar) - self.tool_bar.setToolButtonStyle(Qt.ToolButtonTextOnly) - # }}} - - self.editor = Console(parent=self) - self.setCentralWidget(self.editor) - + self.console = Console(parent=self) + self.console.running.connect(partial(self.status_bar.showMessage, + _('Code is running'))) + self.console.running_done.connect(self.status_bar.clearMessage) + self.l.addWidget(self.console) + self.l.addWidget(self.status_bar) + self.setWindowTitle(__appname__ + ' console') + self.setWindowIcon(QIcon(I('console.png'))) def main(): QApplication.setApplicationName(__appname__+' console') QApplication.setOrganizationName('Kovid Goyal') app = QApplication([]) - m = MainWindow(_('Welcome to') + ' ' + __appname__+' console') + m = MainWindow() m.show() app.exec_() From 3fff4da652dd242fbdeb52c8d5676043c02df7c4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 20 Sep 2010 21:32:29 -0600 Subject: [PATCH 066/412] Infrastructure changes to launch pyconsole interpreter process --- src/calibre/utils/ipc/launch.py | 21 ++++++++++++--------- src/calibre/utils/ipc/worker.py | 4 ++++ src/calibre/utils/pyconsole/console.py | 1 + 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/calibre/utils/ipc/launch.py b/src/calibre/utils/ipc/launch.py index 0de81ed644..aa93469119 100644 --- a/src/calibre/utils/ipc/launch.py +++ b/src/calibre/utils/ipc/launch.py @@ -22,13 +22,15 @@ class Worker(object): have the environment variable :envvar:`CALIBRE_WORKER` set. Useful attributes: ``is_alive``, ``returncode`` - usefule methods: ``kill`` + Useful methods: ``kill`` To launch child simply call the Worker object. By default, the child's output is redirected to an on disk file, the path to which is returned by the call. ''' + exe_name = 'calibre-parallel' + @property def osx_interpreter(self): exe = os.path.basename(sys.executable) @@ -41,32 +43,33 @@ class Worker(object): @property def executable(self): + e = self.exe_name if iswindows: return os.path.join(os.path.dirname(sys.executable), - 'calibre-parallel.exe' if isfrozen else \ - 'Scripts\\calibre-parallel.exe') + e+'.exe' if isfrozen else \ + 'Scripts\\%s.exe'%e) if isnewosx: - return os.path.join(sys.console_binaries_path, 'calibre-parallel') + return os.path.join(sys.console_binaries_path, e) if isosx: - if not isfrozen: return 'calibre-parallel' + if not isfrozen: return e contents = os.path.join(self.osx_contents_dir, 'console.app', 'Contents') return os.path.join(contents, 'MacOS', self.osx_interpreter) if isfrozen: - return os.path.join(getattr(sys, 'frozen_path'), 'calibre-parallel') + return os.path.join(getattr(sys, 'frozen_path'), e) - c = os.path.join(sys.executables_location, 'calibre-parallel') + c = os.path.join(sys.executables_location, e) if os.access(c, os.X_OK): return c - return 'calibre-parallel' + return e @property def gui_executable(self): if isnewosx: - return os.path.join(sys.binaries_path, 'calibre-parallel') + return os.path.join(sys.binaries_path, self.exe_name) if isfrozen and isosx: return os.path.join(self.osx_contents_dir, diff --git a/src/calibre/utils/ipc/worker.py b/src/calibre/utils/ipc/worker.py index 73233840fe..b7510426aa 100644 --- a/src/calibre/utils/ipc/worker.py +++ b/src/calibre/utils/ipc/worker.py @@ -80,8 +80,12 @@ def main(): if isosx and 'CALIBRE_WORKER_ADDRESS' not in os.environ: # On some OS X computers launchd apparently tries to # launch the last run process from the bundle + # so launch the gui as usual from calibre.gui2.main import main as gui_main return gui_main(['calibre']) + if 'CALIBRE_LAUNCH_INTERPRETER' in os.environ: + from calibre.utils.pyconsole.interpreter import main + return main() address = cPickle.loads(unhexlify(os.environ['CALIBRE_WORKER_ADDRESS'])) key = unhexlify(os.environ['CALIBRE_WORKER_KEY']) resultf = unhexlify(os.environ['CALIBRE_WORKER_RESULT']) diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index 251e8424a0..f741562f03 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -47,6 +47,7 @@ class Prepender(object): # {{{ self.console.cursor_pos = self.opos # }}} + class Console(QTextEdit): running = pyqtSignal() From ff73865d9e75d5d4e44eb584961209654d7239e9 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 21 Sep 2010 14:13:03 +0100 Subject: [PATCH 067/412] Prevent cross-thread lock errors by having the cover cache get the image on the GUI thread. --- src/calibre/gui2/__init__.py | 30 +++++++++++++++++++++++++++++- src/calibre/gui2/library/models.py | 4 ++-- src/calibre/library/caches.py | 7 +++++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index e58dce5559..ba32c09e06 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -1,7 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' """ The GUI """ -import os, sys +import os, sys, Queue from threading import RLock from PyQt4.Qt import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, \ @@ -296,6 +296,34 @@ class Dispatcher(QObject): def dispatch(self, args, kwargs): self.func(*args, **kwargs) +class FunctionDispatcher(QObject): + ''' + Convenience class to use Qt signals with arbitrary python functions. + By default, ensures that a function call always happens in the + thread this Dispatcher was created in. + ''' + dispatch_signal = pyqtSignal(object, object, object) + + def __init__(self, func, queued=True, parent=None): + QObject.__init__(self, parent) + self.func = func + typ = Qt.QueuedConnection + if not queued: + typ = Qt.AutoConnection if queued is None else Qt.DirectConnection + self.dispatch_signal.connect(self.dispatch, type=typ) + + def __call__(self, *args, **kwargs): + q = Queue.Queue() + self.dispatch_signal.emit(q, args, kwargs) + return q.get() + + def dispatch(self, q, args, kwargs): + try: + res = self.func(*args, **kwargs) + except: + res = None + q.put(res) + class GetMetadata(QObject): ''' Convenience class to ensure that metadata readers are used only in the diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 6941869e44..4b1e974b12 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -12,7 +12,7 @@ from operator import attrgetter from PyQt4.Qt import QAbstractTableModel, Qt, pyqtSignal, QIcon, QImage, \ QModelIndex, QVariant, QDate -from calibre.gui2 import NONE, config, UNDEFINED_QDATE +from calibre.gui2 import NONE, config, UNDEFINED_QDATE, FunctionDispatcher from calibre.utils.pyparsing import ParseException from calibre.ebooks.metadata import fmt_sidx, authors_to_string, string_to_authors from calibre.ptempfile import PersistentTemporaryFile @@ -151,7 +151,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.database_changed.emit(db) if self.cover_cache is not None: self.cover_cache.stop() - self.cover_cache = CoverCache(db) + self.cover_cache = CoverCache(db, FunctionDispatcher(self.db.cover)) self.cover_cache.start() def refresh_cover(event, ids): if event == 'cover' and self.cover_cache is not None: diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 5f7fbdccc9..573c1f5797 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -23,10 +23,11 @@ from calibre import fit_image class CoverCache(Thread): - def __init__(self, db): + def __init__(self, db, cover_func): Thread.__init__(self) self.daemon = True self.db = db + self.cover_func = cover_func self.load_queue = Queue() self.keep_running = True self.cache = {} @@ -37,7 +38,9 @@ class CoverCache(Thread): self.keep_running = False def _image_for_id(self, id_): - img = self.db.cover(id_, index_is_id=True, as_image=True) + import time + time.sleep(0.050) # Limit 20/second to not overwhelm the GUI + img = self.cover_func(id_, index_is_id=True, as_image=True) if img is None: img = QImage() if not img.isNull(): From be2210f928d0023ae1f752aeea3fb51f84132e8d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 21 Sep 2010 15:26:02 +0100 Subject: [PATCH 068/412] Add 'start series renumbering from N' to bulk edit. --- src/calibre/gui2/dialogs/metadata_bulk.py | 25 +++++++- src/calibre/gui2/dialogs/metadata_bulk.ui | 69 +++++++++++++++++++---- 2 files changed, 79 insertions(+), 15 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 7122fe14fa..8a692d94d5 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -31,7 +31,8 @@ class Worker(Thread): def doit(self): remove, add, au, aus, do_aus, rating, pub, do_series, \ do_autonumber, do_remove_format, remove_format, do_swap_ta, \ - do_remove_conv, do_auto_author, series = self.args + do_remove_conv, do_auto_author, series, do_series_restart, \ + series_start_value = self.args # first loop: do author and title. These will commit at the end of each # operation, because each operation modifies the file system. We want to @@ -69,7 +70,11 @@ class Worker(Thread): self.db.set_publisher(id, pub, notify=False, commit=False) if do_series: - next = self.db.get_next_series_num_for(series) + if do_series_restart: + next = series_start_value + series_start_value += 1 + else: + next = self.db.get_next_series_num_for(series) self.db.set_series(id, series, notify=False, commit=False) num = next if do_autonumber and series else 1.0 self.db.set_series_index(id, num, notify=False, commit=False) @@ -163,6 +168,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.series.currentIndexChanged[int].connect(self.series_changed) self.series.editTextChanged.connect(self.series_changed) self.tag_editor_button.clicked.connect(self.tag_editor) + self.autonumber_series.stateChanged[int].connect(self.auto_number_changed) if len(db.custom_column_label_map) == 0: self.central_widget.removeTab(1) @@ -538,6 +544,16 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.tags.update_tags_cache(self.db.all_tags()) self.remove_tags.update_tags_cache(self.db.all_tags()) + def auto_number_changed(self, state): + if state: + self.series_numbering_restarts.setEnabled(True) + self.series_start_number.setEnabled(True) + else: + self.series_numbering_restarts.setEnabled(False) + self.series_numbering_restarts.setChecked(False) + self.series_start_number.setEnabled(False) + self.series_start_number.setValue(1) + def accept(self): if len(self.ids) < 1: return QDialog.accept(self) @@ -566,6 +582,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): do_series = self.write_series series = unicode(self.series.currentText()).strip() do_autonumber = self.autonumber_series.isChecked() + do_series_restart = self.series_numbering_restarts.isChecked() + series_start_value = self.series_start_number.value() do_remove_format = self.remove_format.currentIndex() > -1 remove_format = unicode(self.remove_format.currentText()) do_swap_ta = self.swap_title_and_author.isChecked() @@ -574,7 +592,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): args = (remove, add, au, aus, do_aus, rating, pub, do_series, do_autonumber, do_remove_format, remove_format, do_swap_ta, - do_remove_conv, do_auto_author, series) + do_remove_conv, do_auto_author, series, do_series_restart, + series_start_value) bb = BlockingBusy(_('Applying changes to %d books. This may take a while.') %len(self.ids), parent=self) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index f28f3fb57c..10e22c5df9 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -270,18 +270,63 @@ - - - - Selected books will be automatically numbered, -in the order you selected them. -So if you selected Book A and then Book B, + + + + + + If not checked, the series number for the books will be set to 1. +If checked, selected books will be automatically numbered, in the order +you selected them. So if you selected Book A and then Book B, Book A will have series number 1 and Book B series number 2. - - - Automatically number books in this series - - + + + Automatically number books in this series + + + + + + + false + + + Series will normally be renumbered from the highest number in the database +for that series. Checking this box will tell calibre to start numbering +from the value in the box + + + Force numbers to start with + + + + + + + false + + + 1 + + + 1 + + + + + + + Qt::Horizontal + + + + 20 + 10 + + + + + @@ -599,7 +644,7 @@ nothing should be put between the original text and the inserted text 20 - 40 + 0 From 8a3aa64776aaf11c9909a6518c4f0f90f55a2946 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 21 Sep 2010 15:53:54 +0100 Subject: [PATCH 069/412] Changed sort to use field_metadata.search_term_to_field_key. In the process, refactored field_metadata and LibraryDatabase2 to use the same method names for the same function (in more cases). --- src/calibre/library/caches.py | 11 ++++------- src/calibre/library/database2.py | 4 ++-- src/calibre/library/field_metadata.py | 4 ++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 573c1f5797..d310a0e6fe 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -334,7 +334,7 @@ class ResultCache(SearchQueryParser): if query and query.strip(): # get metadata key associated with the search term. Eliminates # dealing with plurals and other aliases - location = self.field_metadata.search_term_to_key(location.lower().strip()) + location = self.field_metadata.search_term_to_field_key(location.lower().strip()) if isinstance(location, list): if allow_recursion: for loc in location: @@ -610,12 +610,9 @@ class ResultCache(SearchQueryParser): # Sorting functions {{{ def sanitize_sort_field_name(self, field): - field = field.lower().strip() - if field not in self.field_metadata.iterkeys(): - if field in ('author', 'tag', 'comment'): - field += 's' - if field == 'date': field = 'timestamp' - elif field == 'title': field = 'sort' + field = self.field_metadata.search_term_to_field_key(field.lower().strip()) + # translate some fields to their hidden equivalent + if field == 'title': field = 'sort' elif field == 'authors': field = 'author_sort' return field diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index c1ada94a84..77e3afc8a3 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -552,10 +552,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return self.field_metadata.sortable_field_keys() def searchable_fields(self): - return self.field_metadata.searchable_field_keys() + return self.field_metadata.searchable_fields() def search_term_to_field_key(self, term): - return self.field_metadata.search_term_to_key(term) + return self.field_metadata.search_term_to_field_key(term) def metadata_for_field(self, key): return self.field_metadata[key] diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index a8031e5172..bac423f46d 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -501,12 +501,12 @@ class FieldMetadata(dict): raise ValueError('Attempt to add duplicate search term "%s"'%t) self._search_term_map[t] = key - def search_term_to_key(self, term): + def search_term_to_field_key(self, term): if term in self._search_term_map: return self._search_term_map[term] return term - def searchable_field_keys(self): + def searchable_fields(self): return [k for k in self._tb_cats.keys() if self._tb_cats[k]['kind']=='field' and len(self._tb_cats[k]['search_terms']) > 0] From ba6f2f0c5e6cd9943827cda2ccc4a59d32fdbb8b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 21 Sep 2010 18:50:21 +0100 Subject: [PATCH 070/412] Take out commit= parameter on set_authors and set_title. Change other code where necessary --- src/calibre/gui2/dialogs/metadata_bulk.py | 5 ++++- src/calibre/library/database2.py | 19 ++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 8a692d94d5..18d00191cc 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -484,7 +484,10 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): setter = self.db.set_comment else: setter = getattr(self.db, 'set_'+dest) - setter(id, val, notify=False, commit=False) + if dest in ['title', 'authors']: + setter(id, val, notify=False) + else: + setter(id, val, notify=False, commit=False) self.db.commit() dynamic['s_r_search_mode'] = self.search_mode.currentIndex() diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 77e3afc8a3..1fdacfc09f 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -407,7 +407,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): path = path.lower() return path - def set_path(self, index, index_is_id=False, commit=True): + def set_path(self, index, index_is_id=False): ''' Set the path to the directory containing this books files based on its current title and author. If there was a previous directory, its contents @@ -447,8 +447,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.add_format(id, format, stream, index_is_id=True, path=tpath, notify=False) self.conn.execute('UPDATE books SET path=? WHERE id=?', (path, id)) - if commit: - self.conn.commit() + self.conn.commit() self.data.set(id, self.FIELD_MAP['path'], path, row_is_id=True) # Delete not needed directories if current_path and os.path.exists(spath): @@ -1212,7 +1211,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): result.append(r) return ' & '.join(result).replace('|', ',') - def set_authors(self, id, authors, notify=True, commit=True): + def set_authors(self, id, authors, notify=True): ''' `authors`: A list of authors. ''' @@ -1240,17 +1239,16 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): ss = self.author_sort_from_book(id, index_is_id=True) self.conn.execute('UPDATE books SET author_sort=? WHERE id=?', (ss, id)) - if commit: - self.conn.commit() + self.conn.commit() self.data.set(id, self.FIELD_MAP['authors'], ','.join([a.replace(',', '|') for a in authors]), row_is_id=True) self.data.set(id, self.FIELD_MAP['author_sort'], ss, row_is_id=True) - self.set_path(id, index_is_id=True, commit=commit) + self.set_path(id, index_is_id=True) if notify: self.notify('metadata', [id]) - def set_title(self, id, title, notify=True, commit=True): + def set_title(self, id, title, notify=True): if not title: return if not isinstance(title, unicode): @@ -1261,9 +1259,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.data.set(id, self.FIELD_MAP['sort'], title_sort(title), row_is_id=True) else: self.data.set(id, self.FIELD_MAP['sort'], title, row_is_id=True) - self.set_path(id, index_is_id=True, commit=commit) - if commit: - self.conn.commit() + self.set_path(id, index_is_id=True) + self.conn.commit() if notify: self.notify('metadata', [id]) From a62ad5f70cbae026d64d183117a3ec02de59444c Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 21 Sep 2010 20:20:34 +0100 Subject: [PATCH 071/412] Use one queue object in FunctionDispatch. Theory: the producer (Qt GUI cover function) exists only once per instance of FunctionDispatcher. This follows from the fact that the dispatcher instance is created on the recipient thread. The consumer (the cover cache) could in theory be multiple threads (but it isn't). Because the items produced by the producer are not equivalent, we need to ensure that the order of items put in the queue by the producer is equal to the order of the requests. To guarantee this order, regardless of the number of consumer threads, we ensure that only one request to the producer can be outstanding. --- src/calibre/gui2/__init__.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 66e199b8a0..8cfcc17eba 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -1,7 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' """ The GUI """ -import os, sys, Queue +import os, sys, Queue, threading from threading import RLock from PyQt4.Qt import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, \ @@ -311,11 +311,14 @@ class FunctionDispatcher(QObject): if not queued: typ = Qt.AutoConnection if queued is None else Qt.DirectConnection self.dispatch_signal.connect(self.dispatch, type=typ) + self.q = Queue.Queue() + self.lock = threading.Lock() def __call__(self, *args, **kwargs): - q = Queue.Queue() - self.dispatch_signal.emit(q, args, kwargs) - return q.get() + with self.lock: + self.dispatch_signal.emit(self.q, args, kwargs) + res = self.q.get() + return res def dispatch(self, q, args, kwargs): try: From 06173bccebb0d8b3df497d0d0df030c1710aa80b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Sep 2010 13:45:34 -0600 Subject: [PATCH 072/412] Second beta --- src/calibre/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 334406e01b..91c114359c 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.900' +__version__ = '0.7.901' __author__ = "Kovid Goyal " import re From 63f02aa91beaa330a45d8c572cb6e092832b6cb0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Sep 2010 15:19:14 -0600 Subject: [PATCH 073/412] Fix regression in get_metadata for books with no formats --- src/calibre/library/database2.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 01d46083b2..3e7b932808 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -590,7 +590,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.pubdate = self.pubdate(idx, index_is_id=index_is_id) mi.uuid = self.uuid(idx, index_is_id=index_is_id) mi.title_sort = self.title_sort(idx, index_is_id=index_is_id) - mi.formats = self.formats(idx, index_is_id=index_is_id).split(',') + mi.formats = self.formats(idx, index_is_id=index_is_id) + if hasattr(mi.formats, 'split'): + mi.formats = mi.formats.split(',') + else: + mi.formats = None tags = self.tags(idx, index_is_id=index_is_id) if tags: mi.tags = [i.strip() for i in tags.split(',')] From d225fd9ff5c08083d79238f489cd72abbef8b61d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Sep 2010 15:22:00 -0600 Subject: [PATCH 074/412] Allow --reinitialize-db to use an SQL dump from elsewhere --- src/calibre/debug.py | 47 ++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/calibre/debug.py b/src/calibre/debug.py index 8a2097ddd1..8cc125b118 100644 --- a/src/calibre/debug.py +++ b/src/calibre/debug.py @@ -36,13 +36,17 @@ Run an embedded python interpreter. 'plugin code.') parser.add_option('--reinitialize-db', default=None, help='Re-initialize the sqlite calibre database at the ' - 'specified path. Useful to recover from db corruption.') + 'specified path. Useful to recover from db corruption.' + ' You can also specify the path to an SQL dump which ' + 'will be used instead of trying to dump the database.' + ' This can be useful when dumping fails, but dumping ' + 'with sqlite3 works.') parser.add_option('-p', '--py-console', help='Run python console', default=False, action='store_true') return parser -def reinit_db(dbpath, callback=None): +def reinit_db(dbpath, callback=None, sql_dump=None): if not os.path.exists(dbpath): raise ValueError(dbpath + ' does not exist') from calibre.library.sqlite import connect @@ -52,26 +56,32 @@ def reinit_db(dbpath, callback=None): uv = conn.get('PRAGMA user_version;', all=False) conn.execute('PRAGMA writable_schema=ON') conn.commit() - sql_lines = conn.dump() + if sql_dump is None: + sql_lines = conn.dump() + else: + sql_lines = open(sql_dump, 'rb').read() conn.close() dest = dbpath + '.tmp' try: with closing(connect(dest, False)) as nconn: nconn.execute('create temporary table temp_sequence(id INTEGER PRIMARY KEY AUTOINCREMENT)') nconn.commit() - if callable(callback): - callback(len(sql_lines), True) - for i, line in enumerate(sql_lines): - try: - nconn.execute(line) - except: - import traceback - prints('SQL line %r failed with error:'%line) - prints(traceback.format_exc()) - continue - finally: - if callable(callback): - callback(i, False) + if sql_dump is None: + if callable(callback): + callback(len(sql_lines), True) + for i, line in enumerate(sql_lines): + try: + nconn.execute(line) + except: + import traceback + prints('SQL line %r failed with error:'%line) + prints(traceback.format_exc()) + continue + finally: + if callable(callback): + callback(i, False) + else: + nconn.executescript(sql_lines) nconn.execute('pragma user_version=%d'%int(uv)) nconn.commit() os.remove(dbpath) @@ -170,7 +180,10 @@ def main(args=sys.argv): prints('CALIBRE_EXTENSIONS_PATH='+sys.extensions_location) prints('CALIBRE_PYTHON_PATH='+os.pathsep.join(sys.path)) elif opts.reinitialize_db is not None: - reinit_db(opts.reinitialize_db) + sql_dump = None + if len(args) > 1 and os.access(args[-1], os.R_OK): + sql_dump = args[-1] + reinit_db(opts.reinitialize_db, sql_dump=sql_dump) else: from calibre import ipython ipython() From 7f472f742ece9ada0736690c440dc2e9da30cc74 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Sep 2010 21:05:23 -0600 Subject: [PATCH 075/412] Styling cleanups --- src/calibre/utils/pyconsole/formatter.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/calibre/utils/pyconsole/formatter.py b/src/calibre/utils/pyconsole/formatter.py index 9409007ec6..6e7d982a82 100644 --- a/src/calibre/utils/pyconsole/formatter.py +++ b/src/calibre/utils/pyconsole/formatter.py @@ -8,18 +8,20 @@ __docformat__ = 'restructuredtext en' from PyQt4.Qt import QTextCharFormat, QFont, QBrush, QColor from pygments.formatter import Formatter as PF -from pygments.token import Token, Generic +from pygments.token import Token, Generic, string_to_tokentype class Formatter(object): - def __init__(self, prompt, continuation, **options): + def __init__(self, prompt, continuation, style='default'): if len(prompt) != len(continuation): raise ValueError('%r does not have the same length as %r' % (prompt, continuation)) self.prompt, self.continuation = prompt, continuation + self.set_style(style) - pf = PF(**options) + def set_style(self, style): + pf = PF(style=style) self.styles = {} self.normal = self.base_fmt() self.background_color = pf.style.background_color @@ -27,6 +29,7 @@ class Formatter(object): for ttype, ndef in pf.style: fmt = self.base_fmt() + fmt.setProperty(fmt.UserProperty, str(ttype)) if ndef['color']: fmt.setForeground(QBrush(QColor('#%s'%ndef['color']))) fmt.setUnderlineColor(QColor('#%s'%ndef['color'])) @@ -49,6 +52,14 @@ class Formatter(object): QTextEdit { color: %s; background-color: %s } '''%(self.color, self.background_color) + def get_fmt(self, token): + if type(token) != type(Token.Generic): + token = string_to_tokentype(token) + fmt = self.styles.get(token, None) + if fmt is None: + fmt = self.base_fmt() + fmt.setProperty(fmt.UserProperty, str(token)) + return fmt def base_fmt(self): fmt = QTextCharFormat() @@ -59,7 +70,7 @@ class Formatter(object): cursor.insertText(raw, self.normal) def render_syntax_error(self, tb, cursor): - fmt = self.styles[Token.Error] + fmt = self.get_fmt(Token.Error) cursor.insertText(tb, fmt) def render(self, tokens, cursor): @@ -84,7 +95,9 @@ class Formatter(object): def render_prompt(self, is_continuation, cursor): pr = self.continuation if is_continuation else self.prompt - fmt = self.styles[Generic.Prompt] + fmt = self.get_fmt(Generic.Prompt) + if fmt is None: + fmt = self.base_fmt() cursor.insertText(pr, fmt) From 35dba964c6241d5600d6aeba4bfcf27d104ee8f9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Sep 2010 21:46:56 -0600 Subject: [PATCH 076/412] Theming support for console via right click menu --- src/calibre/utils/pyconsole/__init__.py | 14 +++++--- src/calibre/utils/pyconsole/console.py | 44 +++++++++++++++++++++--- src/calibre/utils/pyconsole/formatter.py | 4 --- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/calibre/utils/pyconsole/__init__.py b/src/calibre/utils/pyconsole/__init__.py index 0dfa9398e1..06a7011132 100644 --- a/src/calibre/utils/pyconsole/__init__.py +++ b/src/calibre/utils/pyconsole/__init__.py @@ -8,14 +8,18 @@ __docformat__ = 'restructuredtext en' import sys from calibre import prints as prints_ -from calibre.utils.config import Config, StringConfig +from calibre.utils.config import Config, ConfigProxy -def console_config(defaults=None): - desc=_('Settings to control the calibre content server') - c = Config('console', desc) if defaults is None else StringConfig(defaults, desc) +def console_config(): + desc='Settings to control the calibre console' + c = Config('console', desc) - c.add_opt('--theme', default='default', help='The color theme') + c.add_opt('theme', default='default', help='The color theme') + + return c + +prefs = ConfigProxy(console_config()) def prints(*args, **kwargs): diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index f741562f03..b0ecce0cb3 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -6,16 +6,18 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' import sys, textwrap, traceback, StringIO +from functools import partial from PyQt4.Qt import QTextEdit, Qt, QTextFrameFormat, pyqtSignal, \ - QCoreApplication + QCoreApplication, QColor, QPalette, QMenu, QActionGroup from pygments.lexers import PythonLexer, PythonTracebackLexer +from pygments.styles import get_all_styles from calibre.constants import __appname__, __version__ from calibre.utils.pyconsole.formatter import Formatter from calibre.utils.pyconsole.repl import Interpreter, DummyFile -from calibre.utils.pyconsole import prints +from calibre.utils.pyconsole import prints, prefs from calibre.gui2 import error_dialog class EditBlock(object): # {{{ @@ -47,6 +49,28 @@ class Prepender(object): # {{{ self.console.cursor_pos = self.opos # }}} +class ThemeMenu(QMenu): + + def __init__(self, parent): + QMenu.__init__(self, _('Choose theme (needs restart)')) + parent.addMenu(self) + self.group = QActionGroup(self) + current = prefs['theme'] + alls = list(sorted(get_all_styles())) + if current not in alls: + current = prefs['theme'] = 'default' + self.actions = [] + for style in alls: + ac = self.group.addAction(style) + if current == style: + ac.setChecked(True) + self.actions.append(ac) + ac.triggered.connect(partial(self.set_theme, style)) + self.addAction(ac) + + def set_theme(self, style, *args): + prefs['theme'] = style + class Console(QTextEdit): @@ -99,8 +123,16 @@ class Console(QTextEdit): self.doc.setMaximumBlockCount(10000) self.lexer = PythonLexer(ensurenl=False) self.tb_lexer = PythonTracebackLexer() - self.formatter = Formatter(prompt, continuation, style='default') - self.setStyleSheet(self.formatter.stylesheet) + + self.context_menu = cm = QMenu(self) # {{{ + cm.theme = ThemeMenu(cm) + # }}} + + self.formatter = Formatter(prompt, continuation, style=prefs['theme']) + p = QPalette() + p.setColor(p.Base, QColor(self.formatter.background_color)) + p.setColor(p.Text, QColor(self.formatter.color)) + self.setPalette(p) self.key_dispatcher = { # {{{ Qt.Key_Enter : self.enter_pressed, @@ -127,6 +159,10 @@ class Console(QTextEdit): sys.excepthook = self.unhandled_exception + def contextMenuEvent(self, event): + self.context_menu.popup(event.globalPos()) + event.accept() + # Prompt management {{{ diff --git a/src/calibre/utils/pyconsole/formatter.py b/src/calibre/utils/pyconsole/formatter.py index 6e7d982a82..17360fecb3 100644 --- a/src/calibre/utils/pyconsole/formatter.py +++ b/src/calibre/utils/pyconsole/formatter.py @@ -48,10 +48,6 @@ class Formatter(object): self.styles[ttype] = fmt - self.stylesheet = ''' - QTextEdit { color: %s; background-color: %s } - '''%(self.color, self.background_color) - def get_fmt(self, token): if type(token) != type(Token.Generic): token = string_to_tokentype(token) From e7adf45c01b21a584158728de903837d79f82298 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Sep 2010 22:21:36 -0600 Subject: [PATCH 077/412] Restart and context menu added to console --- src/calibre/utils/pyconsole/__init__.py | 2 +- src/calibre/utils/pyconsole/console.py | 5 +++-- src/calibre/utils/pyconsole/main.py | 23 ++++++++++++++++++----- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/calibre/utils/pyconsole/__init__.py b/src/calibre/utils/pyconsole/__init__.py index 06a7011132..32eb926143 100644 --- a/src/calibre/utils/pyconsole/__init__.py +++ b/src/calibre/utils/pyconsole/__init__.py @@ -15,7 +15,7 @@ def console_config(): desc='Settings to control the calibre console' c = Config('console', desc) - c.add_opt('theme', default='default', help='The color theme') + c.add_opt('theme', default='native', help='The color theme') return c diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index b0ecce0cb3..164cf4e2ca 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -49,7 +49,7 @@ class Prepender(object): # {{{ self.console.cursor_pos = self.opos # }}} -class ThemeMenu(QMenu): +class ThemeMenu(QMenu): # {{{ def __init__(self, parent): QMenu.__init__(self, _('Choose theme (needs restart)')) @@ -62,6 +62,7 @@ class ThemeMenu(QMenu): self.actions = [] for style in alls: ac = self.group.addAction(style) + ac.setCheckable(True) if current == style: ac.setChecked(True) self.actions.append(ac) @@ -71,6 +72,7 @@ class ThemeMenu(QMenu): def set_theme(self, style, *args): prefs['theme'] = style +# }}} class Console(QTextEdit): @@ -163,7 +165,6 @@ class Console(QTextEdit): self.context_menu.popup(event.globalPos()) event.accept() - # Prompt management {{{ @dynamic_property diff --git a/src/calibre/utils/pyconsole/main.py b/src/calibre/utils/pyconsole/main.py index f098ce2ee2..a5a4b42266 100644 --- a/src/calibre/utils/pyconsole/main.py +++ b/src/calibre/utils/pyconsole/main.py @@ -9,7 +9,7 @@ __version__ = '0.1.0' from functools import partial from PyQt4.Qt import QDialog, QToolBar, QStatusBar, QLabel, QFont, Qt, \ - QApplication, QIcon, QVBoxLayout + QApplication, QIcon, QVBoxLayout, QAction from calibre.constants import __appname__, __version__ from calibre.utils.pyconsole.console import Console @@ -19,8 +19,9 @@ class MainWindow(QDialog): def __init__(self, default_status_msg=_('Welcome to') + ' ' + __appname__+' console', parent=None): - QDialog.__init__(self, parent) + + self.restart_requested = False self.l = QVBoxLayout() self.setLayout(self.l) @@ -51,14 +52,26 @@ class MainWindow(QDialog): self.setWindowTitle(__appname__ + ' console') self.setWindowIcon(QIcon(I('console.png'))) + self.restart_action = QAction(_('Restart'), self) + self.restart_action.setShortcut(_('Ctrl+R')) + self.addAction(self.restart_action) + self.restart_action.triggered.connect(self.restart) + self.console.context_menu.addAction(self.restart_action) + + def restart(self): + self.restart_requested = True + self.reject() def main(): QApplication.setApplicationName(__appname__+' console') QApplication.setOrganizationName('Kovid Goyal') app = QApplication([]) - m = MainWindow() - m.show() - app.exec_() + app + while True: + m = MainWindow() + m.exec_() + if not m.restart_requested: + break if __name__ == '__main__': From a41f481ee7d3a72b727c1f6b2d98ae10443cb0d2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Sep 2010 22:28:49 -0600 Subject: [PATCH 078/412] Backspace and delete now work in console --- src/calibre/utils/pyconsole/console.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index 164cf4e2ca..aa0ff84d77 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -143,6 +143,8 @@ class Console(QTextEdit): Qt.Key_End : self.end_pressed, Qt.Key_Left : self.left_pressed, Qt.Key_Right : self.right_pressed, + Qt.Key_Backspace : self.backspace_pressed, + Qt.Key_Delete : self.delete_pressed, } # }}} motd = textwrap.dedent('''\ @@ -327,6 +329,22 @@ class Console(QTextEdit): self.setTextCursor(c) self.ensureCursorVisible() + def backspace_pressed(self): + lineno, pos = self.cursor_pos + if lineno < 0: return + if pos > self.prompt_len: + self.cursor.deletePreviousChar() + elif lineno > 0: + c = self.cursor + c.movePosition(c.Up) + c.movePosition(c.EndOfLine) + self.setTextCursor(c) + self.ensureCursorVisible() + + def delete_pressed(self): + self.cursor.deleteChar() + self.ensureCursorVisible() + def right_pressed(self): lineno, pos = self.cursor_pos if lineno < 0: return From fdd839af7cafa964b26cc9481cc55a7d5b65b16a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Sep 2010 22:46:54 -0600 Subject: [PATCH 079/412] Ctrl+Home and Ctrl+End now work --- src/calibre/utils/pyconsole/console.py | 23 ++++++++++++++++------- src/calibre/utils/pyconsole/main.py | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index aa0ff84d77..81169140cd 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -9,7 +9,7 @@ import sys, textwrap, traceback, StringIO from functools import partial from PyQt4.Qt import QTextEdit, Qt, QTextFrameFormat, pyqtSignal, \ - QCoreApplication, QColor, QPalette, QMenu, QActionGroup + QApplication, QColor, QPalette, QMenu, QActionGroup from pygments.lexers import PythonLexer, PythonTracebackLexer from pygments.styles import get_all_styles @@ -278,7 +278,7 @@ class Console(QTextEdit): except: prints(tb, end='') self.ensureCursorVisible() - QCoreApplication.processEvents() + QApplication.processEvents() def show_output(self, raw): def do_show(): @@ -296,7 +296,7 @@ class Console(QTextEdit): else: do_show() self.ensureCursorVisible() - QCoreApplication.processEvents() + QApplication.processEvents() # }}} @@ -360,14 +360,23 @@ class Console(QTextEdit): def home_pressed(self): if self.prompt_frame is not None: - c = self.cursor - c.movePosition(c.StartOfLine) - c.movePosition(c.NextCharacter, n=self.prompt_len) - self.setTextCursor(c) + mods = QApplication.keyboardModifiers() + ctrl = bool(int(mods & Qt.CTRL)) + if ctrl: + self.cursor_pos = (0, self.prompt_len) + else: + c = self.cursor + c.movePosition(c.StartOfLine) + c.movePosition(c.NextCharacter, n=self.prompt_len) + self.setTextCursor(c) self.ensureCursorVisible() def end_pressed(self): if self.prompt_frame is not None: + mods = QApplication.keyboardModifiers() + ctrl = bool(int(mods & Qt.CTRL)) + if ctrl: + self.cursor_pos = (len(list(self.prompt()))-1, self.prompt_len) c = self.cursor c.movePosition(c.EndOfLine) self.setTextCursor(c) diff --git a/src/calibre/utils/pyconsole/main.py b/src/calibre/utils/pyconsole/main.py index a5a4b42266..a708ca1652 100644 --- a/src/calibre/utils/pyconsole/main.py +++ b/src/calibre/utils/pyconsole/main.py @@ -52,7 +52,7 @@ class MainWindow(QDialog): self.setWindowTitle(__appname__ + ' console') self.setWindowIcon(QIcon(I('console.png'))) - self.restart_action = QAction(_('Restart'), self) + self.restart_action = QAction(_('Restart console'), self) self.restart_action.setShortcut(_('Ctrl+R')) self.addAction(self.restart_action) self.restart_action.triggered.connect(self.restart) From 7893c01807e401ae6014485e6278ced3a633bb9c Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 22 Sep 2010 13:22:02 +0100 Subject: [PATCH 080/412] Three changes: 1) make get_metadata return an unverified list of formats. Avoids a file system operation per format 2) enhancement request #2845 3) permit composite fields as search/replace source fields. --- src/calibre/gui2/dialogs/metadata_bulk.py | 53 +++++++++++++++-------- src/calibre/gui2/dialogs/metadata_bulk.ui | 13 +++++- src/calibre/library/database2.py | 10 +++-- 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 18d00191cc..fa3b1a9aa7 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -32,24 +32,30 @@ class Worker(Thread): remove, add, au, aus, do_aus, rating, pub, do_series, \ do_autonumber, do_remove_format, remove_format, do_swap_ta, \ do_remove_conv, do_auto_author, series, do_series_restart, \ - series_start_value = self.args + series_start_value, do_title_case = self.args # first loop: do author and title. These will commit at the end of each # operation, because each operation modifies the file system. We want to # try hard to keep the DB and the file system in sync, even in the face # of exceptions or forced exits. for id in self.ids: + title_set = False if do_swap_ta: title = self.db.title(id, index_is_id=True) aum = self.db.authors(id, index_is_id=True) if aum: aum = [a.strip().replace('|', ',') for a in aum.split(',')] new_title = authors_to_string(aum) + if do_title_case: + new_title = new_title.title() self.db.set_title(id, new_title, notify=False) + title_set = True if title: new_authors = string_to_authors(title) self.db.set_authors(id, new_authors, notify=False) - + if do_title_case and not title_set: + title = self.db.title(id, index_is_id=True) + self.db.set_title(id, title.title(), notify=False) if au: self.db.set_authors(id, string_to_authors(au), notify=False) @@ -182,19 +188,22 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.search_for.initialize('bulk_edit_search_for') self.replace_with.initialize('bulk_edit_replace_with') self.test_text.initialize('bulk_edit_test_test') - fields = [''] + self.all_fields = [''] + self.writable_fields = [''] fm = self.db.field_metadata for f in fm: if (f in ['author_sort'] or ( - fm[f]['datatype'] == 'text' or fm[f]['datatype'] == 'series') + fm[f]['datatype'] in ['text', 'series']) and fm[f].get('search_terms', None) and f not in ['formats', 'ondevice']): - fields.append(f) - fields.sort() - self.search_field.addItems(fields) - self.search_field.setMaxVisibleItems(min(len(fields), 20)) - self.destination_field.addItems(fields) - self.destination_field.setMaxVisibleItems(min(len(fields), 20)) + self.all_fields.append(f) + self.writable_fields.append(f) + if fm[f]['datatype'] == 'composite': + self.all_fields.append(f) + self.all_fields.sort() + self.writable_fields.sort() + self.search_field.setMaxVisibleItems(20) + self.destination_field.setMaxVisibleItems(20) offset = 10 self.s_r_number_of_books = min(10, len(self.ids)) for i in range(1,self.s_r_number_of_books+1): @@ -262,7 +271,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.replace_func.addItems(sorted(self.s_r_functions.keys())) self.search_mode.currentIndexChanged[int].connect(self.s_r_search_mode_changed) - self.search_field.currentIndexChanged[str].connect(self.s_r_search_field_changed) + self.search_field.currentIndexChanged[int].connect(self.s_r_search_field_changed) self.destination_field.currentIndexChanged[str].connect(self.s_r_destination_field_changed) self.replace_mode.currentIndexChanged[int].connect(self.s_r_paint_results) @@ -293,15 +302,18 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): val = [] return val - def s_r_search_field_changed(self, txt): - txt = unicode(txt) + def s_r_search_field_changed(self, idx): for i in range(0, self.s_r_number_of_books): w = getattr(self, 'book_%d_text'%(i+1)) mi = self.db.get_metadata(self.ids[i], index_is_id=True) src = unicode(self.search_field.currentText()) t = self.s_r_get_field(mi, src) w.setText(''.join(t[0:1])) - self.s_r_paint_results(None) + + if self.search_mode.currentIndex() == 0: + self.destination_field.setCurrentIndex(idx) + else: + self.s_r_paint_results(None) def s_r_destination_field_changed(self, txt): txt = unicode(txt) @@ -314,7 +326,11 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.s_r_paint_results(None) def s_r_search_mode_changed(self, val): + self.search_field.clear() + self.destination_field.clear() if val == 0: + self.search_field.addItems(self.writable_fields) + self.destination_field.addItems(self.writable_fields) self.destination_field.setCurrentIndex(0) self.destination_field.setVisible(False) self.destination_field_label.setVisible(False) @@ -324,6 +340,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.comma_separated.setVisible(False) self.s_r_heading.setText('

'+self.main_heading + self.character_heading) else: + self.search_field.addItems(self.all_fields) + self.destination_field.addItems(self.writable_fields) self.destination_field.setVisible(True) self.destination_field_label.setVisible(True) self.replace_mode.setVisible(True) @@ -367,6 +385,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): return '' dest = unicode(self.destination_field.currentText()) if dest == '': + if self.db.metadata_for_field(src)['datatype'] == 'composite': + raise Exception(_('You must specify a destination when source is a composite field')) dest = src dest_mode = self.replace_mode.currentIndex() @@ -433,8 +453,6 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): t = self.s_r_replace_mode_separator().join(t) wr.setText(t) except Exception as e: - import traceback - traceback.print_exc() self.s_r_error = e self.s_r_set_colors() break @@ -592,11 +610,12 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): do_swap_ta = self.swap_title_and_author.isChecked() do_remove_conv = self.remove_conversion_settings.isChecked() do_auto_author = self.auto_author_sort.isChecked() + do_title_case = self.change_title_to_title_case.isChecked() args = (remove, add, au, aus, do_aus, rating, pub, do_series, do_autonumber, do_remove_format, remove_format, do_swap_ta, do_remove_conv, do_auto_author, series, do_series_restart, - series_start_value) + series_start_value, do_title_case) bb = BlockingBusy(_('Applying changes to %d books. This may take a while.') %len(self.ids), parent=self) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index 10e22c5df9..e03a59b7ea 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -270,6 +270,17 @@ + + + + Change title to title case + + + Force the title to be in title case. If both this and swap authors are checked, +title and author are swapped before the title case is set + + + @@ -340,7 +351,7 @@ Future conversion of these books will use the default settings. - + Qt::Vertical diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 3e7b932808..c72e990738 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -535,7 +535,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): ### The field-style interface. These use field keys. def get_field(self, idx, key, default=None, index_is_id=False): - mi = self.get_metadata(idx, index_is_id=index_is_id, get_cover=True) + mi = self.get_metadata(idx, index_is_id=index_is_id, + get_cover=key == 'cover') return mi.get(key, default) def standard_field_keys(self): @@ -590,7 +591,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.pubdate = self.pubdate(idx, index_is_id=index_is_id) mi.uuid = self.uuid(idx, index_is_id=index_is_id) mi.title_sort = self.title_sort(idx, index_is_id=index_is_id) - mi.formats = self.formats(idx, index_is_id=index_is_id) + mi.formats = self.formats(idx, index_is_id=index_is_id, + verify_formats=False) if hasattr(mi.formats, 'split'): mi.formats = mi.formats.split(',') else: @@ -731,7 +733,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return set([]) return set([f[0] for f in formats]) - def formats(self, index, index_is_id=False): + def formats(self, index, index_is_id=False, verify_formats=True): ''' Return available formats as a comma separated list or None if there are no available formats ''' id = index if index_is_id else self.id(index) try: @@ -739,6 +741,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): formats = map(lambda x:x[0], formats) except: return None + if not verify_formats: + return formats ans = [] for format in formats: if self.format_abspath(id, format, index_is_id=True) is not None: From b1250a6db18366d599ea63e27658d7851d1e1f35 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 22 Sep 2010 16:43:28 +0100 Subject: [PATCH 081/412] Add prefix and postfix to template values. Syntax: either '{key}' or '{txt1|key|txt2}'. In the second case, if val[key] is not empty, then the result is 'txt1' + val[key] + txt2. --- src/calibre/ebooks/metadata/book/base.py | 18 +++++++++++++----- src/calibre/gui2/dialogs/metadata_bulk.py | 9 --------- src/calibre/library/save_to_disk.py | 17 ++++++++++++++++- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 3d6d6b1bb8..d5a86264bf 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -14,8 +14,8 @@ from calibre.ebooks.metadata.book import STANDARD_METADATA_FIELDS from calibre.ebooks.metadata.book import TOP_LEVEL_CLASSIFIERS from calibre.ebooks.metadata.book import ALL_METADATA_FIELDS from calibre.library.field_metadata import FieldMetadata -from calibre.utils.date import isoformat, format_date +from calibre.utils.date import isoformat, format_date NULL_VALUES = { @@ -38,10 +38,17 @@ class SafeFormat(string.Formatter): Provides a format function that substitutes '' for any missing value ''' def get_value(self, key, args, mi): - ign, v = mi.format_field(key, series_with_index=False) - if v is None: - return '' - return v + from calibre.library.save_to_disk import explode_string_template_value + try: + prefix, key, suffix = explode_string_template_value(key) + ign, v = mi.format_field(key, series_with_index=False) + if v is None: + return '' + if v is '': + return '' + return '%s%s%s'%(prefix, v, suffix) + except: + return key composite_formatter = SafeFormat() compress_spaces = re.compile(r'\s+') @@ -50,6 +57,7 @@ def format_composite(x, mi): try: ans = composite_formatter.vformat(x, [], mi).strip() except: + traceback.print_exc() ans = x return compress_spaces.sub(' ', ans) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index fa3b1a9aa7..a9e45087fd 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -122,15 +122,6 @@ class SafeFormat(string.Formatter): v = ','.join(v) return v -composite_formatter = SafeFormat() - -def format_composite(x, mi): - try: - ans = composite_formatter.vformat(x, [], mi).strip() - except: - ans = x - return ans - class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): s_r_functions = { '' : lambda x: x, diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index fe62dcb7fd..6f7929a072 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -101,15 +101,30 @@ def preprocess_template(template): template = template.decode(preferred_encoding, 'replace') return template +template_value_re = re.compile(r'^([^\|]*(?=\|))(?:\|?)([^\|]*)(?:\|?)((?<=\|).*?)$') + +def explode_string_template_value(key): + try: + matches = template_value_re.match(key) + if matches.lastindex != 3: + return key + return matches.groups() + except: + return '', key, '' + class SafeFormat(string.Formatter): ''' Provides a format function that substitutes '' for any missing value ''' def get_value(self, key, args, kwargs): try: - return kwargs[key] + prefix, key, suffix = explode_string_template_value(key) + if kwargs[key]: + return '%s%s%s'%(prefix, kwargs[key], suffix) + return '' except: return '' + safe_formatter = SafeFormat() def safe_format(x, format_args): From 9112277d00187936e7cc8ffd3bf1eba3b87cfbe7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 22 Sep 2010 09:50:01 -0600 Subject: [PATCH 082/412] ... --- src/calibre/manual/index.rst | 8 +------- src/calibre/manual/tutorials.rst | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 src/calibre/manual/tutorials.rst diff --git a/src/calibre/manual/index.rst b/src/calibre/manual/index.rst index 40c260b8b5..d63b0b71a9 100644 --- a/src/calibre/manual/index.rst +++ b/src/calibre/manual/index.rst @@ -33,16 +33,10 @@ Sections conversion metadata faq - xpath + tutorials customize cli/cli-index develop glossary -.. toctree:: - :hidden: - :maxdepth: 2 - - template_lang - portable diff --git a/src/calibre/manual/tutorials.rst b/src/calibre/manual/tutorials.rst new file mode 100644 index 0000000000..d07316deb9 --- /dev/null +++ b/src/calibre/manual/tutorials.rst @@ -0,0 +1,17 @@ + +.. include:: global.rst + +.. _tutorials: + +Tutorials +======================================================= + +Here you will find tutorials to get you started using |app|'s more advanced features, like XPath and templates. + +.. toctree:: + :maxdepth: 1 + + xpath + template_lang + portable + From bfc3e63980dd0fc47601529ca1f224602e10f777 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 22 Sep 2010 09:57:33 -0600 Subject: [PATCH 083/412] ... --- src/calibre/library/save_to_disk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 6f7929a072..19727deb17 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -120,7 +120,7 @@ class SafeFormat(string.Formatter): try: prefix, key, suffix = explode_string_template_value(key) if kwargs[key]: - return '%s%s%s'%(prefix, kwargs[key], suffix) + return prefix + kwargs[key] + suffix return '' except: return '' From bd8a206219b69fb92305db8135b28f98021a3b62 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 22 Sep 2010 17:10:57 +0100 Subject: [PATCH 084/412] Changes to faq --- src/calibre/manual/template_lang.rst | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index 541b5da138..780d742eff 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -40,7 +40,20 @@ and if a book does not have a series:: Advanced formatting ---------------------- -You can do more than just simple substitution with the templates. You can also control how the substituted data is formatted. For instance, suppose you wanted to ensure that the series_index is always formatted as three digits with leading zeros. This would do the trick:: +You can do more than just simple substitution with the templates. You can also conditionally include text and control how the substituted data is formatted. + +Regarding conditionally including text: there are cases where you might want to have text appear in the output only if a field is not empty. A common case is series and series_index, where you want either nothing or the two values with a hyphen between them. Calibre handles this case using a special field syntax. +For example, assume you want to use the template + + {series} - {series_index} - {title} + +Unfortunately, if the book has no series, the answer will be '- - title'. Many people would rather it be simply 'title', without the hyphens. To do this, use the extended syntax {some_text|field|other_text}. When you use this syntax, if field has the value SERIES then the result will be some_textSERIESother_text. If field has no value, then the result will be the empty string (nothing). Using this syntax, we can solve the above series problem with the template + + {series}{ - |series_index| - }{title} + +The hyphens will be included only if the book has a series index. Note: you must either use no | characters or both of them. Using one, such as in {field| - }, is not allowed. It is OK to not provide any text for one side or the other, such as in {|series| - }. Using {|title|} is the same as using {title}. + +Now to formatting. Suppose you wanted to ensure that the series_index is always formatted as three digits with leading zeros. This would do the trick:: {series_index:0>3s} - Three digits with leading zeros From f280cc956fa7b234212ed995fd7497b29b9ac5ea Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 22 Sep 2010 20:56:08 +0100 Subject: [PATCH 085/412] Fix template bugs introduced by using + instead of '%s' --- src/calibre/ebooks/metadata/book/base.py | 4 ++-- src/calibre/library/save_to_disk.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 39b9b34174..4e78bf5a48 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -43,9 +43,9 @@ class SafeFormat(string.Formatter): ign, v = mi.format_field(key, series_with_index=False) if v is None: return '' - if v is '': + if v == '': return '' - return prefix + v + suffix + return prefix + unicode(v) + suffix except: return key diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 19727deb17..90e5413389 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -101,7 +101,8 @@ def preprocess_template(template): template = template.decode(preferred_encoding, 'replace') return template -template_value_re = re.compile(r'^([^\|]*(?=\|))(?:\|?)([^\|]*)(?:\|?)((?<=\|).*?)$') +template_value_re = re.compile(r'^([^\|]*(?=\|))(?:\|?)([^\|]*)(?:\|?)((?<=\|).*?)$', + flags= re.UNICODE) def explode_string_template_value(key): try: @@ -120,7 +121,7 @@ class SafeFormat(string.Formatter): try: prefix, key, suffix = explode_string_template_value(key) if kwargs[key]: - return prefix + kwargs[key] + suffix + return prefix + unicode(kwargs[key]) + suffix return '' except: return '' From 8a9ae38ebff2cc641d2d661da2d6577db7f0acd0 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 22 Sep 2010 21:00:25 +0100 Subject: [PATCH 086/412] Change to fix to make the value unicode in format_field_extended. This is a more general fix. Note that the orig_field has not been changed. --- src/calibre/ebooks/metadata/book/base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 4e78bf5a48..a2b2790ed9 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -45,7 +45,7 @@ class SafeFormat(string.Formatter): return '' if v == '': return '' - return prefix + unicode(v) + suffix + return prefix + v + suffix except: return key @@ -444,7 +444,7 @@ class Metadata(object): res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': res = _('Yes') if res else _('No') - return (name, res, orig_res, cmeta) + return (name, unicode(res), orig_res, cmeta) if key in field_metadata and field_metadata[key]['kind'] == 'field': res = self.get(key, None) @@ -462,7 +462,7 @@ class Metadata(object): res = res + ' [%s]'%self.format_series_index() elif datatype == 'datetime': res = format_date(res, fmeta['display'].get('date_format','dd MMM yyyy')) - return (name, res, orig_res, fmeta) + return (name, unicode(res), orig_res, fmeta) return (None, None, None, None) From 7e233696a1c2bbe3ca4c0469a99540da665fc94f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 22 Sep 2010 16:11:53 -0600 Subject: [PATCH 087/412] ... --- src/calibre/manual/tutorials.rst | 1 + src/calibre/utils/pyconsole/__init__.py | 4 ++-- src/calibre/utils/pyconsole/main.py | 22 +++++++++++++++++----- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/calibre/manual/tutorials.rst b/src/calibre/manual/tutorials.rst index d07316deb9..1e4cab8493 100644 --- a/src/calibre/manual/tutorials.rst +++ b/src/calibre/manual/tutorials.rst @@ -11,6 +11,7 @@ Here you will find tutorials to get you started using |app|'s more advanced feat .. toctree:: :maxdepth: 1 + news xpath template_lang portable diff --git a/src/calibre/utils/pyconsole/__init__.py b/src/calibre/utils/pyconsole/__init__.py index 32eb926143..cf7e5eab50 100644 --- a/src/calibre/utils/pyconsole/__init__.py +++ b/src/calibre/utils/pyconsole/__init__.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import sys from calibre import prints as prints_ -from calibre.utils.config import Config, ConfigProxy +from calibre.utils.config import Config, ConfigProxy, JSONConfig def console_config(): @@ -20,7 +20,7 @@ def console_config(): return c prefs = ConfigProxy(console_config()) - +dynamic = JSONConfig('console') def prints(*args, **kwargs): kwargs['file'] = sys.__stdout__ diff --git a/src/calibre/utils/pyconsole/main.py b/src/calibre/utils/pyconsole/main.py index a708ca1652..4027897ddd 100644 --- a/src/calibre/utils/pyconsole/main.py +++ b/src/calibre/utils/pyconsole/main.py @@ -12,6 +12,7 @@ from PyQt4.Qt import QDialog, QToolBar, QStatusBar, QLabel, QFont, Qt, \ QApplication, QIcon, QVBoxLayout, QAction from calibre.constants import __appname__, __version__ +from calibre.utils.pyconsole import dynamic from calibre.utils.pyconsole.console import Console class MainWindow(QDialog): @@ -26,6 +27,9 @@ class MainWindow(QDialog): self.setLayout(self.l) self.resize(800, 600) + geom = dynamic.get('console_window_geometry', None) + if geom is not None: + self.restoreGeometry(geom) # Setup tool bar {{{ self.tool_bar = QToolBar(self) @@ -62,17 +66,25 @@ class MainWindow(QDialog): self.restart_requested = True self.reject() -def main(): - QApplication.setApplicationName(__appname__+' console') - QApplication.setOrganizationName('Kovid Goyal') - app = QApplication([]) - app + def closeEvent(self, *args): + dynamic.set('console_window_geometry', + bytearray(self.saveGeometry())) + return QDialog.closeEvent(self, *args) + + +def show(): while True: m = MainWindow() m.exec_() if not m.restart_requested: break +def main(): + QApplication.setApplicationName(__appname__+' console') + QApplication.setOrganizationName('Kovid Goyal') + app = QApplication([]) + app + show() if __name__ == '__main__': main() From 69e4cb006545c9db1bc7704c4363a9a111d9c3c1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 22 Sep 2010 17:05:35 -0600 Subject: [PATCH 088/412] ... --- src/calibre/utils/pyconsole/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/calibre/utils/pyconsole/__init__.py b/src/calibre/utils/pyconsole/__init__.py index cf7e5eab50..b3f811faca 100644 --- a/src/calibre/utils/pyconsole/__init__.py +++ b/src/calibre/utils/pyconsole/__init__.py @@ -9,6 +9,7 @@ import sys from calibre import prints as prints_ from calibre.utils.config import Config, ConfigProxy, JSONConfig +from calibre.utils.ipc.launch import Worker def console_config(): @@ -26,4 +27,6 @@ def prints(*args, **kwargs): kwargs['file'] = sys.__stdout__ prints_(*args, **kwargs) +class Process(Worker): + pass From c5e26ad9d5660aebdc21afc57e0626e83b2c0b92 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 22 Sep 2010 21:43:08 -0600 Subject: [PATCH 089/412] Refactor console to run interpreter in separate process --- src/calibre/utils/pyconsole/__init__.py | 3 + src/calibre/utils/pyconsole/console.py | 114 ++++++++----- src/calibre/utils/pyconsole/controller.py | 125 +++++++++++++++ src/calibre/utils/pyconsole/interpreter.py | 177 +++++++++++++++++++++ src/calibre/utils/pyconsole/main.py | 1 + src/calibre/utils/pyconsole/repl.py | 67 -------- 6 files changed, 381 insertions(+), 106 deletions(-) create mode 100644 src/calibre/utils/pyconsole/controller.py create mode 100644 src/calibre/utils/pyconsole/interpreter.py delete mode 100644 src/calibre/utils/pyconsole/repl.py diff --git a/src/calibre/utils/pyconsole/__init__.py b/src/calibre/utils/pyconsole/__init__.py index 3b32a5a9f3..3be9382413 100644 --- a/src/calibre/utils/pyconsole/__init__.py +++ b/src/calibre/utils/pyconsole/__init__.py @@ -13,6 +13,9 @@ from calibre.utils.ipc.launch import Worker from calibre.constants import __appname__, __version__, iswindows from calibre.gui2 import error_dialog +# Time to wait for communication to/from the interpreter process +POLL_TIMEOUT = 0.01 # seconds + preferred_encoding, isbytestring, __appname__, __version__, error_dialog, \ iswindows diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index 77c8d9a2f6..1acb6e96a9 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -9,13 +9,13 @@ import sys, textwrap, traceback, StringIO from functools import partial from PyQt4.Qt import QTextEdit, Qt, QTextFrameFormat, pyqtSignal, \ - QApplication, QColor, QPalette, QMenu, QActionGroup + QApplication, QColor, QPalette, QMenu, QActionGroup, QTimer from pygments.lexers import PythonLexer, PythonTracebackLexer from pygments.styles import get_all_styles from calibre.utils.pyconsole.formatter import Formatter -from calibre.utils.pyconsole.repl import Interpreter, DummyFile +from calibre.utils.pyconsole.controller import Controller from calibre.utils.pyconsole import prints, prefs, __appname__, \ __version__, error_dialog @@ -113,7 +113,8 @@ class Console(QTextEdit): continuation='... ', parent=None): QTextEdit.__init__(self, parent) - self.buf = [] + self.shutting_down = False + self.buf = self.old_buf = [] self.prompt_frame = None self.allow_output = False self.prompt_frame_format = QTextFrameFormat() @@ -152,20 +153,80 @@ class Console(QTextEdit): '''.format(sys.version.splitlines()[0], __appname__, __version__)) + self.controllers = [] + QTimer.singleShot(0, self.launch_controller) + + sys.excepthook = self.unhandled_exception + with EditBlock(self.cursor): self.render_block(motd) - sys.stdout = sys.stderr = DummyFile(parent=self) - sys.stdout.write_output.connect(self.show_output) - self.interpreter = Interpreter(parent=self) - self.interpreter.show_error.connect(self.show_error) - - sys.excepthook = self.unhandled_exception + def shutdown(self): + self.shutton_down = True + for c in self.controllers: + c.kill() def contextMenuEvent(self, event): self.context_menu.popup(event.globalPos()) event.accept() + # Controller management {{{ + @property + def controller(self): + return self.controllers[-1] + + def no_controller_error(self): + error_dialog(self, _('No interpreter'), + _('No active interpreter found. Try restarting the' + ' console'), show=True) + + def launch_controller(self, *args): + c = Controller(self) + c.write_output.connect(self.show_output, type=Qt.QueuedConnection) + c.show_error.connect(self.show_error, type=Qt.QueuedConnection) + c.interpreter_died.connect(self.interpreter_died, + type=Qt.QueuedConnection) + c.interpreter_done.connect(self.execution_done) + self.controllers.append(c) + + def interpreter_died(self, controller, returncode): + if not self.shutting_down and controller.current_command is not None: + error_dialog(self, _('Interpreter died'), + _('Interpreter dies while excuting a command. To see ' + 'the command, click Show details'), + det_msg=controller.current_command, show=True) + + def execute(self, prompt_lines): + c = self.root_frame.lastCursorPosition() + self.setTextCursor(c) + self.old_prompt_frame = self.prompt_frame + self.prompt_frame = None + self.old_buf = self.buf + self.buf = [] + self.running.emit() + self.controller.runsource('\n'.join(prompt_lines)) + + def execution_done(self, controller, ret): + if controller is self.controller: + self.running_done.emit() + if ret: # Incomplete command + self.buf = self.old_buf + self.prompt_frame = self.old_prompt_frame + c = self.prompt_frame.lastCursorPosition() + c.insertBlock() + self.setTextCursor(c) + else: # Command completed + try: + self.old_prompt_frame.setFrameFormat(QTextFrameFormat()) + except RuntimeError: + # Happens if enough lines of output that the old + # frame was deleted + pass + + self.render_current_prompt() + + # }}} + # Prompt management {{{ @dynamic_property @@ -264,7 +325,7 @@ class Console(QTextEdit): if restore_prompt: self.render_current_prompt() - def show_error(self, is_syntax_err, tb): + def show_error(self, is_syntax_err, tb, controller=None): if self.prompt_frame is not None: # At a prompt, so redirect output return prints(tb, end='') @@ -279,7 +340,7 @@ class Console(QTextEdit): self.ensureCursorVisible() QApplication.processEvents() - def show_output(self, raw): + def show_output(self, raw, which='stdout', controller=None): def do_show(): try: self.buf.append(raw) @@ -384,36 +445,11 @@ class Console(QTextEdit): def enter_pressed(self): if self.prompt_frame is None: return + if not self.controller.is_alive: + return self.no_controller_error() cp = list(self.prompt()) if cp[0]: - c = self.root_frame.lastCursorPosition() - self.setTextCursor(c) - old_pf = self.prompt_frame - self.prompt_frame = None - oldbuf = self.buf - self.buf = [] - self.running.emit() - try: - ret = self.interpreter.runsource('\n'.join(cp)) - except SystemExit: - ret = False - self.show_output('Raising SystemExit not allowed\n') - self.running_done.emit() - if ret: # Incomplete command - self.buf = oldbuf - self.prompt_frame = old_pf - c = old_pf.lastCursorPosition() - c.insertBlock() - self.setTextCursor(c) - else: # Command completed - try: - old_pf.setFrameFormat(QTextFrameFormat()) - except RuntimeError: - # Happens if enough lines of output that the old - # frame was deleted - pass - - self.render_current_prompt() + self.execute(cp) def text_typed(self, text): if self.prompt_frame is not None: diff --git a/src/calibre/utils/pyconsole/controller.py b/src/calibre/utils/pyconsole/controller.py new file mode 100644 index 0000000000..173881d14e --- /dev/null +++ b/src/calibre/utils/pyconsole/controller.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import os, cPickle, signal, time +from Queue import Queue, Empty +from multiprocessing.connection import Listener, arbitrary_address +from binascii import hexlify + +from PyQt4.Qt import QThread, pyqtSignal + +from calibre.utils.pyconsole import Process, iswindows, POLL_TIMEOUT + +class Controller(QThread): + + # show_error(is_syntax_error, traceback, self) + show_error = pyqtSignal(object, object, object) + # write_output(unicode_object, stdout or stderr, self) + write_output = pyqtSignal(object, object, object) + # Indicates interpreter has finished evaluating current command + interpreter_done = pyqtSignal(object, object) + # interpreter_died(self, returncode or None if no return code available) + interpreter_died = pyqtSignal(object, object) + + def __init__(self, parent): + QThread.__init__(self, parent) + self.keep_going = True + self.current_command = None + + self.out_queue = Queue() + self.address = arbitrary_address('AF_PIPE' if iswindows else 'AF_UNIX') + self.auth_key = os.urandom(32) + if iswindows and self.address[1] == ':': + self.address = self.address[2:] + self.listener = Listener(address=self.address, + authkey=self.auth_key, backlog=4) + + self.env = { + 'CALIBRE_LAUNCH_INTERPRETER': '1', + 'CALIBRE_WORKER_ADDRESS': + hexlify(cPickle.dumps(self.listener.address, -1)), + 'CALIBRE_WORKER_KEY': hexlify(self.auth_key) + } + self.process = Process(self.env) + self.output_file_buf = self.process(redirect_output=False) + self.conn = self.listener.accept() + self.start() + + def run(self): + while self.keep_going and self.is_alive: + try: + self.communicate() + except KeyboardInterrupt: + pass + except EOFError: + break + self.interpreter_died.emit(self, self.returncode) + try: + self.listener.close() + except: + pass + + def communicate(self): + if self.conn.poll(POLL_TIMEOUT): + self.dispatch_incoming_message(self.conn.recv()) + try: + obj = self.out_queue.get_nowait() + except Empty: + pass + else: + try: + self.conn.send(obj) + except: + raise EOFError('controller failed to send') + + def dispatch_incoming_message(self, obj): + try: + cmd, data = obj + except: + print 'Controller received invalid message' + print repr(obj) + return + if cmd in ('stdout', 'stderr'): + self.write_output.emit(data, cmd, self) + elif cmd == 'syntaxerror': + self.show_error.emit(True, data, self) + elif cmd == 'traceback': + self.show_error(self, False, data) + elif cmd == 'done': + self.current_command = None + self.interpreter_done.emit(self, data) + + def runsource(self, cmd): + self.current_command = cmd + self.out_queue.put(('run', cmd)) + + def __nonzero__(self): + return self.process.is_alive + + @property + def returncode(self): + return self.process.returncode + + @property + def interrupt(self): + if hasattr(signal, 'SIGINT'): + os.kill(self.process.pid, signal.SIGINT) + elif hasattr(signal, 'CTRL_C_EVENT'): + os.kill(self.process.pid, signal.CTRL_C_EVENT) + + @property + def is_alive(self): + return self.process.is_alive + + def kill(self): + self.out_queue.put(('quit', 0)) + t = 0 + while self.is_alive and t < 10: + time.sleep(0.1) + self.process.kill() + self.keep_going = False + diff --git a/src/calibre/utils/pyconsole/interpreter.py b/src/calibre/utils/pyconsole/interpreter.py new file mode 100644 index 0000000000..6a1aff26c9 --- /dev/null +++ b/src/calibre/utils/pyconsole/interpreter.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import sys, cPickle, os +from code import InteractiveInterpreter +from Queue import Queue, Empty +from threading import Thread +from binascii import unhexlify +from multiprocessing.connection import Client + +from calibre.utils.pyconsole import preferred_encoding, isbytestring, \ + POLL_TIMEOUT + +''' +Messages sent by client: + + (stdout, unicode) + (stderr, unicode) + (syntaxerror, unicode) + (traceback, unicode) + (done, True iff incomplete command) + +Messages that can be received by client: + (quit, return code) + (run, unicode) + +''' + +def tounicode(raw): # {{{ + if isbytestring(raw): + try: + raw = raw.decode(preferred_encoding, 'replace') + except: + raw = repr(raw) + + if isbytestring(raw): + try: + raw.decode('utf-8', 'replace') + except: + raw = u'Undecodable bytestring' + return raw +# }}} + +class DummyFile(object): # {{{ + + def __init__(self, what, out_queue): + self.closed = False + self.name = 'console' + self.softspace = 0 + self.what = what + self.out_queue = out_queue + + def flush(self): + pass + + def close(self): + pass + + def write(self, raw): + self.out_queue.put((self.what, tounicode(raw))) +# }}} + +class Comm(Thread): # {{{ + + def __init__(self, conn, out_queue, in_queue): + Thread.__init__(self) + self.daemon = True + self.conn = conn + self.out_queue = out_queue + self.in_queue = in_queue + self.keep_going = True + + def run(self): + while self.keep_going: + try: + self.communicate() + except KeyboardInterrupt: + pass + except EOFError: + pass + + def communicate(self): + if self.conn.poll(POLL_TIMEOUT): + try: + obj = self.conn.recv() + except: + pass + else: + self.in_queue.put(obj) + try: + obj = self.out_queue.get_nowait() + except Empty: + pass + else: + try: + self.conn.send(obj) + except: + raise EOFError('interpreter failed to send') +# }}} + +class Interpreter(InteractiveInterpreter): # {{{ + + def __init__(self, queue, local={}): + if '__name__' not in local: + local['__name__'] = '__console__' + if '__doc__' not in local: + local['__doc__'] = None + self.out_queue = queue + sys.stdout = DummyFile('stdout', queue) + sys.stderr = DummyFile('sdterr', queue) + InteractiveInterpreter.__init__(self, locals=local) + + def showtraceback(self, *args, **kwargs): + self.is_syntax_error = False + InteractiveInterpreter.showtraceback(self, *args, **kwargs) + + def showsyntaxerror(self, *args, **kwargs): + self.is_syntax_error = True + InteractiveInterpreter.showsyntaxerror(self, *args, **kwargs) + + def write(self, raw): + what = 'syntaxerror' if self.is_syntax_error else 'traceback' + self.out_queue.put((what, tounicode(raw))) + +# }}} + +def connect(): + os.chdir(os.environ['ORIGWD']) + address = cPickle.loads(unhexlify(os.environ['CALIBRE_WORKER_ADDRESS'])) + key = unhexlify(os.environ['CALIBRE_WORKER_KEY']) + return Client(address, authkey=key) + +def main(): + out_queue = Queue() + in_queue = Queue() + conn = connect() + comm = Comm(conn, out_queue, in_queue) + comm.start() + interpreter = Interpreter(out_queue) + + ret = 0 + + while True: + try: + try: + cmd, data = in_queue.get(1) + except Empty: + pass + else: + if cmd == 'quit': + ret = data + comm.keep_going = False + comm.join() + break + elif cmd == 'run': + if not comm.is_alive(): + ret = 1 + break + ret = False + try: + ret = interpreter.runsource(data) + except KeyboardInterrupt: + pass + except SystemExit: + out_queue.put(('stderr', 'SystemExit ignored\n')) + out_queue.put(('done', ret)) + except KeyboardInterrupt: + pass + + return ret + +if __name__ == '__main__': + main() diff --git a/src/calibre/utils/pyconsole/main.py b/src/calibre/utils/pyconsole/main.py index a64bc15ec7..664f41ef2e 100644 --- a/src/calibre/utils/pyconsole/main.py +++ b/src/calibre/utils/pyconsole/main.py @@ -68,6 +68,7 @@ class MainWindow(QDialog): def closeEvent(self, *args): dynamic.set('console_window_geometry', bytearray(self.saveGeometry())) + self.console.shutdown() return QDialog.closeEvent(self, *args) diff --git a/src/calibre/utils/pyconsole/repl.py b/src/calibre/utils/pyconsole/repl.py deleted file mode 100644 index de6262de14..0000000000 --- a/src/calibre/utils/pyconsole/repl.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai - -__license__ = 'GPL v3' -__copyright__ = '2010, Kovid Goyal ' -__docformat__ = 'restructuredtext en' - -from code import InteractiveInterpreter - -from PyQt4.Qt import QObject, pyqtSignal - -from calibre import isbytestring -from calibre.constants import preferred_encoding - -class Interpreter(QObject, InteractiveInterpreter): - - # show_error(is_syntax_error, traceback) - show_error = pyqtSignal(object, object) - - def __init__(self, local={}, parent=None): - QObject.__init__(self, parent) - if '__name__' not in local: - local['__name__'] = '__console__' - if '__doc__' not in local: - local['__doc__'] = None - InteractiveInterpreter.__init__(self, locals=local) - - def showtraceback(self, *args, **kwargs): - self.is_syntax_error = False - InteractiveInterpreter.showtraceback(self, *args, **kwargs) - - def showsyntaxerror(self, *args, **kwargs): - self.is_syntax_error = True - InteractiveInterpreter.showsyntaxerror(self, *args, **kwargs) - - def write(self, tb): - self.show_error.emit(self.is_syntax_error, tb) - -class DummyFile(QObject): - - # write_output(unicode_object) - write_output = pyqtSignal(object) - - def __init__(self, parent=None): - QObject.__init__(self, parent) - self.closed = False - self.name = 'console' - self.softspace = 0 - - def flush(self): - pass - - def close(self): - pass - - def write(self, raw): - #import sys, traceback - #print >> sys.__stdout__, 'file,write stack:\n', ''.join(traceback.format_stack()) - if isbytestring(raw): - try: - raw = raw.decode(preferred_encoding, 'replace') - except: - raw = repr(raw) - if isbytestring(raw): - raw = raw.decode(preferred_encoding, 'replace') - self.write_output.emit(raw) - From 950f592b87173daaeb84244560c276adb0cb49f8 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 22 Sep 2010 21:48:17 -0600 Subject: [PATCH 090/412] ... --- src/calibre/utils/pyconsole/console.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index 1acb6e96a9..2611965345 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -268,6 +268,11 @@ class Console(QTextEdit): return property(fget=fget, fset=fset, doc=doc) + def move_cursor_to_prompt(self): + if self.prompt_frame is not None and self.cursor_pos[0] < 0: + c = self.prompt_frame.lastCursorPosition() + self.setTextCursor(c) + def prompt(self, strip_prompt_strings=True): if not self.prompt_frame: yield u'' if strip_prompt_strings else self.formatter.prompt @@ -453,6 +458,7 @@ class Console(QTextEdit): def text_typed(self, text): if self.prompt_frame is not None: + self.move_cursor_to_prompt() self.cursor.insertText(text) self.render_current_prompt(restore_cursor=True) From 9b44f557850a7cdbceac98194cc9bda77d76330c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 22 Sep 2010 21:54:58 -0600 Subject: [PATCH 091/412] ... --- src/calibre/utils/pyconsole/controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/utils/pyconsole/controller.py b/src/calibre/utils/pyconsole/controller.py index 173881d14e..368e665079 100644 --- a/src/calibre/utils/pyconsole/controller.py +++ b/src/calibre/utils/pyconsole/controller.py @@ -88,7 +88,7 @@ class Controller(QThread): elif cmd == 'syntaxerror': self.show_error.emit(True, data, self) elif cmd == 'traceback': - self.show_error(self, False, data) + self.show_error.emit(False, data, self) elif cmd == 'done': self.current_command = None self.interpreter_done.emit(self, data) From d9e5e74695e82e56b8cc0f61399036ea17a485dd Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 23 Sep 2010 01:02:03 -0600 Subject: [PATCH 092/412] Console now has history --- src/calibre/utils/pyconsole/__init__.py | 2 + src/calibre/utils/pyconsole/console.py | 62 ++++++++++++++++++++-- src/calibre/utils/pyconsole/controller.py | 1 - src/calibre/utils/pyconsole/interpreter.py | 3 +- 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/src/calibre/utils/pyconsole/__init__.py b/src/calibre/utils/pyconsole/__init__.py index 3be9382413..6ef9f04d4b 100644 --- a/src/calibre/utils/pyconsole/__init__.py +++ b/src/calibre/utils/pyconsole/__init__.py @@ -24,6 +24,8 @@ def console_config(): c = Config('console', desc) c.add_opt('theme', default='native', help='The color theme') + c.add_opt('scrollback', default=10000, + help='Max number of lines to keep in the scrollback buffer') return c diff --git a/src/calibre/utils/pyconsole/console.py b/src/calibre/utils/pyconsole/console.py index 2611965345..14670fdb59 100644 --- a/src/calibre/utils/pyconsole/console.py +++ b/src/calibre/utils/pyconsole/console.py @@ -7,6 +7,7 @@ __docformat__ = 'restructuredtext en' import sys, textwrap, traceback, StringIO from functools import partial +from codeop import CommandCompiler from PyQt4.Qt import QTextEdit, Qt, QTextFrameFormat, pyqtSignal, \ QApplication, QColor, QPalette, QMenu, QActionGroup, QTimer @@ -16,8 +17,9 @@ from pygments.styles import get_all_styles from calibre.utils.pyconsole.formatter import Formatter from calibre.utils.pyconsole.controller import Controller +from calibre.utils.pyconsole.history import History from calibre.utils.pyconsole import prints, prefs, __appname__, \ - __version__, error_dialog + __version__, error_dialog, dynamic class EditBlock(object): # {{{ @@ -73,6 +75,7 @@ class ThemeMenu(QMenu): # {{{ # }}} + class Console(QTextEdit): running = pyqtSignal() @@ -114,7 +117,9 @@ class Console(QTextEdit): parent=None): QTextEdit.__init__(self, parent) self.shutting_down = False + self.compiler = CommandCompiler() self.buf = self.old_buf = [] + self.history = History([''], dynamic.get('console_history', [])) self.prompt_frame = None self.allow_output = False self.prompt_frame_format = QTextFrameFormat() @@ -122,7 +127,7 @@ class Console(QTextEdit): self.prompt_frame_format.setBorderStyle(QTextFrameFormat.BorderStyle_Solid) self.prompt_len = len(prompt) - self.doc.setMaximumBlockCount(10000) + self.doc.setMaximumBlockCount(int(prefs['scrollback'])) self.lexer = PythonLexer(ensurenl=False) self.tb_lexer = PythonTracebackLexer() @@ -139,6 +144,8 @@ class Console(QTextEdit): self.key_dispatcher = { # {{{ Qt.Key_Enter : self.enter_pressed, Qt.Key_Return : self.enter_pressed, + Qt.Key_Up : self.up_pressed, + Qt.Key_Down : self.down_pressed, Qt.Key_Home : self.home_pressed, Qt.Key_End : self.end_pressed, Qt.Key_Left : self.left_pressed, @@ -153,15 +160,17 @@ class Console(QTextEdit): '''.format(sys.version.splitlines()[0], __appname__, __version__)) + sys.excepthook = self.unhandled_exception + self.controllers = [] QTimer.singleShot(0, self.launch_controller) - sys.excepthook = self.unhandled_exception with EditBlock(self.cursor): self.render_block(motd) def shutdown(self): + dynamic.set('console_history', self.history.serialize()) self.shutton_down = True for c in self.controllers: c.kill() @@ -365,7 +374,7 @@ class Console(QTextEdit): # }}} - # Keyboard handling {{{ + # Keyboard management {{{ def keyPressEvent(self, ev): text = unicode(ev.text()) @@ -394,6 +403,20 @@ class Console(QTextEdit): self.setTextCursor(c) self.ensureCursorVisible() + def up_pressed(self): + lineno, pos = self.cursor_pos + if lineno < 0: return + if lineno == 0: + b = self.history.back() + if b is not None: + self.set_prompt(b) + else: + c = self.cursor + c.movePosition(c.Up) + self.setTextCursor(c) + self.ensureCursorVisible() + + def backspace_pressed(self): lineno, pos = self.cursor_pos if lineno < 0: return @@ -414,7 +437,6 @@ class Console(QTextEdit): lineno, pos = self.cursor_pos if lineno < 0: return c = self.cursor - lineno, pos = self.cursor_pos cp = list(self.prompt(False)) if pos < len(cp[lineno]): c.movePosition(c.NextCharacter) @@ -423,6 +445,22 @@ class Console(QTextEdit): self.setTextCursor(c) self.ensureCursorVisible() + def down_pressed(self): + lineno, pos = self.cursor_pos + if lineno < 0: return + c = self.cursor + cp = list(self.prompt(False)) + if lineno >= len(cp) - 1: + b = self.history.forward() + if b is not None: + self.set_prompt(b) + else: + c = self.cursor + c.movePosition(c.Down) + self.setTextCursor(c) + self.ensureCursorVisible() + + def home_pressed(self): if self.prompt_frame is not None: mods = QApplication.keyboardModifiers() @@ -454,6 +492,19 @@ class Console(QTextEdit): return self.no_controller_error() cp = list(self.prompt()) if cp[0]: + try: + ret = self.compiler('\n'.join(cp)) + except: + pass + else: + if ret is None: + c = self.prompt_frame.lastCursorPosition() + c.insertBlock() + self.setTextCursor(c) + self.render_current_prompt() + return + else: + self.history.enter(cp) self.execute(cp) def text_typed(self, text): @@ -461,6 +512,7 @@ class Console(QTextEdit): self.move_cursor_to_prompt() self.cursor.insertText(text) self.render_current_prompt(restore_cursor=True) + self.history.current = list(self.prompt()) # }}} diff --git a/src/calibre/utils/pyconsole/controller.py b/src/calibre/utils/pyconsole/controller.py index 368e665079..d372cb4ebc 100644 --- a/src/calibre/utils/pyconsole/controller.py +++ b/src/calibre/utils/pyconsole/controller.py @@ -104,7 +104,6 @@ class Controller(QThread): def returncode(self): return self.process.returncode - @property def interrupt(self): if hasattr(signal, 'SIGINT'): os.kill(self.process.pid, signal.SIGINT) diff --git a/src/calibre/utils/pyconsole/interpreter.py b/src/calibre/utils/pyconsole/interpreter.py index 6a1aff26c9..3cd0d94711 100644 --- a/src/calibre/utils/pyconsole/interpreter.py +++ b/src/calibre/utils/pyconsole/interpreter.py @@ -11,6 +11,7 @@ from Queue import Queue, Empty from threading import Thread from binascii import unhexlify from multiprocessing.connection import Client +from repr import repr as safe_repr from calibre.utils.pyconsole import preferred_encoding, isbytestring, \ POLL_TIMEOUT @@ -35,7 +36,7 @@ def tounicode(raw): # {{{ try: raw = raw.decode(preferred_encoding, 'replace') except: - raw = repr(raw) + raw = safe_repr(raw) if isbytestring(raw): try: From ea29f4b683ada1c41593ff90664cfa146008be5f Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 23 Sep 2010 14:36:47 +0100 Subject: [PATCH 093/412] Changes: 1) complete rewrite of composite field processing -- creation of of formatter class in utils -- change template validator (prefs/save_template.py) to use new formatting class -- change save_to_disk to use new formatting class -- change Metadata class to use new formatting class -- Check for mutually recursive composite fields -- change caches.py to use the 'get' interface (now the right one) for composites 2) Add template validation to the base deviceconfig plugin. It checks if the display widget has a 'validate' method, and if so, it calls it. 3) Change models.py so that composite templates can be edited on the library display. -- back out the changes that set 'editable = False' 4) Fix problem in models.py where book info view was not being updated when a field is changed on library display 5) Changed save_to_disk to permit slashes in field specifications. Did this by splitting the template after template processing. This gives us basic variable folder structures Example: Simple example: we want the folder structure series/series_index - title. If series does not exist, then the title should be in the top folder. Template: {series:||/}{series_index:|| - }{title} 6) Change syntax for extended templates -- prefixes and suffixes have moved to the end of the field specification. Syntax: {series:|prefix value|suffix value} You can put a standard python format specification between the : and the first |. Either zero or two bars must be present. 7) Addition of some built-in functions to template processing. These appear in the format part. Syntax: {title:uppercase()|prefix value|suffix value} Functions apply to the value of the field in the format specification. The functions available are: -- uppercase(), lowercase(), titlecase(), capitalise() -- ifempty(text) If the field is empty, replace it with text. -- shorten(from start, center string, from end) Replace the field with a shortened version. The shortened version is found by joining the field's first 'from start' characters, the center string, and the field's last 'from end' characters. Example: assume that the title is 'Values of beta will give rise to dom'. The field specification {title:shorten(6,---,6)} will produce the result 'Values---to dom' -- lookup(key if field not empty, key if field empty) Replace the value of 'field' with the value of another field. The first field key (lookup name) is used if 'field' is not empty. The second field key is used if field is empty. This, coupled with composite fields and the change to save_to_disk above, facilitates complex variable folder trees on devices. Example: If a book has a series, then we want the folder structure series/series index - title.fmt. If the book does not have a series, then we want the folder structure genre/author_sort/title.fmt. If the book has no genre, use 'Unknown'. To accomplish this, we: 1) create a composite field named AA containing '{series:||}/{series_index} - {title'. 2) create a composite field named BB containing '{#genre:ifempty(Unknown)}/{author_sort}/{title} 3) set the save template to '{series:lookup(AA,BB)} --- src/calibre/ebooks/metadata/book/base.py | 50 ++++---- src/calibre/gui2/custom_column_widgets.py | 2 + .../gui2/device_drivers/configwidget.py | 15 +++ src/calibre/gui2/library/delegates.py | 28 ++++- src/calibre/gui2/library/models.py | 12 +- src/calibre/gui2/library/views.py | 6 +- src/calibre/gui2/preferences/columns.py | 3 +- .../gui2/preferences/create_custom_column.py | 4 - src/calibre/gui2/preferences/plugins.py | 6 +- src/calibre/gui2/preferences/save_template.py | 14 +-- src/calibre/library/caches.py | 2 +- src/calibre/library/save_to_disk.py | 29 +---- src/calibre/utils/formatter.py | 113 ++++++++++++++++++ 13 files changed, 210 insertions(+), 74 deletions(-) create mode 100644 src/calibre/utils/formatter.py diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index a2b2790ed9..16819cbd39 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import copy, re, string, traceback +import copy, re, traceback from calibre import prints from calibre.ebooks.metadata.book import SC_COPYABLE_FIELDS @@ -15,6 +15,7 @@ from calibre.ebooks.metadata.book import TOP_LEVEL_CLASSIFIERS from calibre.ebooks.metadata.book import ALL_METADATA_FIELDS from calibre.library.field_metadata import FieldMetadata from calibre.utils.date import isoformat, format_date +from calibre.utils.formatter import TemplateFormatter NULL_VALUES = { @@ -32,33 +33,19 @@ NULL_VALUES = { field_metadata = FieldMetadata() -class SafeFormat(string.Formatter): - ''' - Provides a format function that substitutes '' for any missing value - ''' +class SafeFormat(TemplateFormatter): def get_value(self, key, args, mi): - from calibre.library.save_to_disk import explode_string_template_value try: - prefix, key, suffix = explode_string_template_value(key) ign, v = mi.format_field(key, series_with_index=False) if v is None: return '' if v == '': return '' - return prefix + v + suffix + return v except: return key composite_formatter = SafeFormat() -compress_spaces = re.compile(r'\s+') - -def format_composite(x, mi): - try: - ans = composite_formatter.vformat(x, [], mi).strip() - except: - traceback.print_exc() - ans = x - return compress_spaces.sub(' ', ans) class Metadata(object): @@ -75,7 +62,9 @@ class Metadata(object): @param authors: List of strings or [] @param other: None or a metadata object ''' - object.__setattr__(self, '_data', copy.deepcopy(NULL_VALUES)) + _data = copy.deepcopy(NULL_VALUES) + object.__setattr__(self, '_data', _data) + _data['_curseq'] = _data['_compseq'] = 0 if other is not None: self.smart_update(other) else: @@ -98,14 +87,28 @@ class Metadata(object): pass if field in _data['user_metadata'].iterkeys(): d = _data['user_metadata'][field] - if d['datatype'] != 'composite': - return d['#value#'] - return format_composite(d['display']['composite_template'], self) + val = d['#value#'] + if d['datatype'] != 'composite' or \ + (_data['_curseq'] == _data['_compseq'] and val is not None): + return val + # Data in the structure has changed. Recompute the composite fields + _data['_compseq'] = _data['_curseq'] + for ck in _data['user_metadata']: + cf = _data['user_metadata'][ck] + if cf['datatype'] != 'composite': + continue + cf['#value#'] = 'RECURSIVE_COMPOSITE FIELD ' + field + cf['#value#'] = composite_formatter.safe_format( + d['display']['composite_template'], + self, _('TEMPLATE ERROR')).strip() + return d['#value#'] + raise AttributeError( 'Metadata object has no attribute named: '+ repr(field)) def __setattr__(self, field, val, extra=None): _data = object.__getattribute__(self, '_data') + _data['_curseq'] += 1 if field in TOP_LEVEL_CLASSIFIERS: _data['classifiers'].update({field: val}) elif field in STANDARD_METADATA_FIELDS: @@ -193,7 +196,7 @@ class Metadata(object): if v is not None: result[attr] = v for attr in _data['user_metadata'].iterkeys(): - v = _data['user_metadata'][attr]['#value#'] + v = self.get(attr, None) if v is not None: result[attr] = v if _data['user_metadata'][attr]['datatype'] == 'series': @@ -466,9 +469,6 @@ class Metadata(object): return (None, None, None, None) - def expand_template(self, template): - return format_composite(template, self) - def __unicode__(self): from calibre.ebooks.metadata import authors_to_string ans = [] diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index d16233be1a..90abfc2474 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -351,6 +351,8 @@ def populate_metadata_page(layout, db, book_id, bulk=False, two_column=False, pa if not x[col]['editable']: continue dt = x[col]['datatype'] + if dt == 'composite': + continue if dt == 'comments': continue w = widget_factory(dt, col) diff --git a/src/calibre/gui2/device_drivers/configwidget.py b/src/calibre/gui2/device_drivers/configwidget.py index 3d9c9ab2ee..1d6c84ef7c 100644 --- a/src/calibre/gui2/device_drivers/configwidget.py +++ b/src/calibre/gui2/device_drivers/configwidget.py @@ -6,7 +6,9 @@ __docformat__ = 'restructuredtext en' from PyQt4.Qt import QWidget, QListWidgetItem, Qt, QVariant, SIGNAL +from calibre.gui2 import error_dialog from calibre.gui2.device_drivers.configwidget_ui import Ui_ConfigWidget +from calibre.utils.formatter import validation_formatter class ConfigWidget(QWidget, Ui_ConfigWidget): @@ -77,3 +79,16 @@ class ConfigWidget(QWidget, Ui_ConfigWidget): def use_author_sort(self): return self.opt_use_author_sort.isChecked() + + def validate(self): + print 'here in validate' + tmpl = unicode(self.opt_save_template.text()) + try: + validation_formatter.validate(tmpl) + return True + except Exception, err: + error_dialog(self, _('Invalid template'), + '

'+_('The template %s is invalid:')%tmpl + \ + '
'+str(err), show=True) + + return False diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index bf233b1175..ceb1cf14a8 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -15,10 +15,11 @@ from PyQt4.Qt import QColor, Qt, QModelIndex, QSize, \ QStyledItemDelegate, QCompleter, \ QComboBox -from calibre.gui2 import UNDEFINED_QDATE +from calibre.gui2 import UNDEFINED_QDATE, error_dialog from calibre.gui2.widgets import EnLineEdit, TagsLineEdit from calibre.utils.date import now, format_date from calibre.utils.config import tweaks +from calibre.utils.formatter import validation_formatter from calibre.gui2.dialogs.comments_dialog import CommentsDialog class RatingDelegate(QStyledItemDelegate): # {{{ @@ -303,6 +304,31 @@ class CcBoolDelegate(QStyledItemDelegate): # {{{ val = 2 if val is None else 1 if not val else 0 editor.setCurrentIndex(val) +class CcTemplateDelegate(QStyledItemDelegate): # {{{ + def __init__(self, parent): + ''' + Delegate for custom_column bool data. + ''' + QStyledItemDelegate.__init__(self, parent) + + def createEditor(self, parent, option, index): + return EnLineEdit(parent) + + def setModelData(self, editor, model, index): + val = unicode(editor.text()) + try: + validation_formatter.validate(val) + except Exception, err: + error_dialog(self.parent(), _('Invalid template'), + '

'+_('The template %s is invalid:')%val + \ + '
'+str(err), show=True) + model.setData(index, QVariant(val), Qt.EditRole) + + def setEditorData(self, editor, index): + m = index.model() + val = m.custom_columns[m.column_map[index.column()]]['display']['composite_template'] + editor.setText(val) + # }}} diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 4b1e974b12..fe64a33c47 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -696,7 +696,8 @@ class BooksModel(QAbstractTableModel): # {{{ return flags def set_custom_column_data(self, row, colhead, value): - typ = self.custom_columns[colhead]['datatype'] + cc = self.custom_columns[colhead] + typ = cc['datatype'] label=self.db.field_metadata.key_to_label(colhead) s_index = None if typ in ('text', 'comments'): @@ -722,6 +723,14 @@ class BooksModel(QAbstractTableModel): # {{{ val = qt_to_dt(val, as_utc=False) elif typ == 'series': val, s_index = parse_series_string(self.db, label, value.toString()) + elif typ == 'composite': + tmpl = unicode(value.toString()).strip() + disp = cc['display'] + disp['composite_template'] = tmpl + self.db.set_custom_column_metadata(cc['colnum'], display = disp) + self.refresh(reset=True) + return True + self.db.set_custom(self.db.id(row), val, extra=s_index, label=label, num=None, append=False, notify=True) return True @@ -768,6 +777,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.db.set_pubdate(id, qt_to_dt(val, as_utc=False)) else: self.db.set(row, column, val) + self.refresh_rows([row], row) self.dataChanged.emit(index, index) return True diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index d3ead429cf..b113866ecc 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -13,7 +13,7 @@ from PyQt4.Qt import QTableView, Qt, QAbstractItemView, QMenu, pyqtSignal, \ from calibre.gui2.library.delegates import RatingDelegate, PubDateDelegate, \ TextDelegate, DateDelegate, TagsDelegate, CcTextDelegate, \ - CcBoolDelegate, CcCommentsDelegate, CcDateDelegate + CcBoolDelegate, CcCommentsDelegate, CcDateDelegate, CcTemplateDelegate from calibre.gui2.library.models import BooksModel, DeviceBooksModel from calibre.utils.config import tweaks, prefs from calibre.gui2 import error_dialog, gprefs @@ -47,6 +47,7 @@ class BooksView(QTableView): # {{{ self.cc_text_delegate = CcTextDelegate(self) self.cc_bool_delegate = CcBoolDelegate(self) self.cc_comments_delegate = CcCommentsDelegate(self) + self.cc_template_delegate = CcTemplateDelegate(self) self.display_parent = parent self._model = modelcls(self) self.setModel(self._model) @@ -392,8 +393,7 @@ class BooksView(QTableView): # {{{ elif cc['datatype'] == 'rating': self.setItemDelegateForColumn(cm.index(colhead), self.rating_delegate) elif cc['datatype'] == 'composite': - pass - # no delegate for composite columns, as they are not editable + self.setItemDelegateForColumn(cm.index(colhead), self.cc_template_delegate) else: dattr = colhead+'_delegate' delegate = colhead if hasattr(self, dattr) else 'text' diff --git a/src/calibre/gui2/preferences/columns.py b/src/calibre/gui2/preferences/columns.py index 761a9880b1..c1b9230f42 100644 --- a/src/calibre/gui2/preferences/columns.py +++ b/src/calibre/gui2/preferences/columns.py @@ -155,8 +155,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): name=self.custcols[c]['name'], datatype=self.custcols[c]['datatype'], is_multiple=self.custcols[c]['is_multiple'], - display = self.custcols[c]['display'], - editable = self.custcols[c]['editable']) + display = self.custcols[c]['display']) must_restart = True elif '*deleteme' in self.custcols[c]: db.delete_custom_column(label=self.custcols[c]['label']) diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index e88949a23c..bec21270df 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -156,9 +156,6 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): return self.simple_error('', _('You must enter a template for' ' composite columns')) display_dict = {'composite_template':unicode(self.composite_box.text())} - is_editable = False - else: - is_editable = True db = self.parent.gui.library_view.model().db key = db.field_metadata.custom_field_prefix+col @@ -168,7 +165,6 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): 'label':col, 'name':col_heading, 'datatype':col_type, - 'editable':is_editable, 'display':display_dict, 'normalized':None, 'colnum':None, diff --git a/src/calibre/gui2/preferences/plugins.py b/src/calibre/gui2/preferences/plugins.py index a26553db1c..388227e438 100644 --- a/src/calibre/gui2/preferences/plugins.py +++ b/src/calibre/gui2/preferences/plugins.py @@ -199,7 +199,11 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): config_dialog.exec_() if config_dialog.result() == QDialog.Accepted: - plugin.save_settings(config_widget) + if hasattr(config_widget, 'validate'): + if config_widget.validate(): + plugin.save_settings(config_widget) + else: + plugin.save_settings(config_widget) self._plugin_model.refresh_plugin(plugin) else: help_text = plugin.customization_help(gui=True) diff --git a/src/calibre/gui2/preferences/save_template.py b/src/calibre/gui2/preferences/save_template.py index 0f48893b69..5b3f0321b2 100644 --- a/src/calibre/gui2/preferences/save_template.py +++ b/src/calibre/gui2/preferences/save_template.py @@ -13,17 +13,8 @@ from PyQt4.Qt import QWidget, pyqtSignal from calibre.gui2 import error_dialog from calibre.gui2.preferences.save_template_ui import Ui_Form from calibre.library.save_to_disk import FORMAT_ARG_DESCS, preprocess_template +from calibre.utils.formatter import validation_formatter -class ValidateFormat(string.Formatter): - ''' - Provides a format function that substitutes '' for any missing value - ''' - def get_value(self, key, args, kwargs): - return 'this is some text that should be long enough' - -validate_formatter = ValidateFormat() -def validate_format(x, format_args): - return validate_formatter.vformat(x, [], format_args).strip() class SaveTemplate(QWidget, Ui_Form): @@ -62,9 +53,8 @@ class SaveTemplate(QWidget, Ui_Form): custom fields, because they may or may not exist. ''' tmpl = preprocess_template(self.opt_template.text()) - fa = {} try: - validate_format(tmpl, fa) + validation_formatter.validate(tmpl) except Exception, err: error_dialog(self, _('Invalid template'), '

'+_('The template %s is invalid:')%tmpl + \ diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 42feb6f8fa..7849eecb2e 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -546,7 +546,7 @@ class ResultCache(SearchQueryParser): if len(self.composites) > 0: mi = db.get_metadata(id, index_is_id=True) for k,c in self.composites: - self._data[id][c] = mi.format_field(k)[1] + self._data[id][c] = mi.get(k, None) except IndexError: return None try: diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 90e5413389..a0f739e4c2 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -9,6 +9,7 @@ __docformat__ = 'restructuredtext en' import os, traceback, cStringIO, re, string from calibre.utils.config import Config, StringConfig, tweaks +from calibre.utils.formatter import TemplateFormatter from calibre.utils.filenames import shorten_components_to, supports_long_names, \ ascii_filename, sanitize_file_name from calibre.ebooks.metadata.opf2 import metadata_to_opf @@ -101,40 +102,20 @@ def preprocess_template(template): template = template.decode(preferred_encoding, 'replace') return template -template_value_re = re.compile(r'^([^\|]*(?=\|))(?:\|?)([^\|]*)(?:\|?)((?<=\|).*?)$', - flags= re.UNICODE) - -def explode_string_template_value(key): - try: - matches = template_value_re.match(key) - if matches.lastindex != 3: - return key - return matches.groups() - except: - return '', key, '' - -class SafeFormat(string.Formatter): +class SafeFormat(TemplateFormatter): ''' Provides a format function that substitutes '' for any missing value ''' def get_value(self, key, args, kwargs): try: - prefix, key, suffix = explode_string_template_value(key) if kwargs[key]: - return prefix + unicode(kwargs[key]) + suffix + return kwargs[key] return '' except: return '' safe_formatter = SafeFormat() -def safe_format(x, format_args): - try: - ans = safe_formatter.vformat(x, [], format_args).strip() - except: - ans = '' - return re.sub(r'\s+', ' ', ans) - def get_components(template, mi, id, timefmt='%b %Y', length=250, sanitize_func=ascii_filename, replace_whitespace=False, to_lowercase=False): @@ -178,8 +159,8 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, elif custom_metadata[key]['datatype'] == 'bool': format_args[key] = _('yes') if format_args[key] else _('no') - components = [x.strip() for x in template.split('/') if x.strip()] - components = [safe_format(x, format_args) for x in components] + components = safe_formatter.safe_format(template, format_args, '') + components = [x.strip() for x in components.split('/') if x.strip()] components = [sanitize_func(x) for x in components if x] if not components: components = [str(id)] diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py new file mode 100644 index 0000000000..f9ef4e0846 --- /dev/null +++ b/src/calibre/utils/formatter.py @@ -0,0 +1,113 @@ +''' +Created on 23 Sep 2010 + +@author: charles +''' + +import re, string + +def _lookup(val, mi, field_if_set, field_not_set): + if hasattr(mi, 'format_field'): + if val: + return mi.format_field(field_if_set.strip())[1] + else: + return mi.format_field(field_not_set.strip())[1] + else: + if val: + return mi.get(field_if_set.strip(), '') + else: + return mi.get(field_not_set.strip(), '') + +def _ifempty(val, mi, value_if_empty): + if val: + return val + else: + return value_if_empty + +def _shorten(val, mi, leading, center_string, trailing): + l = int(leading) + t = int(trailing) + if len(val) > l + len(center_string) + t: + return val[0:l] + center_string + val[-t:] + else: + return val + +class TemplateFormatter(string.Formatter): + ''' + Provides a format function that substitutes '' for any missing value + ''' + + functions = { + 'uppercase' : (0, lambda x: x.upper()), + 'lowercase' : (0, lambda x: x.lower()), + 'titlecase' : (0, lambda x: x.title()), + 'capitalize' : (0, lambda x: x.capitalize()), + 'ifempty' : (1, _ifempty), + 'lookup' : (2, _lookup), + 'shorten' : (3, _shorten), + } + + def get_value(self, key, args, mi): + raise Exception('get_value must be implemented in the subclass') + + format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') + + def _explode_format_string(self, fmt): + try: + matches = self.format_string_re.match(fmt) + if matches is None or matches.lastindex != 3: + return fmt, '', '' + return matches.groups() + except: + import traceback + traceback.print_exc() + return fmt, '', '' + + def format_field(self, val, fmt): + fmt, prefix, suffix = self._explode_format_string(fmt) + + p = fmt.find('(') + if p >= 0 and fmt[-1] == ')' and fmt[0:p] in self.functions: + field = fmt[0:p] + func = self.functions[field] + args = fmt[p+1:-1].split(',') + if (func[0] == 0 and (len(args) != 1 or args[0])) or \ + (func[0] > 0 and func[0] != len(args)): + raise Exception ('Incorrect number of arguments for function '+ fmt[0:p]) + if func[0] == 0: + val = func[1](val, self.mi) + else: + val = func[1](val, self.mi, *args) + else: + val = string.Formatter.format_field(self, val, fmt) + if not val: + return '' + return prefix + val + suffix + + compress_spaces = re.compile(r'\s+') + + def vformat(self, fmt, args, kwargs): + self.mi = kwargs + ans = string.Formatter.vformat(self, fmt, args, kwargs) + return self.compress_spaces.sub(' ', ans).strip() + + def safe_format(self, fmt, kwargs, error_value): + try: + ans = self.vformat(fmt, [], kwargs).strip() + except: + ans = error_value + return ans + +class ValidateFormat(TemplateFormatter): + ''' + Provides a format function that substitutes '' for any missing value + ''' + def get_value(self, key, args, kwargs): + return 'this is some text that should be long enough' + + def validate(self, x): + return self.vformat(x, [], {}) + +validation_formatter = ValidateFormat() + + From 30c96df50546e9730ad1903ac31e54a05d09f723 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 23 Sep 2010 08:13:51 -0600 Subject: [PATCH 094/412] ... --- src/calibre/utils/pyconsole/history.py | 56 ++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/calibre/utils/pyconsole/history.py diff --git a/src/calibre/utils/pyconsole/history.py b/src/calibre/utils/pyconsole/history.py new file mode 100644 index 0000000000..5440e57153 --- /dev/null +++ b/src/calibre/utils/pyconsole/history.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +from collections import deque + +class History(object): # {{{ + + def __init__(self, current, entries): + self.entries = deque(entries, maxlen=max(2000, len(entries))) + self.index = len(self.entries) - 1 + self.current = self.default = current + self.last_was_back = False + + def back(self, amt=1): + if self.entries: + oidx = self.index + ans = self.entries[self.index] + self.index = max(0, self.index - amt) + self.last_was_back = self.index != oidx + return ans + + def forward(self, amt=1): + if self.entries: + d = self.index + if self.last_was_back: + d += 1 + if d >= len(self.entries) - 1: + self.index = len(self.entries) - 1 + self.last_was_back = False + return self.current + if self.last_was_back: + amt += 1 + self.index = min(len(self.entries)-1, self.index + amt) + self.last_was_back = False + return self.entries[self.index] + + def enter(self, x): + try: + self.entries.remove(x) + except ValueError: + pass + self.entries.append(x) + self.index = len(self.entries) - 1 + self.current = self.default + self.last_was_back = False + + def serialize(self): + return list(self.entries) + +# }}} + + From 36ce8740816958c064a10334df0cb50e36f4784c Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 23 Sep 2010 17:18:49 +0100 Subject: [PATCH 095/412] Fix db2.get_metadata to handle format correctly (it is already a list) Fix Metadata to put composite fields back where they belong --- src/calibre/ebooks/metadata/book/base.py | 2 +- src/calibre/library/database2.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 16819cbd39..2bbe76488e 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -99,7 +99,7 @@ class Metadata(object): continue cf['#value#'] = 'RECURSIVE_COMPOSITE FIELD ' + field cf['#value#'] = composite_formatter.safe_format( - d['display']['composite_template'], + cf['display']['composite_template'], self, _('TEMPLATE ERROR')).strip() return d['#value#'] diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index fd5809f937..fde57e2a2e 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -584,9 +584,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.title_sort = self.title_sort(idx, index_is_id=index_is_id) mi.formats = self.formats(idx, index_is_id=index_is_id, verify_formats=False) - if hasattr(mi.formats, 'split'): - mi.formats = mi.formats.split(',') - else: + if len(mi.formats) == 0: mi.formats = None tags = self.tags(idx, index_is_id=index_is_id) if tags: From b2d5f740b5268d369941e337c78c5838060caa98 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 23 Sep 2010 17:46:46 +0100 Subject: [PATCH 096/412] 1) Put back get_metadata code for format, and fix format. 2) Ensure that gui editing does an lcase. --- src/calibre/gui2/library/models.py | 2 +- src/calibre/library/database2.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index fe64a33c47..bab2a59b1c 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -724,7 +724,7 @@ class BooksModel(QAbstractTableModel): # {{{ elif typ == 'series': val, s_index = parse_series_string(self.db, label, value.toString()) elif typ == 'composite': - tmpl = unicode(value.toString()).strip() + tmpl = unicode(value.toString()).lower().strip() disp = cc['display'] disp['composite_template'] = tmpl self.db.set_custom_column_metadata(cc['colnum'], display = disp) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index fde57e2a2e..22de8df41f 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -584,7 +584,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.title_sort = self.title_sort(idx, index_is_id=index_is_id) mi.formats = self.formats(idx, index_is_id=index_is_id, verify_formats=False) - if len(mi.formats) == 0: + if hasattr(mi.formats, 'split'): + mi.formats = mi.formats.split(',') + else: mi.formats = None tags = self.tags(idx, index_is_id=index_is_id) if tags: @@ -731,7 +733,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): except: return None if not verify_formats: - return formats + return ','.join(formats) ans = [] for format in formats: if self.format_abspath(id, format, index_is_id=True) is not None: From 232ce4748ddcf03fc21007cc3a1d5ea72e01ce64 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 23 Sep 2010 17:59:50 +0100 Subject: [PATCH 097/412] Back out the models 'strip' change --- src/calibre/ebooks/metadata/book/base.py | 2 +- src/calibre/gui2/library/models.py | 2 +- src/calibre/library/save_to_disk.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 2bbe76488e..9e1085df25 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -36,7 +36,7 @@ field_metadata = FieldMetadata() class SafeFormat(TemplateFormatter): def get_value(self, key, args, mi): try: - ign, v = mi.format_field(key, series_with_index=False) + ign, v = mi.format_field(key.lower(), series_with_index=False) if v is None: return '' if v == '': diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index bab2a59b1c..fe64a33c47 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -724,7 +724,7 @@ class BooksModel(QAbstractTableModel): # {{{ elif typ == 'series': val, s_index = parse_series_string(self.db, label, value.toString()) elif typ == 'composite': - tmpl = unicode(value.toString()).lower().strip() + tmpl = unicode(value.toString()).strip() disp = cc['display'] disp['composite_template'] = tmpl self.db.set_custom_column_metadata(cc['colnum'], display = disp) diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index a0f739e4c2..11922b7154 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -108,8 +108,8 @@ class SafeFormat(TemplateFormatter): ''' def get_value(self, key, args, kwargs): try: - if kwargs[key]: - return kwargs[key] + if kwargs[key.lower()]: + return kwargs[key.lower()] return '' except: return '' From 1a782eb0ffa9ca7bfc063902b35b06f6e8399271 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 23 Sep 2010 20:36:52 +0100 Subject: [PATCH 098/412] - Some cleanups on templates. - Make save_to_disk templates sanitize all fields except composites --- src/calibre/ebooks/metadata/book/base.py | 9 ++- src/calibre/library/save_to_disk.py | 12 ++-- src/calibre/utils/formatter.py | 72 ++++++++++++------------ 3 files changed, 51 insertions(+), 42 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 9e1085df25..929dc01aec 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -34,9 +34,10 @@ NULL_VALUES = { field_metadata = FieldMetadata() class SafeFormat(TemplateFormatter): - def get_value(self, key, args, mi): + + def get_value(self, key, args, kwargs): try: - ign, v = mi.format_field(key.lower(), series_with_index=False) + ign, v = self.book.format_field(key.lower(), series_with_index=False) if v is None: return '' if v == '': @@ -100,7 +101,9 @@ class Metadata(object): cf['#value#'] = 'RECURSIVE_COMPOSITE FIELD ' + field cf['#value#'] = composite_formatter.safe_format( cf['display']['composite_template'], - self, _('TEMPLATE ERROR')).strip() + self, + _('TEMPLATE ERROR'), + self).strip() return d['#value#'] raise AttributeError( diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 11922b7154..2d0a3d1277 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -108,8 +108,12 @@ class SafeFormat(TemplateFormatter): ''' def get_value(self, key, args, kwargs): try: - if kwargs[key.lower()]: - return kwargs[key.lower()] + b = self.book.get_user_metadata(key, False) + key = key.lower() + if b is not None and b['datatype'] == 'composite': + return self.vformat(b['display']['composite_template'], [], kwargs) + if kwargs[key]: + return self.sanitize(kwargs[key.lower()]) return '' except: return '' @@ -159,9 +163,9 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, elif custom_metadata[key]['datatype'] == 'bool': format_args[key] = _('yes') if format_args[key] else _('no') - components = safe_formatter.safe_format(template, format_args, '') + components = safe_formatter.safe_format(template, format_args, '', mi, + sanitize=sanitize_func) components = [x.strip() for x in components.split('/') if x.strip()] - components = [sanitize_func(x) for x in components if x] if not components: components = [str(id)] components = [x.encode(filesystem_encoding, 'replace') if isinstance(x, diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index f9ef4e0846..95870d9c61 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -6,48 +6,48 @@ Created on 23 Sep 2010 import re, string -def _lookup(val, mi, field_if_set, field_not_set): - if hasattr(mi, 'format_field'): - if val: - return mi.format_field(field_if_set.strip())[1] - else: - return mi.format_field(field_not_set.strip())[1] - else: - if val: - return mi.get(field_if_set.strip(), '') - else: - return mi.get(field_not_set.strip(), '') - -def _ifempty(val, mi, value_if_empty): - if val: - return val - else: - return value_if_empty - -def _shorten(val, mi, leading, center_string, trailing): - l = int(leading) - t = int(trailing) - if len(val) > l + len(center_string) + t: - return val[0:l] + center_string + val[-t:] - else: - return val - class TemplateFormatter(string.Formatter): ''' Provides a format function that substitutes '' for any missing value ''' + def __init__(self): + string.Formatter.__init__(self) + self.book = None + self.kwargs = None + self.sanitize = None + + def _lookup(self, val, field_if_set, field_not_set): + if val: + return self.vformat('{'+field_if_set.strip()+'}', [], self.kwargs) + else: + return self.vformat('{'+field_not_set.strip()+'}', [], self.kwargs) + + def _ifempty(self, val, value_if_empty): + if val: + return val + else: + return value_if_empty + + def _shorten(self, val, leading, center_string, trailing): + l = int(leading) + t = int(trailing) + if len(val) > l + len(center_string) + t: + return val[0:l] + center_string + val[-t:] + else: + return val + functions = { - 'uppercase' : (0, lambda x: x.upper()), - 'lowercase' : (0, lambda x: x.lower()), - 'titlecase' : (0, lambda x: x.title()), - 'capitalize' : (0, lambda x: x.capitalize()), + 'uppercase' : (0, lambda s,x: x.upper()), + 'lowercase' : (0, lambda s,x: x.lower()), + 'titlecase' : (0, lambda s,x: x.title()), + 'capitalize' : (0, lambda s,x: x.capitalize()), 'ifempty' : (1, _ifempty), 'lookup' : (2, _lookup), 'shorten' : (3, _shorten), } - def get_value(self, key, args, mi): + def get_value(self, key, args): raise Exception('get_value must be implemented in the subclass') format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') @@ -75,9 +75,9 @@ class TemplateFormatter(string.Formatter): (func[0] > 0 and func[0] != len(args)): raise Exception ('Incorrect number of arguments for function '+ fmt[0:p]) if func[0] == 0: - val = func[1](val, self.mi) + val = func[1](self, val) else: - val = func[1](val, self.mi, *args) + val = func[1](self, val, *args) else: val = string.Formatter.format_field(self, val, fmt) if not val: @@ -87,11 +87,13 @@ class TemplateFormatter(string.Formatter): compress_spaces = re.compile(r'\s+') def vformat(self, fmt, args, kwargs): - self.mi = kwargs ans = string.Formatter.vformat(self, fmt, args, kwargs) return self.compress_spaces.sub(' ', ans).strip() - def safe_format(self, fmt, kwargs, error_value): + def safe_format(self, fmt, kwargs, error_value, book, sanitize=None): + self.kwargs = kwargs + self.book = book + self.sanitize = sanitize try: ans = self.vformat(fmt, [], kwargs).strip() except: From 1ad0eebd5658c73913dc0ef4b73a95ae0c8960a5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 23 Sep 2010 23:30:16 -0600 Subject: [PATCH 099/412] API for dealing with distributed metadata backup --- src/calibre/library/custom_columns.py | 5 ++- src/calibre/library/database2.py | 47 +++++++++++++++++++++++++- src/calibre/library/schema_upgrades.py | 12 +++++++ 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index d74024280e..2d8634659b 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -382,6 +382,7 @@ class CustomColumns(object): ) # get rid of the temp tables self.conn.executescript(drops) + self.dirtied(ids, commit=False) self.conn.commit() # set the in-memory copies of the tags @@ -402,19 +403,21 @@ class CustomColumns(object): same length as ids. ''' if extras is not None and len(extras) != len(ids): - raise ValueError('Lentgh of ids and extras is not the same') + raise ValueError('Length of ids and extras is not the same') ev = None for idx,id in enumerate(ids): if extras is not None: ev = extras[idx] self._set_custom(id, val, label=label, num=num, append=append, notify=notify, extra=ev) + self.dirtied(ids, commit=False) self.conn.commit() def set_custom(self, id, val, label=None, num=None, append=False, notify=True, extra=None, commit=True): self._set_custom(id, val, label=label, num=num, append=append, notify=notify, extra=extra) + self.dirtied([id], commit=False) if commit: self.conn.commit() diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 1fe77077b9..7a8aef541d 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -13,6 +13,7 @@ from math import floor from PyQt4.QtGui import QImage from calibre.ebooks.metadata import title_sort, author_to_author_sort +from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.library.database import LibraryDatabase from calibre.library.field_metadata import FieldMetadata, TagsIcons from calibre.library.schema_upgrades import SchemaUpgrade @@ -126,6 +127,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def __init__(self, library_path, row_factory=False): self.field_metadata = FieldMetadata() + self.dirtied_cache = set([]) if not os.path.exists(library_path): os.makedirs(library_path) self.listeners = set([]) @@ -337,6 +339,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): setattr(self, 'title_sort', functools.partial(self.get_property, loc=self.FIELD_MAP['sort'])) + d = self.conn.get('SELECT book FROM metadata_dirtied', all=True) + self.dirtied_cache.update(set([x[0] for x in d])) + self.refresh_ondevice = functools.partial(self.data.refresh_ondevice, self) self.refresh() self.last_update_check = self.last_modified() @@ -550,6 +555,33 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def metadata_for_field(self, key): return self.field_metadata[key] + def dump_metadata(self, book_ids, remove_from_dirtied=True, commit=True): + for book_id in book_ids: + mi = self.get_metadata(book_id, index_is_id=True, get_cover=True) + # Always set cover to cover.jpg. Even if cover doesn't exist, + # no harm done. This way no need to call dirtied when + # cover is set/removed + mi.cover = 'cover.jpg' + raw = metadata_to_opf(mi) + path = self.abspath(book_id, index_is_id=True) + with open(os.path.join(path, 'metadata.opf'), 'wb') as f: + f.write(raw) + if remove_from_dirtied: + self.conn.execute('DELETE FROM metadata_dirtied WHERE book=?', + (book_id,)) + if book_id in self.dirtied_cache: + self.dirtied_cache.remove(book_id) + if commit: + self.conn.commit() + + def dirtied(self, book_ids, commit=True): + self.conn.executemany( + 'INSERT OR REPLACE INTO metadata_dirtied VALUES (?)', + [(x,) for x in book_ids]) + if commit: + self.conn.commit() + self.dirtied.update(set(book_ids)) + def get_metadata(self, idx, index_is_id=False, get_cover=False): ''' Convenience method to return metadata as a :class:`Metadata` object. @@ -583,7 +615,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.uuid = self.uuid(idx, index_is_id=index_is_id) mi.title_sort = self.title_sort(idx, index_is_id=index_is_id) mi.formats = self.formats(idx, index_is_id=index_is_id, - verify_formats=False) + verify_formats=False) if hasattr(mi.formats, 'split'): mi.formats = mi.formats.split(',') else: @@ -1242,6 +1274,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): ss = self.author_sort_from_book(id, index_is_id=True) self.conn.execute('UPDATE books SET author_sort=? WHERE id=?', (ss, id)) + self.dirtied([id], commit=False) if commit: self.conn.commit() self.data.set(id, self.FIELD_MAP['authors'], @@ -1268,6 +1301,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): else: self.data.set(id, self.FIELD_MAP['sort'], title, row_is_id=True) self.set_path(id, index_is_id=True) + self.dirtied([id], commit=False) if commit: self.conn.commit() if notify: @@ -1277,6 +1311,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if dt: self.conn.execute('UPDATE books SET timestamp=? WHERE id=?', (dt, id)) self.data.set(id, self.FIELD_MAP['timestamp'], dt, row_is_id=True) + self.dirtied([id], commit=False) if commit: self.conn.commit() if notify: @@ -1286,6 +1321,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if dt: self.conn.execute('UPDATE books SET pubdate=? WHERE id=?', (dt, id)) self.data.set(id, self.FIELD_MAP['pubdate'], dt, row_is_id=True) + self.dirtied([id], commit=False) if commit: self.conn.commit() if notify: @@ -1304,6 +1340,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): else: aid = self.conn.execute('INSERT INTO publishers(name) VALUES (?)', (publisher,)).lastrowid self.conn.execute('INSERT INTO books_publishers_link(book, publisher) VALUES (?,?)', (id, aid)) + self.dirtied([id], commit=False) if commit: self.conn.commit() self.data.set(id, self.FIELD_MAP['publisher'], publisher, row_is_id=True) @@ -1594,6 +1631,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): '''.format(tables[0], tables[1]) ) self.conn.executescript(drops) + self.dirtied(ids, commit=False) self.conn.commit() for x in ids: @@ -1639,6 +1677,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): (id, tid), all=False): self.conn.execute('INSERT INTO books_tags_link(book, tag) VALUES (?,?)', (id, tid)) + self.dirtied([id], commit=False) if commit: self.conn.commit() tags = u','.join(self.get_tags(id)) @@ -1693,6 +1732,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): else: aid = self.conn.execute('INSERT INTO series(name) VALUES (?)', (series,)).lastrowid self.conn.execute('INSERT INTO books_series_link(book, series) VALUES (?,?)', (id, aid)) + self.dirtied([id], commit=False) if commit: self.conn.commit() self.data.set(id, self.FIELD_MAP['series'], series, row_is_id=True) @@ -1707,6 +1747,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): except: idx = 1.0 self.conn.execute('UPDATE books SET series_index=? WHERE id=?', (idx, id)) + self.dirtied([id], commit=False) if commit: self.conn.commit() self.data.set(id, self.FIELD_MAP['series_index'], idx, row_is_id=True) @@ -1719,6 +1760,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): rat = self.conn.get('SELECT id FROM ratings WHERE rating=?', (rating,), all=False) rat = rat if rat else self.conn.execute('INSERT INTO ratings(rating) VALUES (?)', (rating,)).lastrowid self.conn.execute('INSERT INTO books_ratings_link(book, rating) VALUES (?,?)', (id, rat)) + self.dirtied([id], commit=False) if commit: self.conn.commit() self.data.set(id, self.FIELD_MAP['rating'], rating, row_is_id=True) @@ -1731,11 +1773,13 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if commit: self.conn.commit() self.data.set(id, self.FIELD_MAP['comments'], text, row_is_id=True) + self.dirtied([id], commit=False) if notify: self.notify('metadata', [id]) def set_author_sort(self, id, sort, notify=True, commit=True): self.conn.execute('UPDATE books SET author_sort=? WHERE id=?', (sort, id)) + self.dirtied([id], commit=False) if commit: self.conn.commit() self.data.set(id, self.FIELD_MAP['author_sort'], sort, row_is_id=True) @@ -1744,6 +1788,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def set_isbn(self, id, isbn, notify=True, commit=True): self.conn.execute('UPDATE books SET isbn=? WHERE id=?', (isbn, id)) + self.dirtied([id], commit=False) if commit: self.conn.commit() self.data.set(id, self.FIELD_MAP['isbn'], isbn, row_is_id=True) diff --git a/src/calibre/library/schema_upgrades.py b/src/calibre/library/schema_upgrades.py index b08161abf2..167cc0a327 100644 --- a/src/calibre/library/schema_upgrades.py +++ b/src/calibre/library/schema_upgrades.py @@ -397,3 +397,15 @@ class SchemaUpgrade(object): UNIQUE(key)); ''' self.conn.executescript(script) + + def upgrade_version_13(self): + 'Dirtied table for OPF metadata backups' + script = ''' + DROP TABLE IF EXISTS metadata_dirtied; + CREATE TABLE metadata_dirtied(id INTEGER PRIMARY KEY, + book INTEGER NOT NULL, + UNIQUE(book)); + INSERT INTO metadata_dirtied (book) SELECT id FROM books; + ''' + self.conn.executescript(script) + From f46d919c751dbccb24f21c348ca130833ffc5a7a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 23 Sep 2010 23:50:22 -0600 Subject: [PATCH 100/412] Add thread to GUI for distributed metadata backup --- src/calibre/gui2/library/models.py | 5 ++++- src/calibre/gui2/ui.py | 4 ++++ src/calibre/library/caches.py | 30 ++++++++++++++++++++++++++++-- src/calibre/library/database2.py | 15 +++++++++------ 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index fe64a33c47..9d9de358c8 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -21,7 +21,7 @@ from calibre.utils.date import dt_factory, qt_to_dt, isoformat from calibre.ebooks.metadata.meta import set_metadata as _set_metadata from calibre.utils.search_query_parser import SearchQueryParser from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, \ - REGEXP_MATCH, CoverCache + REGEXP_MATCH, CoverCache, MetadataBackup from calibre.library.cli import parse_series_string from calibre import strftime, isbytestring, prepare_string_for_xml from calibre.constants import filesystem_encoding @@ -153,6 +153,9 @@ class BooksModel(QAbstractTableModel): # {{{ self.cover_cache.stop() self.cover_cache = CoverCache(db, FunctionDispatcher(self.db.cover)) self.cover_cache.start() + self.metadata_backup = MetadataBackup(db, + FunctionDispatcher(self.db.dump_metadata)) + self.metadata_backup.start() def refresh_cover(event, ids): if event == 'cover' and self.cover_cache is not None: self.cover_cache.refresh(ids) diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 9bc504a001..88a8c68572 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -551,6 +551,10 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ cc = self.library_view.model().cover_cache if cc is not None: cc.stop() + mb = self.library_view.model().metadata_backup + if mb is not None: + mb.stop() + self.hide_windows() self.emailer.stop() try: diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 7849eecb2e..2d37314896 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -21,7 +21,31 @@ from calibre.utils.pyparsing import ParseException from calibre.ebooks.metadata import title_sort from calibre import fit_image -class CoverCache(Thread): +class MetadataBackup(Thread): # {{{ + + def __init__(self, db, dump_func): + Thread.__init__(self) + self.daemon = True + self.db = db + self.dump_func = dump_func + self.keep_running = True + + def stop(self): + self.keep_running = False + + def run(self): + while self.keep_running: + try: + id_ = self.db.dirtied_queue.get(True, 5) + except Empty: + continue + # If there is an exception is dump_func, we + # have no way of knowing + self.dump_func([id_]) + +# }}} + +class CoverCache(Thread): # {{{ def __init__(self, db, cover_func): Thread.__init__(self) @@ -90,6 +114,7 @@ class CoverCache(Thread): for id_ in ids: self.cache.pop(id_, None) self.load_queue.put(id_) +# }}} ### Global utility function for get_match here and in gui2/library.py CONTAINS_MATCH = 0 @@ -107,7 +132,7 @@ def _match(query, value, matchkind): pass return False -class ResultCache(SearchQueryParser): +class ResultCache(SearchQueryParser): # {{{ ''' Stores sorted and filtered metadata in memory. @@ -694,4 +719,5 @@ class SortKeyGenerator(object): # }}} +# }}} diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 7a8aef541d..92f8cca0db 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -9,6 +9,7 @@ The database used to store ebook metadata import os, sys, shutil, cStringIO, glob, time, functools, traceback, re from itertools import repeat from math import floor +from Queue import Queue from PyQt4.QtGui import QImage @@ -127,7 +128,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def __init__(self, library_path, row_factory=False): self.field_metadata = FieldMetadata() - self.dirtied_cache = set([]) + self.dirtied_queue = Queue() if not os.path.exists(library_path): os.makedirs(library_path) self.listeners = set([]) @@ -340,7 +341,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): loc=self.FIELD_MAP['sort'])) d = self.conn.get('SELECT book FROM metadata_dirtied', all=True) - self.dirtied_cache.update(set([x[0] for x in d])) + for x in d: + self.dirtied_queue.put(x[0]) self.refresh_ondevice = functools.partial(self.data.refresh_ondevice, self) self.refresh() @@ -557,6 +559,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def dump_metadata(self, book_ids, remove_from_dirtied=True, commit=True): for book_id in book_ids: + if not self.data.has_id(book_id): + continue mi = self.get_metadata(book_id, index_is_id=True, get_cover=True) # Always set cover to cover.jpg. Even if cover doesn't exist, # no harm done. This way no need to call dirtied when @@ -569,18 +573,17 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if remove_from_dirtied: self.conn.execute('DELETE FROM metadata_dirtied WHERE book=?', (book_id,)) - if book_id in self.dirtied_cache: - self.dirtied_cache.remove(book_id) if commit: self.conn.commit() def dirtied(self, book_ids, commit=True): self.conn.executemany( - 'INSERT OR REPLACE INTO metadata_dirtied VALUES (?)', + 'INSERT OR REPLACE INTO metadata_dirtied (book) VALUES (?)', [(x,) for x in book_ids]) if commit: self.conn.commit() - self.dirtied.update(set(book_ids)) + for x in book_ids: + self.dirtied_queue.put(x) def get_metadata(self, idx, index_is_id=False, get_cover=False): ''' From 703ea3c77827a4053d4c020fa79e7d5e8111f24a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 23 Sep 2010 23:55:56 -0600 Subject: [PATCH 101/412] propert indentation in generated OPF files --- src/calibre/ebooks/metadata/opf2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 8a4ff6a5bd..5c2477c3dc 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -1230,7 +1230,7 @@ def metadata_to_opf(mi, as_string=True): %(id)s %(uuid)s - + '''%dict(a=__appname__, id=mi.application_id, uuid=mi.uuid))) From 87d70304bd7c96b3f65c565b1d8f8177f017f7a0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 24 Sep 2010 00:05:11 -0600 Subject: [PATCH 102/412] Make metadata backup a little more robust --- src/calibre/library/caches.py | 14 ++++++++++---- src/calibre/library/database2.py | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 2d37314896..0b5a922209 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -19,7 +19,7 @@ from calibre.utils.date import parse_date, now, UNDEFINED_DATE from calibre.utils.search_query_parser import SearchQueryParser from calibre.utils.pyparsing import ParseException from calibre.ebooks.metadata import title_sort -from calibre import fit_image +from calibre import fit_image, prints class MetadataBackup(Thread): # {{{ @@ -39,9 +39,15 @@ class MetadataBackup(Thread): # {{{ id_ = self.db.dirtied_queue.get(True, 5) except Empty: continue - # If there is an exception is dump_func, we - # have no way of knowing - self.dump_func([id_]) + except: + # Happens during interpreter shutdown + break + if self.dump_func([id_]) is None: + # An exception occured in dump_func, retry once + prints('Failed to backup metadata for id:', id_, 'once') + time.sleep(2) + if not self.dump_func([id_]): + prints('Failed to backup metadata for id:', id_, 'again, giving up') # }}} diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 92f8cca0db..6a0d442927 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -575,6 +575,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): (book_id,)) if commit: self.conn.commit() + return True def dirtied(self, book_ids, commit=True): self.conn.executemany( From 992e5c3c087c1e28cb1e5f1aa61ead0e4556de18 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 08:21:10 +0100 Subject: [PATCH 103/412] Repair damage during conflict resolution --- src/calibre/utils/formatter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index f1c2a2cb4d..a98f0e7f45 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -50,7 +50,7 @@ class TemplateFormatter(string.Formatter): format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') compress_spaces = re.compile(r'\s+') - def get_value(self, key, args): + def get_value(self, key, args, kwargs): raise Exception('get_value must be implemented in the subclass') From 12768864a59be5ddf477c490072fd682b1f5942a Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 08:54:06 +0100 Subject: [PATCH 104/412] 1) fix exception in set_metadata related to composite custom columns 2) make ondevice work with add_books_from_device --- src/calibre/gui2/actions/add.py | 2 +- src/calibre/gui2/device.py | 16 +++++++++------- src/calibre/gui2/library/models.py | 3 +++ src/calibre/library/custom_columns.py | 2 ++ 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index aa20b8bc16..e0a7b5647e 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -232,7 +232,7 @@ class AddAction(InterfaceAction): # metadata for this book to the device. This sets the uuid to the # correct value. Note that set_books_in_library might sync_booklists self.gui.set_books_in_library(booklists=[model.db], reset=True) - model.reset() + self.gui.refresh_ondevice() def add_books_from_device(self, view): rows = view.selectionModel().selectedRows() diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index a7e55c4619..58c5e5d9ad 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -721,14 +721,16 @@ class DeviceMixin(object): # {{{ self.device_manager.device.__class__.get_gui_name()+\ _(' detected.'), 3000) self.device_connected = device_kind - self.refresh_ondevice_info (device_connected = True, reset_only = True) + self.library_view.set_device_connected(self.device_connected) + self.refresh_ondevice (reset_only = True) else: self.device_connected = None self.status_bar.device_disconnected() if self.current_view() != self.library_view: self.book_details.reset_info() self.location_manager.update_devices() - self.refresh_ondevice_info(device_connected=False) + self.library_view.set_device_connected(self.device_connected) + self.refresh_ondevice() def info_read(self, job): ''' @@ -760,9 +762,9 @@ class DeviceMixin(object): # {{{ self.card_b_view.set_editable(self.device_manager.device.CAN_SET_METADATA) self.sync_news() self.sync_catalogs() - self.refresh_ondevice_info(device_connected = True) + self.refresh_ondevice() - def refresh_ondevice_info(self, device_connected, reset_only = False): + def refresh_ondevice(self, reset_only = False): ''' Force the library view to refresh, taking into consideration new device books information @@ -770,7 +772,7 @@ class DeviceMixin(object): # {{{ self.book_on_device(None, reset=True) if reset_only: return - self.library_view.set_device_connected(device_connected) + self.library_view.model().refresh_ondevice() # }}} @@ -803,7 +805,7 @@ class DeviceMixin(object): # {{{ self.book_on_device(None, reset=True) # We need to reset the ondevice flags in the library. Use a big hammer, # so we don't need to worry about whether some succeeded or not. - self.refresh_ondevice_info(device_connected=True, reset_only=False) + self.refresh_ondevice(reset_only=False) def dispatch_sync_event(self, dest, delete, specific): rows = self.library_view.selectionModel().selectedRows() @@ -1300,7 +1302,7 @@ class DeviceMixin(object): # {{{ if not self.set_books_in_library(self.booklists(), reset=True): self.upload_booklists() self.book_on_device(None, reset=True) - self.refresh_ondevice_info(device_connected = True) + self.refresh_ondevice() view = self.card_a_view if on_card == 'carda' else \ self.card_b_view if on_card == 'cardb' else self.memory_view diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 9d9de358c8..640a588d29 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -120,6 +120,9 @@ class BooksModel(QAbstractTableModel): # {{{ def set_device_connected(self, is_connected): self.device_connected = is_connected + self.refresh_ondevice() + + def refresh_ondevice(self): self.db.refresh_ondevice() self.refresh() # does a resort() self.research() diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index 2d8634659b..97c8565177 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -427,6 +427,8 @@ class CustomColumns(object): data = self.custom_column_label_map[label] if num is not None: data = self.custom_column_num_map[num] + if data['datatype'] == 'composite': + return None if not data['editable']: raise ValueError('Column %r is not editable'%data['label']) table, lt = self.custom_table_names(data['num']) From 97e2c838d0e6e4920ce4e1f4d71688979f57b68d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 10:50:50 +0100 Subject: [PATCH 105/412] 1) Fix of json codec. 2) make dump_metadata set get_cover=False --- src/calibre/ebooks/metadata/book/json_codec.py | 3 ++- src/calibre/library/database2.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index 2550089473..c02d4e953d 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -75,7 +75,8 @@ class JsonCodec(object): self.field_metadata = FieldMetadata() def encode_to_file(self, file, booklist): - json.dump(self.encode_booklist_metadata(booklist), file, indent=2, encoding='utf-8') + file.write(json.dumps(self.encode_booklist_metadata(booklist), + indent=2, encoding='utf-8')) def encode_booklist_metadata(self, booklist): result = [] diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 6a0d442927..773a4bdc9f 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -561,7 +561,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): for book_id in book_ids: if not self.data.has_id(book_id): continue - mi = self.get_metadata(book_id, index_is_id=True, get_cover=True) + mi = self.get_metadata(book_id, index_is_id=True, get_cover=False) # Always set cover to cover.jpg. Even if cover doesn't exist, # no harm done. This way no need to call dirtied when # cover is set/removed From 8b9b64a8e6bdab03f62c98a4f2c35ec73957cca7 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 11:34:52 +0100 Subject: [PATCH 106/412] 1) add two tweaks controlling what custom fields the content server displays 2) add & cleanup some field_metadata methods --- resources/default_tweaks.py | 18 ++++++++++++++++++ src/calibre/gui2/library/models.py | 2 +- src/calibre/library/database2.py | 6 ++++++ src/calibre/library/field_metadata.py | 2 +- src/calibre/library/server/__init__.py | 12 +++++++++++- src/calibre/library/server/mobile.py | 3 ++- src/calibre/library/server/opds.py | 3 ++- src/calibre/library/server/xml.py | 3 ++- 8 files changed, 43 insertions(+), 6 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 04b861605e..095eba0c3d 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -145,6 +145,24 @@ add_new_book_tags_when_importing_books = False # Set the maximum number of tags to show per book in the content server max_content_server_tags_shown=5 +# Set custom metadata fields that the content server will or will not display. +# content_server_will_display is a list of custom fields to be displayed. +# content_server_wont_display is a list of custom fields not to be displayed. +# wont_display has priority over will_display. +# The special value '*' means all custom fields. +# Defaults: +# content_server_will_display = ['*'] +# content_server_wont_display = [''] +# Examples: +# To display only the custom fields #mytags and #genre: +# content_server_will_display = ['#mytags', '#genre'] +# content_server_wont_display = [''] +# To display all fields except #mycomments: +# content_server_will_display = ['*'] +# content_server_wont_display['#mycomments'] +content_server_will_display = ['*'] +content_server_wont_display = [''] + # Set the maximum number of sort 'levels' that calibre will use to resort the # library after certain operations such as searches or device insertion. Each diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 640a588d29..af1b42bf33 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -132,7 +132,7 @@ class BooksModel(QAbstractTableModel): # {{{ def set_database(self, db): self.db = db - self.custom_columns = self.db.field_metadata.get_custom_field_metadata() + self.custom_columns = self.db.field_metadata.custom_field_metadata() self.column_map = list(self.orig_headers.keys()) + \ list(self.custom_columns) def col_idx(name): diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 773a4bdc9f..c7c4926b14 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -554,6 +554,12 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def search_term_to_field_key(self, term): return self.field_metadata.search_term_to_key(term) + def custom_field_metadata(self): + return self.field_metadata.custom_field_metadata() + + def all_metadata(self): + return self.field_metadata.all_metadata() + def metadata_for_field(self, key): return self.field_metadata[key] diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index bac423f46d..d608dca49d 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -411,7 +411,7 @@ class FieldMetadata(dict): l[k] = self._tb_cats[k] return l - def get_custom_field_metadata(self): + def custom_field_metadata(self): l = {} for k in self._tb_cats: if self._tb_cats[k]['is_custom']: diff --git a/src/calibre/library/server/__init__.py b/src/calibre/library/server/__init__.py index 5050dfaa99..7cdea9f602 100644 --- a/src/calibre/library/server/__init__.py +++ b/src/calibre/library/server/__init__.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' import os -from calibre.utils.config import Config, StringConfig, config_dir +from calibre.utils.config import Config, StringConfig, config_dir, tweaks listen_on = '0.0.0.0' @@ -46,6 +46,16 @@ def server_config(defaults=None): 'to disable grouping.')) return c +def custom_fields_to_display(db): + ckeys = db.custom_field_keys() + yes_fields = set(tweaks['content_server_will_display']) + no_fields = set(tweaks['content_server_wont_display']) + if '*' in yes_fields: + yes_fields = set(ckeys) + if '*' in no_fields: + no_fields = set(ckeys) + return frozenset(yes_fields - no_fields) + def main(): from calibre.library.server.main import main return main() diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index c0a3c122cd..071c7b1077 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -13,6 +13,7 @@ from lxml import html from lxml.html.builder import HTML, HEAD, TITLE, LINK, DIV, IMG, BODY, \ OPTION, SELECT, INPUT, FORM, SPAN, TABLE, TR, TD, A, HR +from calibre.library.server import custom_fields_to_display from calibre.library.server.utils import strftime, format_tag_string from calibre.ebooks.metadata import fmt_sidx from calibre.constants import __appname__ @@ -197,7 +198,7 @@ class MobileServer(object): self.sort(items, sort, (order.lower().strip() == 'ascending')) CFM = self.db.field_metadata - CKEYS = [key for key in sorted(CFM.get_custom_fields(), + CKEYS = [key for key in sorted(custom_fields_to_display(self.db), cmp=lambda x,y: cmp(CFM[x]['name'].lower(), CFM[y]['name'].lower()))] # This method uses its own book dict, not the Metadata dict. The loop diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index d495f58fa1..0e6917c504 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -17,6 +17,7 @@ import routes from calibre.constants import __appname__ from calibre.ebooks.metadata import fmt_sidx from calibre.library.comments import comments_to_html +from calibre.library.server import custom_fields_to_display from calibre.library.server.utils import format_tag_string from calibre import guess_type from calibre.utils.ordered_dict import OrderedDict @@ -277,7 +278,7 @@ class AcquisitionFeed(NavFeed): db): NavFeed.__init__(self, id_, updated, version, offsets, page_url, up_url) CFM = db.field_metadata - CKEYS = [key for key in sorted(CFM.get_custom_fields(), + CKEYS = [key for key in sorted(custom_fields_to_display(db), cmp=lambda x,y: cmp(CFM[x]['name'].lower(), CFM[y]['name'].lower()))] for item in items: diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py index 45ffdc2737..12fcc217f0 100644 --- a/src/calibre/library/server/xml.py +++ b/src/calibre/library/server/xml.py @@ -11,6 +11,7 @@ import cherrypy from lxml.builder import ElementMaker from lxml import etree +from calibre.library.server import custom_fields_to_display from calibre.library.server.utils import strftime, format_tag_string from calibre.ebooks.metadata import fmt_sidx from calibre.constants import preferred_encoding @@ -94,7 +95,7 @@ class XMLServer(object): c = kwargs.pop('comments') CFM = self.db.field_metadata - CKEYS = [key for key in sorted(CFM.get_custom_fields(), + CKEYS = [key for key in sorted(custom_fields_to_display(self.db), cmp=lambda x,y: cmp(CFM[x]['name'].lower(), CFM[y]['name'].lower()))] custcols = [] From 67c7555fd0eb22802892ec716ec5564f3d423bc4 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 11:36:26 +0100 Subject: [PATCH 107/412] Fix content server gui.js bug where it put '...' on the end of a list even if the list was exactly the right size. --- resources/content_server/gui.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/content_server/gui.js b/resources/content_server/gui.js index bd0743a854..86cd04289b 100644 --- a/resources/content_server/gui.js +++ b/resources/content_server/gui.js @@ -63,8 +63,9 @@ function render_book(book) { if (tags) { t = tags.split(':&:', 2); m = parseInt(t[0]); + tall = t[1].split(','); t = t[1].split(',', m); - if (t.length == m) t[m] = '...' + if (tall.length > m) t[m] = '...' title += 'Tags=[{0}] '.format(t.join(',')); } custcols = book.attr("custcols").split(',') From ad69ef985a04b5485550f83661ee0b56723605f1 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 12:27:39 +0100 Subject: [PATCH 108/412] Add a 'test' function to templates. Analogous to lookup, but inserts plain text instead of a template. --- src/calibre/utils/formatter.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index a98f0e7f45..5c5893576c 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -23,6 +23,12 @@ class TemplateFormatter(string.Formatter): else: return self.vformat('{'+field_not_set.strip()+'}', [], self.kwargs) + def _test(self, val, value_if_set, value_not_set): + if val: + return value_if_set + else: + return value_not_set + def _ifempty(self, val, value_if_empty): if val: return val @@ -45,6 +51,7 @@ class TemplateFormatter(string.Formatter): 'ifempty' : (1, _ifempty), 'lookup' : (2, _lookup), 'shorten' : (3, _shorten), + 'test' : (2, _lookup), } format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') From b2a6ed3af48a47c5cc7bb3372a3b084a004b7fcf Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 12:43:54 +0100 Subject: [PATCH 109/412] 1) fix bulk edit to not display a tab if library has only composite columns 2) fix a reference to get_custom_field_metadata that I somehow missed. --- src/calibre/gui2/dialogs/metadata_bulk.py | 3 ++- src/calibre/gui2/preferences/columns.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index a9e45087fd..1e3576e333 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -167,7 +167,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.tag_editor_button.clicked.connect(self.tag_editor) self.autonumber_series.stateChanged[int].connect(self.auto_number_changed) - if len(db.custom_column_label_map) == 0: + if len([k for k in db.custom_field_metadata().values() + if k['datatype'] != 'composite']) == 0: self.central_widget.removeTab(1) else: self.create_custom_column_editors() diff --git a/src/calibre/gui2/preferences/columns.py b/src/calibre/gui2/preferences/columns.py index c1b9230f42..03a50e6f3a 100644 --- a/src/calibre/gui2/preferences/columns.py +++ b/src/calibre/gui2/preferences/columns.py @@ -21,7 +21,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): def genesis(self, gui): self.gui = gui db = self.gui.library_view.model().db - self.custcols = copy.deepcopy(db.field_metadata.get_custom_field_metadata()) + self.custcols = copy.deepcopy(db.field_metadata.custom_field_metadata()) self.column_up.clicked.connect(self.up_column) self.column_down.clicked.connect(self.down_column) From 529756238340e0dd66c3be0cfc1f5f7a8a178cfa Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 12:57:49 +0100 Subject: [PATCH 110/412] Refactor code to clean interfaces and remove overly complex loop in bulk edit --- src/calibre/gui2/dialogs/metadata_bulk.py | 3 +-- src/calibre/library/database2.py | 8 ++++---- src/calibre/library/field_metadata.py | 22 +++++++++++----------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 1e3576e333..b14390e001 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -167,8 +167,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.tag_editor_button.clicked.connect(self.tag_editor) self.autonumber_series.stateChanged[int].connect(self.auto_number_changed) - if len([k for k in db.custom_field_metadata().values() - if k['datatype'] != 'composite']) == 0: + if len(db.custom_field_keys(include_composites=False)) == 0: self.central_widget.removeTab(1) else: self.create_custom_column_editors() diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index c7c4926b14..22175d3910 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -539,8 +539,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def standard_field_keys(self): return self.field_metadata.standard_field_keys() - def custom_field_keys(self): - return self.field_metadata.custom_field_keys() + def custom_field_keys(self, include_composites=True): + return self.field_metadata.custom_field_keys(include_composites) def all_field_keys(self): return self.field_metadata.all_field_keys() @@ -554,8 +554,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def search_term_to_field_key(self, term): return self.field_metadata.search_term_to_key(term) - def custom_field_metadata(self): - return self.field_metadata.custom_field_metadata() + def custom_field_metadata(self, include_composites=True): + return self.field_metadata.custom_field_metadata(include_composites) def all_metadata(self): return self.field_metadata.all_metadata() diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index d608dca49d..37393d0d2c 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -358,10 +358,14 @@ class FieldMetadata(dict): if self._tb_cats[k]['kind']=='field' and not self._tb_cats[k]['is_custom']] - def custom_field_keys(self): - return [k for k in self._tb_cats.keys() - if self._tb_cats[k]['kind']=='field' and - self._tb_cats[k]['is_custom']] + def custom_field_keys(self, include_composites=True): + res = [] + for k in self._tb_cats.keys(): + fm = self._tb_cats[k] + if fm['kind']=='field' and fm['is_custom'] and \ + (fm['datatype'] != 'composite' or include_composites): + res.append(k) + return res def all_field_keys(self): return [k for k in self._tb_cats.keys() if self._tb_cats[k]['kind']=='field'] @@ -402,20 +406,16 @@ class FieldMetadata(dict): return self.custom_label_to_key_map[label] raise ValueError('Unknown key [%s]'%(label)) - def get_custom_fields(self): - return [l for l in self._tb_cats if self._tb_cats[l]['is_custom']] - def all_metadata(self): l = {} for k in self._tb_cats: l[k] = self._tb_cats[k] return l - def custom_field_metadata(self): + def custom_field_metadata(self, include_composites=True): l = {} - for k in self._tb_cats: - if self._tb_cats[k]['is_custom']: - l[k] = self._tb_cats[k] + for k in self.custom_field_keys(include_composites): + l[k] = self._tb_cats[k] return l def add_custom_field(self, label, table, column, datatype, colnum, name, From 25905a349c745108abd6290d5835b109359a72de Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 13:20:26 +0100 Subject: [PATCH 111/412] Test the 'test' function. Add 're' function and test it. --- src/calibre/utils/formatter.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index 5c5893576c..c6bcaa1c3e 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -43,6 +43,9 @@ class TemplateFormatter(string.Formatter): else: return val + def _re(self, val, pattern, replacement): + return re.sub(pattern, replacement, val) + functions = { 'uppercase' : (0, lambda s,x: x.upper()), 'lowercase' : (0, lambda s,x: x.lower()), @@ -50,8 +53,9 @@ class TemplateFormatter(string.Formatter): 'capitalize' : (0, lambda s,x: x.capitalize()), 'ifempty' : (1, _ifempty), 'lookup' : (2, _lookup), + 're' : (2, _re), 'shorten' : (3, _shorten), - 'test' : (2, _lookup), + 'test' : (2, _test), } format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') From 211bb81113865b1cb38c2f8697b33694a4bb38fe Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 14:43:07 +0100 Subject: [PATCH 112/412] Put back the sanitize after split on slashes. --- src/calibre/library/save_to_disk.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index a58686f709..e479d27121 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -166,6 +166,7 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, components = safe_formatter.safe_format(template, format_args, '', mi, sanitize=sanitize_func) components = [x.strip() for x in components.split('/') if x.strip()] + components = [sanitize_func(x) for x in components if x] if not components: components = [str(id)] components = [x.encode(filesystem_encoding, 'replace') if isinstance(x, From 93c8836cb6622579323d95f86dfb6fa03dda78cb Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 15:18:03 +0100 Subject: [PATCH 113/412] Changes to template faq --- src/calibre/manual/template_lang.rst | 85 +++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 14 deletions(-) diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index 59e5c1da4c..6d87a90c93 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -7,9 +7,9 @@ The |app| template language ======================================================= The |app| template language is used in various places. It is used to control the folder structure and file name when saving files from the |app| library to the disk or eBook reader. -It is used to define "virtual" columns that contain data from other columns and so on. +It is also used to define "virtual" columns that contain data from other columns and so on. -In essence, the template language is very simple. The basic idea is that a template consists of names in curly brackets that are then replaced by the corresponding metadata from the book being processed. So, for example, the default template used for saving books to device in |app| is:: +The basi template language is very simple, but has very powerful advanced features. The basic idea is that a template consists of names in curly brackets that are then replaced by the corresponding metadata from the book being processed. So, for example, the default template used for saving books to device in |app| is:: {author_sort}/{title}/{title} - {authors} @@ -17,7 +17,9 @@ For the book "The Foundation" by "Isaac Asimov" it will become:: Asimov, Isaac/The Foundation/The Foundation - Isaac Asimov -You can use all the various metadata fields available in calibre in a template, including the custom columns you have created yourself. To find out the template name for a column sinply hover your mouse over the column header. Names for custom fields (columns you have created yourself) are always prefixed by an #. For series type fields, there is always an additional field named ``series_index`` that becomes the series index for that series. So if you have a custom series field named #myseries, there will also be a field named #myseries_index. In addition to the column based fields, you also can use:: +You can use all the various metadata fields available in calibre in a template, including any custom columns you have created yourself. To find out the template name for a column simply hover your mouse over the column header. Names for custom fields (columns you have created yourself) always have a # as the first character. For series type custom fields, there is always an additional field named ``#seriesname_index`` that becomes the series index for that series. So if you have a custom series field named #myseries, there will also be a field named #myseries_index. + +In addition to the column based fields, you also can use:: {formats} - A list of formats available in the calibre library for a book {isbn} - The ISBN number of the book @@ -26,7 +28,7 @@ If a particular book does not have a particular piece of metadata, the field in {author_sort}/{series}/{title} {series_index} -will become:: +If a book has a series, the template will produce:: {Asimov, Isaac}/Foundation/Second Foundation - 3 @@ -40,35 +42,90 @@ and if a book does not have a series:: Advanced formatting ---------------------- -You can do more than just simple substitution with the templates. You can also conditionally include text and control how the substituted data is formatted. +You can do more than just simple substitution with the templates. You can also conditionally include text and control how the substituted data is formatted. + +First, conditionally including text. There are cases where you might want to have text appear in the output only if a field is not empty. A common case is series and series_index, where you want either nothing or the two values with a hyphen between them. Calibre handles this case using a special field syntax. -Regarding conditionally including text: there are cases where you might want to have text appear in the output only if a field is not empty. A common case is series and series_index, where you want either nothing or the two values with a hyphen between them. Calibre handles this case using a special field syntax. For example, assume you want to use the template {series} - {series_index} - {title} -Unfortunately, if the book has no series, the answer will be '- - title'. Many people would rather it be simply 'title', without the hyphens. To do this, use the extended syntax {some_text|field|other_text}. When you use this syntax, if field has the value SERIES then the result will be some_textSERIESother_text. If field has no value, then the result will be the empty string (nothing). Using this syntax, we can solve the above series problem with the template:: +If the book has no series, the answer will be '- - title'. Many people would rather the result be simply 'title', without the hyphens. To do this, use the extended syntax `{field:|prefix_text|suffix_text}`. When you use this syntax, if field has the value SERIES then the result will be prefix_textSERIESsuffix_text. If field has no value, then the result will be the empty string (nothing). The prefix and suffix can contain blanks. - {series}{ - |series_index| - }{title} +Using this syntax, we can solve the above series problem with the template: -The hyphens will be included only if the book has a series index. Note: you must either use no | characters or both of them. Using one, such as in {field| - }, is not allowed. It is OK to not provide any text for one side or the other, such as in {\|series\| - }. Using {\|title\|} is the same as using {title}. + {series}{series_index:| - | - }{title} -Now to formatting. Suppose you wanted to ensure that the series_index is always formatted as three digits with leading zeros. This would do the trick:: +The hyphens will be included only if the book has a series index. + +Notes: you must include the : character if you want to use a prefix or a suffix. You must either use no | characters or both of them; using one, as in `{field:| - }`, is not allowed. It is OK not to provide any text for one side or the other, such as in `{series:|| - }`. Using `{title:||}` is the same as using `{title}`. + +Second: formatting. Suppose you wanted to ensure that the series_index is always formatted as three digits with leading zeros. This would do the trick:: {series_index:0>3s} - Three digits with leading zeros -If instead of leading zeros you want leading spaces, use:: +If instead of leading zeros you want leading spaces, use: - {series_index:>3s} - Thre digits with leading spaces + {series_index:>3s} - Three digits with leading spaces -For trailing zeros, use:: +For trailing zeros, use: {series_index:0<3s} - Three digits with trailing zeros -If you want only the first two letters of the data to be rendered, use:: +If you want only the first two letters of the data, use:: {author_sort:.2} - Only the first two letter of the author sort name The |app| template language comes from python and for more details on the syntax of these advanced formatting operations, look at the `Python documentation `_. +Advanced features +------------------ + +Using templates in custom columns +---------------------------------- + +There are sometimes cases where you want to display metadata that |app| does not normally display, or to display data in a way different from how |app| normally does. For example, you might want to display the ISBN, a field that |app| does not display. You can use custom columns for this. To do so, you create a column with the type 'column built from other columns' (hereafter called composite columns), enter a template, and |app| will display in the column the result of evaluating that template. To display the isbn, create the column and enter `{isbn}` into the template box. To display a column containing the values of two series custom columns separated by a comma, use `{#series1:||,}{#series2}`. + +Composite columns can use any template option, including formatting. + +You cannot change the data contained in a composite column. If you edit a composite column by double-clicking on any item, you will open the template for editing, not the underlying data. Editing the template on the GUI is a quick way of testing and changing composite columns. + +Using functions in templates +----------------------------- + +Suppose you want to display the value of a field in upper case, when that field is normally in title case. You can do this (and many more things) using the functions available for templates. For example, to display the title in upper case, use `{title:uppercase()}`. To display it in title case, use `{title:titlecase()}`. + +Function references replace the formatting specification, going after the : and before the first `|` or the closing `}`. Functions must always end with `()`. Some functions take extra values (arguments), and these go inside the `()`. + +The syntax for using functions is `{field:function(arguments)}`, or `{field:function(arguments)|prefix|suffix}`. Argument values cannot contain a comma, because it is used to separate arguments. Functions return the value of the field used in the template, suitably modified. + +The functions available are: + +* `lowercase()` -- return value of the field in lower case. +* `uppercase()` -- return the value of the field in upper case. +* `titlecase()` -- return the value of the field in title case. +* `capitalize()` -- return the value as capitalized. +* `ifempty(text)` -- if the field is not empty, return the value of the field. Otherwise return `text`. +* `test(text if not empty, text if empty)` -- return `text if not empty` if the field is not empty, otherwise return `text if empty`. +* `shorten(left chars, middle text, right chars)` -- Return a shortened version of the field, consisting of `left chars` characters from the beginning of the field, followed by `middle text`, followed by `right chars` characters from the end of the string. `Left chars` and `right chars` must be integers. For example, assume the title of the book is `Ancient English Laws in the Times of Ivanhoe`, and you want it to fit in a space of at most 15 characters. If you use `{title:shorten(9,-,5)}, the result will be `Ancient E-nhoe`. If the field's length is less than `left chars` + `right chars` + the length of `middle text`, then the field will be used intact. For example, the title `The Dome` would not be changed. +* `lookup(field if not empty, field if empty)` -- like test, except the arguments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note that because composite columns are fields, you can use this function in one composite field to use the value of some other composite field. This is extremely useful when constructing variable save paths (more later). +* `re(pattern, replacement)` -- return the field after applying the regular expression. All instances of `pattern` are replaced with `replacement`. As in all of |app|, these are python-compatible regular expressions. + +Special notes for save/send templates +------------------------------------- + +Special processing is applied when a template is used in a `save to disk` or `send to device` template. The values of the fields are cleaned, replacing characters that are special to file systems with underscores, including slashes. This means that field text cannot be used to create folders. However, slashes are not changed in prefix or suffix strings, so slashes in these strings will cause folders to be created. Because of this, you can create variable-depth folder structure. + +For example, assume we want the folder structure `series/series_index - title`, with the caveat that if series does not exist, then the title should be in the top folder. The template to do this is + + {series:||/}{series_index:|| - }{title} + +The slash and the hyphen appear only if series is not empty. + +The lookup function lets us do even fancier processing. For example, assume we want the following: if a book has a series, then we want the folder structure `series/series index - title.fmt`. If the book does not have a series, then we want the folder structure `genre/author_sort/title.fmt`. If the book has no genre, use 'Unknown'. We want two completely different paths, depending on the value of series. + +To accomplish this, we: +1. Create a composite field (call it AA) containing `{series:||}/{series_index} - {title'}`. If the series is not empty, then this template will produce `series/series_index - title`. +2. Create a composite field (call it BB) containing `{#genre:ifempty(Unknown)}/{author_sort}/{title}`. This template produces `genre/author_sort/title`, where an empty genre is replaced wuth `Unknown`. +3. Set the save template to `{series:lookup(AA,BB)}`. This template chooses composite field AA if series is not empty, and composite field BB if series is empty. We therefore have two completely different save paths, depending on whether or not `series` is empty. From 02e9160f3752c179391bfddbb1b3febb9cb3a517 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 15:23:35 +0100 Subject: [PATCH 114/412] Fix typo --- src/calibre/manual/template_lang.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index 6d87a90c93..2c49cfe308 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -9,7 +9,7 @@ The |app| template language The |app| template language is used in various places. It is used to control the folder structure and file name when saving files from the |app| library to the disk or eBook reader. It is also used to define "virtual" columns that contain data from other columns and so on. -The basi template language is very simple, but has very powerful advanced features. The basic idea is that a template consists of names in curly brackets that are then replaced by the corresponding metadata from the book being processed. So, for example, the default template used for saving books to device in |app| is:: +The basic template language is very simple, but has very powerful advanced features. The basic idea is that a template consists of names in curly brackets that are then replaced by the corresponding metadata from the book being processed. So, for example, the default template used for saving books to device in |app| is:: {author_sort}/{title}/{title} - {authors} From 60e77299062148aa04e325de03b8089d26781234 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 24 Sep 2010 08:33:42 -0600 Subject: [PATCH 115/412] Don't put duplicates in dirtied_queue --- src/calibre/library/database2.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 6a0d442927..dc320eb011 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -578,13 +578,17 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return True def dirtied(self, book_ids, commit=True): - self.conn.executemany( - 'INSERT OR REPLACE INTO metadata_dirtied (book) VALUES (?)', - [(x,) for x in book_ids]) + for book in book_ids: + try: + self.conn.execute( + 'INSERT INTO metadata_dirtied (book) VALUES (?)', + (book,)) + self.dirtied_queue.put(book) + except IntegrityError: + # Already in table + continue if commit: self.conn.commit() - for x in book_ids: - self.dirtied_queue.put(x) def get_metadata(self, idx, index_is_id=False, get_cover=False): ''' From 41ebe2bd1443bbf2a88731c6d1919a8207f08275 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 24 Sep 2010 09:00:46 -0600 Subject: [PATCH 116/412] calibredb now does a backup of changed metadata --- src/calibre/library/caches.py | 9 ++++++--- src/calibre/library/cli.py | 8 ++++++-- src/calibre/library/database2.py | 6 +++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 0b5a922209..714579ec77 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -36,14 +36,14 @@ class MetadataBackup(Thread): # {{{ def run(self): while self.keep_running: try: - id_ = self.db.dirtied_queue.get(True, 5) + id_ = self.db.dirtied_queue.get() except Empty: continue except: # Happens during interpreter shutdown break if self.dump_func([id_]) is None: - # An exception occured in dump_func, retry once + # An exception occurred in dump_func, retry once prints('Failed to backup metadata for id:', id_, 'once') time.sleep(2) if not self.dump_func([id_]): @@ -84,9 +84,12 @@ class CoverCache(Thread): # {{{ def run(self): while self.keep_running: try: - id_ = self.load_queue.get(True, 1) + id_ = self.load_queue.get() except Empty: continue + except: + #Happens during interpreter shutdown + break try: img = self._image_for_id(id_) except: diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index cd4e472807..6ff17b0781 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -32,8 +32,9 @@ def send_message(msg=''): t.conn.send('refreshdb:'+msg) t.conn.close() - - +def write_dirtied(db): + prints('Backing up metadata') + db.dump_metadata() def get_parser(usage): parser = OptionParser(usage) @@ -259,6 +260,7 @@ def do_add(db, paths, one_book_per_directory, recurse, add_duplicates): print >>sys.stderr, '\t', title+':' print >>sys.stderr, '\t\t ', path + write_dirtied(db) send_message() finally: sys.stdout = orig @@ -299,6 +301,7 @@ def do_add_empty(db, title, authors, isbn): if isbn: mi.isbn = isbn db.import_book(mi, []) + write_dirtied() send_message() def command_add(args, dbpath): @@ -452,6 +455,7 @@ def do_set_metadata(db, id, stream): db.set_metadata(id, mi) db.clean() do_show_metadata(db, id, False) + write_dirtied() send_message() def set_metadata_option_parser(): diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index dc320eb011..bdaa643d83 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -557,7 +557,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def metadata_for_field(self, key): return self.field_metadata[key] - def dump_metadata(self, book_ids, remove_from_dirtied=True, commit=True): + def dump_metadata(self, book_ids=None, remove_from_dirtied=True, commit=True): + 'Write metadata for each record to an individual OPF file' + if book_ids is None: + book_ids = [x[0] for x in self.conn.get( + 'SELECT book FROM metadata_dirtied', all=True)] for book_id in book_ids: if not self.data.has_id(book_id): continue From c67a9d848745c4fd4280b370583160bad288cbbd Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 16:38:11 +0100 Subject: [PATCH 117/412] Changes to device editable columns to give fine-grain control over what columns can be edited. --- src/calibre/devices/folder_device/driver.py | 2 +- src/calibre/devices/interface.py | 2 +- src/calibre/devices/kobo/driver.py | 16 +++++++------- src/calibre/devices/prs505/driver.py | 2 +- src/calibre/devices/usbms/driver.py | 2 +- src/calibre/gui2/library/models.py | 23 ++++++++++++++------- 6 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/calibre/devices/folder_device/driver.py b/src/calibre/devices/folder_device/driver.py index 9cd1280cc9..5919d6d2fb 100644 --- a/src/calibre/devices/folder_device/driver.py +++ b/src/calibre/devices/folder_device/driver.py @@ -38,7 +38,7 @@ class FOLDER_DEVICE(USBMS): THUMBNAIL_HEIGHT = 68 # Height for thumbnails on device - CAN_SET_METADATA = True + CAN_SET_METADATA = ['title', 'authors'] SUPPORTS_SUB_DIRS = True #: Icon for this device diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py index fc3332a337..2307bf94d6 100644 --- a/src/calibre/devices/interface.py +++ b/src/calibre/devices/interface.py @@ -37,7 +37,7 @@ class DevicePlugin(Plugin): THUMBNAIL_HEIGHT = 68 #: Whether the metadata on books can be set via the GUI. - CAN_SET_METADATA = True + CAN_SET_METADATA = ['title', 'authors', 'collections'] #: Path separator for paths to books on device path_sep = os.sep diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index f06a804b93..b8516aab4f 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -30,7 +30,7 @@ class KOBO(USBMS): # Ordered list of supported formats FORMATS = ['epub', 'pdf'] - CAN_SET_METADATA = True + CAN_SET_METADATA = ['collections'] VENDOR_ID = [0x2237] PRODUCT_ID = [0x4161] @@ -126,7 +126,7 @@ class KOBO(USBMS): book = self.book_from_path(prefix, lpath, title, authors, mime, date, ContentType, ImageID) # print 'Update booklist' book.device_collections = [playlist_map[lpath]] if lpath in playlist_map else [] - + if bl.add_book(book, replace_metadata=False): changed = True except: # Probably a path encoding error @@ -250,7 +250,7 @@ class KOBO(USBMS): # print "Delete file normalized path: " + path extension = os.path.splitext(path)[1] ContentType = self.get_content_type_from_extension(extension) - + ContentID = self.contentid_from_path(path, ContentType) ImageID = self.delete_via_sql(ContentID, ContentType) @@ -453,7 +453,7 @@ class KOBO(USBMS): query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 1 and ContentID like \'file:///mnt/sd/%\'' elif oncard != 'carda' and oncard != 'cardb': query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 1 and ContentID not like \'file:///mnt/sd/%\'' - + try: cursor.execute (query) except: @@ -489,7 +489,7 @@ class KOBO(USBMS): query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 2 and ContentID like \'file:///mnt/sd/%\'' elif oncard != 'carda' and oncard != 'cardb': query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ReadStatus = 2 and ContentID not like \'file:///mnt/sd/%\'' - + try: cursor.execute (query) except: @@ -519,7 +519,7 @@ class KOBO(USBMS): else: connection.commit() # debug_print('Database: Commit set ReadStatus as Finished') - else: # No collections + else: # No collections # Since no collections exist the ReadStatus needs to be reset to 0 (Unread) print "Reseting ReadStatus to 0" # Reset Im_Reading list in the database @@ -527,7 +527,7 @@ class KOBO(USBMS): query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ContentID like \'file:///mnt/sd/%\'' elif oncard != 'carda' and oncard != 'cardb': query= 'update content set ReadStatus=0, FirstTimeReading = \'true\' where BookID is Null and ContentID not like \'file:///mnt/sd/%\'' - + try: cursor.execute (query) except: @@ -541,7 +541,7 @@ class KOBO(USBMS): connection.close() # debug_print('Finished update_device_database_collections', collections_attributes) - + def sync_booklists(self, booklists, end_session=True): # debug_print('KOBO: started sync_booklists') paths = self.get_device_paths() diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index f90a8ab263..7952660c21 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -27,7 +27,7 @@ class PRS505(USBMS): FORMATS = ['epub', 'lrf', 'lrx', 'rtf', 'pdf', 'txt'] - CAN_SET_METADATA = True + CAN_SET_METADATA = ['title', 'authors', 'collections'] VENDOR_ID = [0x054c] #: SONY Vendor Id PRODUCT_ID = [0x031e] diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index a0d1d9dbf8..b4fe5d25fc 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -50,7 +50,7 @@ class USBMS(CLI, Device): book_class = Book FORMATS = [] - CAN_SET_METADATA = False + CAN_SET_METADATA = [] METADATA_CACHE = 'metadata.calibre' def get_device_information(self, end_session=True): diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index af1b42bf33..8efd038db8 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -907,7 +907,7 @@ class DeviceBooksModel(BooksModel): # {{{ } self.marked_for_deletion = {} self.search_engine = OnDeviceSearch(self) - self.editable = True + self.editable = ['title', 'authors', 'collections'] self.book_in_library = None def mark_for_deletion(self, job, rows, rows_are_ids=False): @@ -953,13 +953,13 @@ class DeviceBooksModel(BooksModel): # {{{ if self.map[index.row()] in self.indices_to_be_deleted(): return Qt.ItemIsUserCheckable # Can't figure out how to get the disabled flag in python flags = QAbstractTableModel.flags(self, index) - if index.isValid() and self.editable: + if index.isValid(): cname = self.column_map[index.column()] - if cname in ('title', 'authors') or \ - (cname == 'collections' and \ - callable(getattr(self.db, 'supports_collections', None)) and \ - self.db.supports_collections() and \ - prefs['manage_device_metadata']=='manual'): + if cname in self.editable and \ + cname != 'collections' or \ + (callable(getattr(self.db, 'supports_collections', None)) and \ + self.db.supports_collections() and \ + prefs['manage_device_metadata']=='manual'): flags |= Qt.ItemIsEditable return flags @@ -1243,7 +1243,14 @@ class DeviceBooksModel(BooksModel): # {{{ def set_editable(self, editable): # Cannot edit if metadata is sent on connect. Reason: changes will # revert to what is in the library on next connect. - self.editable = editable and prefs['manage_device_metadata']!='on_connect' + if isinstance(editable, list): + self.editable = editable + elif editable: + self.editable = ['title', 'authors', 'collections'] + else: + self.editable = [] + if prefs['manage_device_metadata']=='on_connect': + self.editable = [] def set_search_restriction(self, s): pass From 993983a70767b56d2ecde432fcea828068d8e7f9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 24 Sep 2010 10:05:54 -0600 Subject: [PATCH 118/412] Oops. Restore removed call to commit in set_path and have set_path call dirtied. Also limit the rate of metadata backups --- src/calibre/library/caches.py | 1 + src/calibre/library/database2.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 714579ec77..339f1393f5 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -48,6 +48,7 @@ class MetadataBackup(Thread): # {{{ time.sleep(2) if not self.dump_func([id_]): prints('Failed to backup metadata for id:', id_, 'again, giving up') + time.sleep(0.2) # Limit to five per second # }}} diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index a34ef9cf89..f62c4ce074 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -455,6 +455,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.add_format(id, format, stream, index_is_id=True, path=tpath, notify=False) self.conn.execute('UPDATE books SET path=? WHERE id=?', (path, id)) + self.dirtied([id], commit=False) + self.commit() self.data.set(id, self.FIELD_MAP['path'], path, row_is_id=True) # Delete not needed directories if current_path and os.path.exists(spath): From a11ccd8598d3ba3cf34599647d58666b49038302 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 17:20:26 +0100 Subject: [PATCH 119/412] Added 'contains' function to templates --- src/calibre/manual/template_lang.rst | 1 + src/calibre/utils/formatter.py | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index 5f672c4989..0c3a87a157 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -108,6 +108,7 @@ The functions available are: * ``capitalize()`` -- return the value as capitalized. * ``ifempty(text)`` -- if the field is not empty, return the value of the field. Otherwise return `text`. * ``test(text if not empty, text if empty)`` -- return `text if not empty` if the field is not empty, otherwise return `text if empty`. + * ``contains(pattern, text if match, text if not match`` -- checks if field contains matches for the regular expression `pattern`. Returns `text if match` if matches are found, otherwise it returns `text if no match`. * ``shorten(left chars, middle text, right chars)`` -- Return a shortened version of the field, consisting of `left chars` characters from the beginning of the field, followed by `middle text`, followed by `right chars` characters from the end of the string. `Left chars` and `right chars` must be integers. For example, assume the title of the book is `Ancient English Laws in the Times of Ivanhoe`, and you want it to fit in a space of at most 15 characters. If you use ``{title:shorten(9,-,5)}``, the result will be `Ancient E-nhoe`. If the field's length is less than ``left chars`` + ``right chars`` + the length of ``middle text``, then the field will be used intact. For example, the title `The Dome` would not be changed. * ``lookup(field if not empty, field if empty)`` -- like test, except the arguments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note that because composite columns are fields, you can use this function in one composite field to use the value of some other composite field. This is extremely useful when constructing variable save paths (more later). * ``re(pattern, replacement)`` -- return the field after applying the regular expression. All instances of `pattern` are replaced with `replacement`. As in all of |app|, these are python-compatible regular expressions. diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index c6bcaa1c3e..6fed4e157a 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -29,6 +29,15 @@ class TemplateFormatter(string.Formatter): else: return value_not_set + def _contains(self, val, test, value_if_present, value_if_not): + if re.search(test, val): + return value_if_present + else: + return value_if_not + + def _re(self, val, pattern, replacement): + return re.sub(pattern, replacement, val) + def _ifempty(self, val, value_if_empty): if val: return val @@ -43,14 +52,12 @@ class TemplateFormatter(string.Formatter): else: return val - def _re(self, val, pattern, replacement): - return re.sub(pattern, replacement, val) - functions = { 'uppercase' : (0, lambda s,x: x.upper()), 'lowercase' : (0, lambda s,x: x.lower()), 'titlecase' : (0, lambda s,x: x.title()), 'capitalize' : (0, lambda s,x: x.capitalize()), + 'contains' : (3, _contains), 'ifempty' : (1, _ifempty), 'lookup' : (2, _lookup), 're' : (2, _re), From 7d9ca9dda75a03ae6d8b97660e05017193cc8ba3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 24 Sep 2010 10:40:53 -0600 Subject: [PATCH 120/412] ... --- src/calibre/library/caches.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 339f1393f5..1e52350e46 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -97,8 +97,12 @@ class CoverCache(Thread): # {{{ import traceback traceback.print_exc() continue - with self.lock: - self.cache[id_] = img + try: + with self.lock: + self.cache[id_] = img + except: + # Happens during interpreter shutdown + break def set_cache(self, ids): with self.lock: From f782ef0cb6348cc3deea6fe515ace73b5dd18b92 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 17:56:27 +0100 Subject: [PATCH 121/412] Make format_field return '' instead of None when the value really is '' --- src/calibre/ebooks/metadata/book/base.py | 18 +++++++++--------- src/calibre/gui2/library/models.py | 2 +- src/calibre/library/server/mobile.py | 3 +-- src/calibre/library/server/opds.py | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 8791d59242..87d034aba8 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -432,14 +432,14 @@ class Metadata(object): if key in self.user_metadata_keys(): res = self.get(key, None) cmeta = self.get_user_metadata(key, make_copy=False) + name = unicode(cmeta['name']) if cmeta['datatype'] != 'composite' and (res is None or res == ''): - return (None, None, None, None) + return (name, res, None, None) orig_res = res cmeta = self.get_user_metadata(key, make_copy=False) if res is None or res == '': - return (None, None, None, None) + return (name, res, None, None) orig_res = res - name = unicode(cmeta['name']) datatype = cmeta['datatype'] if datatype == 'text' and cmeta['is_multiple']: res = u', '.join(res) @@ -454,11 +454,12 @@ class Metadata(object): if key in field_metadata and field_metadata[key]['kind'] == 'field': res = self.get(key, None) - if res is None or res == '': - return (None, None, None, None) - orig_res = res fmeta = field_metadata[key] name = unicode(fmeta['name']) + if res is None or res == '': + return (name, res, None, None) + orig_res = res + name = unicode(fmeta['name']) datatype = fmeta['datatype'] if key == 'authors': res = authors_to_string(res) @@ -508,9 +509,8 @@ class Metadata(object): fmt('Rights', unicode(self.rights)) for key in self.user_metadata_keys(): val = self.get(key, None) - if val is not None: - (name, val) = self.format_field(key) - fmt(name, unicode(val)) + (name, val) = self.format_field(key) + fmt(name, unicode(val)) return u'\n'.join(ans) def to_html(self): diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index d19bed49fe..fe1701a918 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -327,7 +327,7 @@ class BooksModel(QAbstractTableModel): # {{{ mi = self.db.get_metadata(idx) for key in mi.user_metadata_keys(): name, val = mi.format_field(key) - if val is not None: + if val: data[name] = val return data diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index 071c7b1077..c51de90c6d 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -125,7 +125,6 @@ def build_index(books, num, search, sort, order, start, total, url_base, CKEYS): series = u'[%s - %s]'%(book['series'], book['series_index']) \ if book['series'] else '' tags = u'Tags=[%s]'%book['tags'] if book['tags'] else '' - print tags ctext = '' for key in CKEYS: @@ -231,7 +230,7 @@ class MobileServer(object): return '%s:#:%s'%(name, unicode(val)) mi = self.db.get_metadata(record[CFM['id']['rec_index']], index_is_id=True) name, val = mi.format_field(key) - if val is None: + if not val: continue datatype = CFM[key]['datatype'] if datatype in ['comments']: diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index 0e6917c504..bd5b2f36b3 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -160,7 +160,7 @@ def ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS): for key in CKEYS: mi = db.get_metadata(item[CFM['id']['rec_index']], index_is_id=True) name, val = mi.format_field(key) - if val is not None: + if not val: datatype = CFM[key]['datatype'] if datatype == 'text' and CFM[key]['is_multiple']: extra.append('%s: %s
'%(name, format_tag_string(val, ',', From fb06e4c72eacb21b6f101d6f7e7d7a1785450a86 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 24 Sep 2010 11:04:18 -0600 Subject: [PATCH 122/412] ... --- src/calibre/gui2/add.py | 7 ++----- src/calibre/library/database2.py | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index 9f246aeb93..1d7b5075b4 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -381,11 +381,7 @@ class Adder(QObject): # {{{ # }}} -############################################################################### -############################## END ADDER ###################################### -############################################################################### - -class Saver(QObject): +class Saver(QObject): # {{{ def __init__(self, parent, db, callback, rows, path, opts, spare_server=None): @@ -446,4 +442,5 @@ class Saver(QObject): self.pd.set_msg(_('Saved')+' '+title) if not ok: self.failures.add((title, tb)) +# }}} diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index a9160f976f..4775e13818 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -1924,7 +1924,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.timestamp = utcnow() if mi.pubdate is None: mi.pubdate = utcnow() - self.set_metadata(id, mi) + self.set_metadata(id, mi, ignore_errors=True) if cover is not None: try: self.set_cover(id, cover) From 4b92c7d68b70c03b3d1b46d17fc643ab7bb00f5d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 18:17:15 +0100 Subject: [PATCH 123/412] Don't put '' values into __unicode__ and to_html --- src/calibre/ebooks/metadata/book/base.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 87d034aba8..df64d16c26 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -509,8 +509,9 @@ class Metadata(object): fmt('Rights', unicode(self.rights)) for key in self.user_metadata_keys(): val = self.get(key, None) - (name, val) = self.format_field(key) - fmt(name, unicode(val)) + if val: + (name, val) = self.format_field(key) + fmt(name, unicode(val)) return u'\n'.join(ans) def to_html(self): @@ -533,7 +534,7 @@ class Metadata(object): ans += [(_('Rights'), unicode(self.rights))] for key in self.user_metadata_keys(): val = self.get(key, None) - if val is not None: + if val: (name, val) = self.format_field(key) ans += [(name, val)] for i, x in enumerate(ans): From fef5703c1eb74e80c7c5a079f8b5ba3dc473bde8 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 24 Sep 2010 11:32:21 -0600 Subject: [PATCH 124/412] Conversion pipeline: Fix merging of metadata, broken by new Metadata class --- src/calibre/ebooks/metadata/book/base.py | 5 ++++ src/calibre/ebooks/oeb/transforms/metadata.py | 30 +++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 87d034aba8..28a5f21a46 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -76,6 +76,11 @@ class Metadata(object): self.author = list(authors) if authors else []# Needed for backward compatibility self.authors = list(authors) if authors else [] + def is_null(self, field): + null_val = NULL_VALUES.get(field, None) + val = getattr(self, field, None) + return not val or val == null_val + def __getattribute__(self, field): _data = object.__getattribute__(self, '_data') if field in TOP_LEVEL_CLASSIFIERS: diff --git a/src/calibre/ebooks/oeb/transforms/metadata.py b/src/calibre/ebooks/oeb/transforms/metadata.py index 22a89f5a47..4bb25f650e 100644 --- a/src/calibre/ebooks/oeb/transforms/metadata.py +++ b/src/calibre/ebooks/oeb/transforms/metadata.py @@ -12,33 +12,33 @@ from calibre import guess_type def meta_info_to_oeb_metadata(mi, m, log): from calibre.ebooks.oeb.base import OPF - if mi.title: + if not mi.is_null('title'): m.clear('title') m.add('title', mi.title) if mi.title_sort: if not m.title: m.add('title', mi.title_sort) m.title[0].file_as = mi.title_sort - if mi.authors: + if not mi.is_null('authors'): m.filter('creator', lambda x : x.role.lower() in ['aut', '']) for a in mi.authors: attrib = {'role':'aut'} if mi.author_sort: attrib[OPF('file-as')] = mi.author_sort m.add('creator', a, attrib=attrib) - if mi.book_producer: + if not mi.is_null('book_producer'): m.filter('contributor', lambda x : x.role.lower() == 'bkp') m.add('contributor', mi.book_producer, role='bkp') - if mi.comments: + if not mi.is_null('comments'): m.clear('description') m.add('description', mi.comments) - if mi.publisher: + if not mi.is_null('publisher'): m.clear('publisher') m.add('publisher', mi.publisher) - if mi.series: + if not mi.is_null('series'): m.clear('series') m.add('series', mi.series) - if mi.isbn: + if not mi.is_null('isbn'): has = False for x in m.identifier: if x.scheme.lower() == 'isbn': @@ -46,29 +46,29 @@ def meta_info_to_oeb_metadata(mi, m, log): has = True if not has: m.add('identifier', mi.isbn, scheme='ISBN') - if mi.language: + if not mi.is_null('language'): m.clear('language') m.add('language', mi.language) - if mi.series_index is not None: + if not mi.is_null('series_index'): m.clear('series_index') m.add('series_index', mi.format_series_index()) - if mi.rating is not None: + if not mi.is_null('rating'): m.clear('rating') m.add('rating', '%.2f'%mi.rating) - if mi.tags: + if not mi.is_null('tags'): m.clear('subject') for t in mi.tags: m.add('subject', t) - if mi.pubdate is not None: + if not mi.is_null('pubdate'): m.clear('date') m.add('date', isoformat(mi.pubdate)) - if mi.timestamp is not None: + if not mi.is_null('timestamp'): m.clear('timestamp') m.add('timestamp', isoformat(mi.timestamp)) - if mi.rights is not None: + if not mi.is_null('rights'): m.clear('rights') m.add('rights', mi.rights) - if mi.publication_type is not None: + if not mi.is_null('publication_type'): m.clear('publication_type') m.add('publication_type', mi.publication_type) if not m.timestamp: From 47ff1ddc42d8d08e145af1ebefaa38b93579b549 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 18:47:44 +0100 Subject: [PATCH 125/412] Minor updates to the FAQ --- src/calibre/manual/template_lang.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index 0c3a87a157..1ab004f3f3 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -17,14 +17,14 @@ For the book "The Foundation" by "Isaac Asimov" it will become:: Asimov, Isaac/The Foundation/The Foundation - Isaac Asimov -You can use all the various metadata fields available in calibre in a template, including any custom columns you have created yourself. To find out the template name for a column simply hover your mouse over the column header. Names for custom fields (columns you have created yourself) always have a # as the first character. For series type custom fields, there is always an additional field named ``#seriesname_index`` that becomes the series index for that series. So if you have a custom series field named #myseries, there will also be a field named #myseries_index. +You can use all the various metadata fields available in calibre in a template, including any custom columns you have created yourself. To find out the template name for a column simply hover your mouse over the column header. Names for custom fields (columns you have created yourself) always have a # as the first character. For series type custom fields, there is always an additional field named ``#seriesname_index`` that becomes the series index for that series. So if you have a custom series field named ``#myseries``, there will also be a field named ``#myseries_index``. In addition to the column based fields, you also can use:: {formats} - A list of formats available in the calibre library for a book {isbn} - The ISBN number of the book -If a particular book does not have a particular piece of metadata, the field in the template is automatically removed for that book. So for example:: +If a particular book does not have a particular piece of metadata, the field in the template is automatically removed for that book. Consider, for example:: {author_sort}/{series}/{title} {series_index} @@ -44,19 +44,19 @@ Advanced formatting You can do more than just simple substitution with the templates. You can also conditionally include text and control how the substituted data is formatted. -First, conditionally including text. There are cases where you might want to have text appear in the output only if a field is not empty. A common case is series and series_index, where you want either nothing or the two values with a hyphen between them. Calibre handles this case using a special field syntax. +First, conditionally including text. There are cases where you might want to have text appear in the output only if a field is not empty. A common case is ``series`` and ``series_index``, where you want either nothing or the two values with a hyphen between them. Calibre handles this case using a special field syntax. For example, assume you want to use the template:: {series} - {series_index} - {title} -If the book has no series, the answer will be '- - title'. Many people would rather the result be simply 'title', without the hyphens. To do this, use the extended syntax ``{field:|prefix_text|suffix_text}``. When you use this syntax, if field has the value SERIES then the result will be prefix_textSERIESsuffix_text. If field has no value, then the result will be the empty string (nothing). The prefix and suffix can contain blanks. +If the book has no series, the answer will be ``- - title``. Many people would rather the result be simply ``title``, without the hyphens. To do this, use the extended syntax ``{field:|prefix_text|suffix_text}``. When you use this syntax, if field has the value SERIES then the result will be ``prefix_textSERIESsuffix_text``. If field has no value, then the result will be the empty string (nothing); the prefix and suffix are ignored. The prefix and suffix can contain blanks. Using this syntax, we can solve the above series problem with the template:: {series}{series_index:| - | - }{title} -The hyphens will be included only if the book has a series index. +The hyphens will be included only if the book has a series index, which it will have only if it has a series. Notes: you must include the : character if you want to use a prefix or a suffix. You must either use no \| characters or both of them; using one, as in ``{field:| - }``, is not allowed. It is OK not to provide any text for one side or the other, such as in ``{series:|| - }``. Using ``{title:||}`` is the same as using ``{title}``. @@ -85,7 +85,7 @@ Advanced features Using templates in custom columns ---------------------------------- -There are sometimes cases where you want to display metadata that |app| does not normally display, or to display data in a way different from how |app| normally does. For example, you might want to display the ISBN, a field that |app| does not display. You can use custom columns for this. To do so, you create a column with the type 'column built from other columns' (hereafter called composite columns), enter a template, and |app| will display in the column the result of evaluating that template. To display the isbn, create the column and enter ``{isbn}`` into the template box. To display a column containing the values of two series custom columns separated by a comma, use ``{#series1:||,}{#series2}``. +There are sometimes cases where you want to display metadata that |app| does not normally display, or to display data in a way different from how |app| normally does. For example, you might want to display the ISBN, a field that |app| does not display. You can use custom columns for this by creating a column with the type 'column built from other columns' (hereafter called composite columns), and entering a template. Result: |app| will display a column showing the result of evaluating that template. To display the ISBN, create the column and enter ``{isbn}`` into the template box. To display a column containing the values of two series custom columns separated by a comma, use ``{#series1:||,}{#series2}``. Composite columns can use any template option, including formatting. @@ -98,7 +98,7 @@ Suppose you want to display the value of a field in upper case, when that field Function references replace the formatting specification, going after the : and before the first ``|`` or the closing ``}``. Functions must always end with ``()``. Some functions take extra values (arguments), and these go inside the ``()``. -The syntax for using functions is ``{field:function(arguments)}``, or ``{field:function(arguments)|prefix|suffix}``. Argument values cannot contain a comma, because it is used to separate arguments. Functions return the value of the field used in the template, suitably modified. +The syntax for using functions is ``{field:function(arguments)}``, or ``{field:function(arguments)|prefix|suffix}``. Argument values cannot contain a comma, because it is used to separate arguments. The last (or only) argument cannot contain a closing parenthesis ( ')' ). Functions return the value of the field used in the template, suitably modified. The functions available are: From cf6f251b740d8601c80e4e3e4a28ad736ebff7d2 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 24 Sep 2010 19:41:43 +0100 Subject: [PATCH 126/412] Added dirty bit cache --- src/calibre/gui2/ui.py | 1 + src/calibre/library/database2.py | 31 ++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 88a8c68572..6b04f6fa1f 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -533,6 +533,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{ # Save the current field_metadata for applications like calibre2opds # Goes here, because if cf is valid, db is valid. db.prefs['field_metadata'] = db.field_metadata.all_metadata() + db.commit_dirty_cache() if DEBUG and db.gm_count > 0: print 'get_metadata cache: {0:d} calls, {1:4.2f}% misses'.format( db.gm_count, (db.gm_missed*100.0)/db.gm_count) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 4775e13818..c4d2666dd1 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -340,6 +340,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): setattr(self, 'title_sort', functools.partial(self.get_property, loc=self.FIELD_MAP['sort'])) + self.dirtied_cache = set() d = self.conn.get('SELECT book FROM metadata_dirtied', all=True) for x in d: self.dirtied_queue.put(x[0]) @@ -585,12 +586,20 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if remove_from_dirtied: self.conn.execute('DELETE FROM metadata_dirtied WHERE book=?', (book_id,)) + # if a later exception prevents the commit, then the dirtied + # table will still have the book. No big deal, because the OPF + # is there and correct. We will simply do it again on next + # start + self.dirtied_cache.discard(book_id) if commit: self.conn.commit() return True def dirtied(self, book_ids, commit=True): for book in book_ids: + if book in self.dirtied_cache: + print 'in dirty cache', book + continue try: self.conn.execute( 'INSERT INTO metadata_dirtied (book) VALUES (?)', @@ -598,10 +607,30 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.dirtied_queue.put(book) except IntegrityError: # Already in table - continue + pass + # If the commit doesn't happen, then our cache will be wrong. This + # could lead to a problem because we won't put the book back into + # the dirtied table. We deal with this by writing the dirty cache + # back to the table on GUI exit. Not perfect, but probably OK + self.dirtied_cache.add(book) + print 'added book', book if commit: self.conn.commit() + def commit_dirty_cache(self): + ''' + Set the dirty indication for every book in the cache. The vast majority + of the time, the indication will already be set. However, sometimes + exceptions may have prevented a commit, which may remove some dirty + indications from the DB. This call will put them back. Note that there + is no problem with setting a dirty indication for a book that isn't in + fact dirty. Just wastes a few cycles. + ''' + print 'commit cache' + book_ids = list(self.dirtied_cache) + self.dirtied_cache = set() + self.dirtied(book_ids) + def get_metadata(self, idx, index_is_id=False, get_cover=False): ''' Convenience method to return metadata as a :class:`Metadata` object. From b2b5e20c8f8c8a48eae23b288be7f347e09c0441 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 24 Sep 2010 13:51:22 -0600 Subject: [PATCH 127/412] Fourth beta --- src/calibre/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 4c372c63a5..be387d8ca2 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.902' +__version__ = '0.7.903' __author__ = "Kovid Goyal " import re From 03e81f7654f4e296ad0ede2164f3f360289389b3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 25 Sep 2010 04:42:57 +0000 Subject: [PATCH 128/412] Launchpad automatic translations update. --- src/calibre/translations/ar.po | 701 ++-- src/calibre/translations/ca.po | 701 ++-- src/calibre/translations/da.po | 703 ++-- src/calibre/translations/eu.po | 703 ++-- src/calibre/translations/fr.po | 703 ++-- src/calibre/translations/hu.po | 5078 +++++++++++++++-------------- src/calibre/translations/ja.po | 701 ++-- src/calibre/translations/ko.po | 703 ++-- src/calibre/translations/nl.po | 701 ++-- src/calibre/translations/pl.po | 701 ++-- src/calibre/translations/pt_BR.po | 703 ++-- src/calibre/translations/ru.po | 703 ++-- src/calibre/translations/sk.po | 703 ++-- src/calibre/translations/sr.po | 710 ++-- src/calibre/translations/th.po | 759 +++-- src/calibre/translations/tr.po | 703 ++-- src/calibre/translations/uk.po | 1025 +++--- src/calibre/translations/vi.po | 703 ++-- src/calibre/translations/zh_CN.po | 701 ++-- 19 files changed, 9760 insertions(+), 8345 deletions(-) diff --git a/src/calibre/translations/ar.po b/src/calibre/translations/ar.po index d0b5eb08f9..de24181fea 100644 --- a/src/calibre/translations/ar.po +++ b/src/calibre/translations/ar.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-09-17 21:00+0000\n" -"PO-Revision-Date: 2010-09-17 22:37+0000\n" +"POT-Creation-Date: 2010-09-24 21:33+0000\n" +"PO-Revision-Date: 2010-09-24 20:47+0000\n" "Last-Translator: Hsn \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-09-18 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-09-25 04:39+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -24,7 +24,8 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:410 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:46 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:412 #: /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 @@ -105,24 +106,24 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:299 #: /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 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1161 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1162 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1165 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:357 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 @@ -135,11 +136,11 @@ msgstr "لا يفعل شيءً" #: /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:1065 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1137 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1837 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1839 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1966 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1064 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1139 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1843 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1845 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 #: /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 @@ -260,162 +261,162 @@ msgstr "ضبط دليل المعلومات في الملفات %s" msgid "Set metadata from %s files" msgstr "ضبط دليل المعلومات من ملفات %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 msgid "Look and Feel" msgstr "المظهر" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:686 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:698 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:709 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Interface" msgstr "الواجهة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 msgid "Behavior" msgstr "سلوك" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 msgid "Change the way calibre behaves" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:176 msgid "Add your own columns" msgstr "اضف عامودك الخاص" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 msgid "Add/remove your own columns to the calibre book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 msgid "Customize the toolbar" msgstr "خصِّص شريط الأدوات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 msgid "Input Options" msgstr "خيارات الإدخال" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:732 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:743 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 msgid "Set conversion options specific to each input format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 msgid "Common Options" msgstr "خيارات متداولة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 msgid "Set conversion options common to all formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 msgid "Output Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 msgid "Set conversion options specific to each output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 msgid "Adding books" msgstr "إضافة كتب" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:777 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Import/Export" msgstr "إستيراد/تصدير" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 msgid "Control how calibre reads metadata from files when adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 msgid "Saving books to disk" msgstr "حفظ الكتب على القرص" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Sending books to devices" msgstr "ارسال الكتب الى الاجهزة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre transfers files to your ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Sharing books by email" msgstr "مشاركة الكتب عبر البريد الالكتروني" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 msgid "Sharing" msgstr "مشاركة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sharing over the net" msgstr "المشاركة على الشبكة العنكبوتية" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Plugins" msgstr "الملحقات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Advanced" msgstr "متقدّم" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 msgid "Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 msgid "Miscellaneous" msgstr "متفرقات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 msgid "Miscellaneous advanced configuration" msgstr "" @@ -592,15 +593,15 @@ msgstr "ملحقات معطلة" msgid "Enabled plugins" msgstr "تفعيل الاضافات" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:93 msgid "No valid plugin found in " msgstr "لا يجد ملحق صالح " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:508 msgid "Initialization of plugin %s failed with traceback:" msgstr "فشل استهلال الملحق s% مع اقتفاء الأثر:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:541 msgid "" " %prog options\n" "\n" @@ -612,29 +613,29 @@ msgstr "" " المقدرة على التخصيص بتحميل الملحقات الخارجية .\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:547 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "إضافة ملحق يتخصيص مسار إلى ملف zip الذي يحتويه." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:549 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "حذف الملحق المخصص عن طريق اسمه. لا يؤثر على الملحقات المضمنة" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:551 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." msgstr "تخصيص الملحق . حدد اسم الملحق وسلسلة التخصيص وفرقهما بفاصلة." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:553 msgid "List all installed plugins" msgstr "قائمة كل الملحقات المثبتة" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:555 msgid "Enable the named plugin" msgstr "تمكين الملحق المسمى" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:557 msgid "Disable the named plugin" msgstr "تعطيل الملحق المسمى" @@ -642,13 +643,13 @@ msgstr "تعطيل الملحق المسمى" msgid "Communicate with Android phones." msgstr "التواصل مع هواتف أندرويد ." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:50 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:52 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:94 msgid "Communicate with S60 phones." msgstr "تواصل معا هواتف S60." @@ -712,7 +713,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244 #: /home/kovid/work/calibre/src/calibre/library/database2.py:198 #: /home/kovid/work/calibre/src/calibre/library/database2.py:211 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:134 msgid "News" msgstr "الأخبار" @@ -720,8 +721,8 @@ msgstr "الأخبار" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:556 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1669 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1687 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1693 msgid "Catalog" msgstr "الفهرس" @@ -803,23 +804,23 @@ msgid "" "first one that exists will be used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:22 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "التواصل مع القارئ الكتاب الاليكترونى Hanvon N520 ." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:47 msgid "Communicate with The Book reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:59 msgid "Communicate with the SpringDesign Alex eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:78 msgid "Communicate with the Azbooka" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:94 msgid "Communicate with the Elonex EB 511 eBook reader." msgstr "اﻹتصال مع الـElonex EB 511 القارئ اﻹلكتروني" @@ -878,7 +879,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:186 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:188 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -888,33 +889,33 @@ msgstr "" msgid "Getting list of books on device..." msgstr "يجري إحصاء قائمة كتب من الجهاز..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:248 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:280 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "يجري حذف الكتب من الجهاز..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:282 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:289 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:284 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:291 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:294 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:328 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:330 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "إضافة كتب لقائمة البيانات الوصفية للجهاز ..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:390 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "Not Implemented" msgstr "غير مطبق" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:391 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:393 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -3013,7 +3014,7 @@ msgstr "" msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:462 msgid "Choose Files" msgstr "" @@ -3139,6 +3140,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 msgid "No book selected" @@ -3182,8 +3184,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "" @@ -3332,7 +3334,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:249 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:584 msgid "Not allowed" msgstr "" @@ -3399,7 +3401,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:428 msgid "Failed" msgstr "" @@ -3636,20 +3638,20 @@ msgid "Error" msgstr "خطأ" #: /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:179 msgid "Cannot edit metadata" msgstr "لا يمكن تحرير الميتاداتا" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210 msgid "Cannot merge books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211 msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:215 msgid "" "Book formats and metadata from the selected books will be added to the " "first selected book. ISBN will not be merged.

The " @@ -3657,7 +3659,7 @@ msgid "" "changed.

Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:227 msgid "" "Book formats and metadata from the selected books will be merged into the " "first selected book. ISBN will not be merged.

After " @@ -3668,7 +3670,7 @@ msgid "" "you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:240 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" @@ -3850,6 +3852,28 @@ msgstr "" msgid "Books with the same tags" msgstr "كتب بنفس الوسوم" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54 +msgid "Tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 +msgid "Make small changes to ePub format books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 +msgid "T" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 +msgid "Cannot tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 +msgid "No ePub available. First convert the book to ePub." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" msgstr "V" @@ -3914,7 +3938,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:807 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 msgid "No books" msgstr "" @@ -4039,13 +4063,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 -#: /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:376 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 @@ -4788,7 +4812,7 @@ msgid " is not a valid picture" msgstr " ليست صورة صالحة" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "Book Cover" msgstr "غلاف الكتاب" @@ -4797,7 +4821,7 @@ msgid "Use cover from &source file" msgstr "استخدم غلاف من المصدر&" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /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:414 msgid "Change &cover image:" msgstr "تغيير صورة الغلاف&:" @@ -4806,18 +4830,18 @@ msgid "Browse for an image to use as the cover of this book." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "&Title: " msgstr ":ال&عنوان " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "Change the title of this book" msgstr "تغيير عنوان هذا الكتاب" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 msgid "&Author(s): " msgstr "ال&مؤلف: " @@ -4832,19 +4856,19 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid "&Publisher: " msgstr "&الناشر: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /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:388 msgid "Ta&gs: " msgstr "الو&سوم: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -4853,22 +4877,22 @@ msgstr "" "مجموعة كلمات، مفرقة بفاصلة." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 msgid "&Series:" msgstr "&سلسلات:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:249 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 msgid "List of known series. You can add new series." msgstr "قائمة السلسلات المعروفة. بإمكانك إضافة سلسلات جديدة." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Book " msgstr "الكتاب " @@ -5350,7 +5374,7 @@ msgid " index:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 msgid "Automatically number books in this series" msgstr "" @@ -5462,132 +5486,132 @@ msgid "" "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 msgid "Device: " msgstr "الجهاز: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:718 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 msgid " detected." msgstr " تم كشفه." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:808 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:920 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1202 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1025 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1206 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1214 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:992 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:996 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1022 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1052 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1056 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1116 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1173 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1211 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1273 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1277 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1274 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -5641,7 +5665,7 @@ msgid "My Books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301 msgid "Generate catalog" msgstr "" @@ -5958,93 +5982,93 @@ msgid "" "your library before proceeding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:386 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:387 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:419 msgid "Applying changes to %d books. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 msgid "Edit Meta information" msgstr "تحرير معلومات الميتا" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 msgid "A&utomatically set author sort" msgstr "ضبط& ترتيب المؤلف آلياً" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 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/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "&Rating:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid " stars" msgstr " نجمة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:242 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "Open Tag Editor" msgstr "فتح محرر الوسوم" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 msgid "&Remove tags:" msgstr "حذف& الوسوم:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 msgid "Comma separated list of tags to remove from the books. " msgstr "قائمة من الوسوم مفرقة بالفاصلة لحذفها من الكتب. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 msgid "Remove all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 msgid "Remove &format:" msgstr "حذف الت&هيئة:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:253 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -6052,56 +6076,56 @@ msgid "" "Book A will have series number 1 and Book B series number 2." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:258 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:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 msgid "Search &field:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 msgid "&Search for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 msgid "&Replace with:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 msgid "Apply function &after replace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 msgid "Test &text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 msgid "Test re&sult" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 msgid "Your test:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:271 msgid "&Search and replace (experimental)" msgstr "" @@ -6159,118 +6183,118 @@ msgstr "" msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 msgid "" " The green color indicates that the current author sort matches the current " "author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354 msgid "" " The red color indicates that the current author sort does not match the " "current author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:505 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 msgid "Cannot use tag editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 msgid "The tags editor cannot be used if you have modified the tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:625 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661 msgid "Could not fetch cover.
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 msgid "" "For the error message from each cover source, click Show details below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:733 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:734 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:798 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:820 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:799 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:821 msgid "Could not open %s. Is it being used by another program?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "Edit Meta Information" msgstr "تحرير معلومات الميتا" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Meta information" msgstr "معلومات الميتا" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Swap the author and title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles.\n" @@ -6278,7 +6302,7 @@ msgid "" "strings. If it is colored red, then the authors and this text do not match." msgstr "" -#: /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:380 msgid "" "Automatically create the author sort entry based on the current author " "entry.\n" @@ -6286,71 +6310,75 @@ msgid "" "green." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "Remove unused series (Series that have no books)" msgstr "حذف سلسلات غير مستخدمة (سلسلات التي لا تحتوي على كتب)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "Publishe&d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 msgid "dd MMM yyyy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "&Date:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "&Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "&Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 msgid "Available Formats" msgstr "التهيئات المتوفرة" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Remove the selected formats for this book from the database." msgstr "حذف التهيئات المختارة لهذا الكتاب من قاعدة البيانات." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "Set the cover for the book from the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "&Browse" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +msgid "Remove border (if any) from cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 msgid "Download co&ver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 msgid "Generate a default cover based on the title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:421 msgid "&Generate cover" msgstr "" @@ -6846,6 +6874,39 @@ msgstr "" msgid "&Test" msgstr "&تجربة" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:55 +msgid "Display contents of exploded ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:56 +msgid "&Explode ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:57 +msgid "Rebuild ePub from exploded contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:58 +msgid "&Rebuild ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:59 +msgid "Discard changes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +msgid "&Cancel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61 +msgid "" +"Explode the ePub to display contents in a file browser window. To tweak " +"individual files, right-click, then 'Open with...' your editor of choice. " +"When tweaks are complete, close the file browser window. Rebuild the ePub, " +"updating your calibre library." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127 msgid "No recipe selected" msgstr "" @@ -7239,7 +7300,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:656 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:655 msgid "Card A" msgstr "" @@ -7248,7 +7309,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:658 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:657 msgid "Card B" msgstr "" @@ -7374,7 +7435,7 @@ msgstr "" msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:585 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8073,10 +8134,6 @@ msgstr "" msgid "&Apply" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 -msgid "&Cancel" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "Restore &defaults" msgstr "" @@ -8356,7 +8413,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:320 msgid "Failed to start content server" msgstr "فشل في تشغيل خادم المحتوى" @@ -8757,78 +8814,78 @@ msgstr "" msgid "Queueing " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:243 msgid "Fetch news from " msgstr "احصل على الأخبار من " -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:313 msgid "Convert existing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:310 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:314 msgid "" "The following books have already been converted to %s format. Do you wish to " "reconvert them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:170 msgid "&Donate to support calibre" msgstr "تبرع& لدعم كاليبر" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:174 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:417 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 msgid "Conversion Error" msgstr "خطأ في التحويل" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:419 msgid "" "

Could not convert: %s

It is a DRMed book. You must " "first remove the DRM using third party tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:432 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:447 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:483 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " "Your donation helps keep calibre development going." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:509 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:512 msgid "" " is communicating with the device!
\n" " Quitting may cause corruption on the device.
\n" " Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:584 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -9605,48 +9662,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:232 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:234 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:235 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:237 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:238 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:241 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:242 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:243 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:244 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "empty" msgstr "" @@ -10232,31 +10289,31 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:654 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:653 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1992 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1998 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2027 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2038 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2044 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2131 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2137 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2170 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2176 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2192 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2198 msgid "Checked id" msgstr "" @@ -10726,59 +10783,59 @@ msgid "" "Do not download latest version of builtin recipes from the calibre server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:46 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:47 msgid "Unknown News Source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:611 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:612 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:710 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:711 msgid "Download finished" msgstr "تم التنزيل" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:712 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713 msgid "Failed to download the following articles:" msgstr "فشل تنزيل المقالات التالية:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:719 msgid "Failed to download parts of the following articles:" msgstr "فشل تنزيل أجزاء من المقالات التالية:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:721 msgid " from " msgstr " من " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:722 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:723 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:811 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:812 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:832 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:833 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:837 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:838 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:843 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:844 msgid "Trying to download cover..." msgstr "محاولة تنزيل الغلاف..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:845 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:846 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:926 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:927 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:942 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:943 msgid "Feeds downloaded to %s" msgstr "تم تنزيل التلقيم إلى %s" @@ -10786,37 +10843,37 @@ msgstr "تم تنزيل التلقيم إلى %s" msgid "Could not download cover: %s" msgstr "لم يتمكّن من تنزيل الغلاف: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:964 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:959 msgid "Downloading cover from %s" msgstr "يتم تنزيل الغلاف من %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1005 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1004 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1173 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1172 msgid "Untitled Article" msgstr "مقالة بدون عنوان" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1244 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1243 msgid "Article downloaded: %s" msgstr "المقالة منزّلة: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1255 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1254 msgid "Article download failed: %s" msgstr "فشل تنزيل المقالة: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1271 msgid "Fetching feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1419 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1418 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1435 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1433 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index 97e0005161..afd463b551 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-09-17 21:00+0000\n" -"PO-Revision-Date: 2010-09-23 09:05+0000\n" +"POT-Creation-Date: 2010-09-24 21:33+0000\n" +"PO-Revision-Date: 2010-09-24 20:45+0000\n" "Last-Translator: oscarl \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-24 04:39+0000\n" +"X-Launchpad-Export-Date: 2010-09-25 04:39+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -27,7 +27,8 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:410 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:46 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:412 #: /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 @@ -108,24 +109,24 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:299 #: /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 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1161 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1162 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1165 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:357 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 @@ -138,11 +139,11 @@ msgstr "No fa absolutament res" #: /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:1065 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1137 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1837 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1839 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1966 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1064 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1139 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1843 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1845 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 #: /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 @@ -264,45 +265,45 @@ msgstr "Estableix la metainformació als fitxers %s" msgid "Set metadata from %s files" msgstr "Estableix metainformació des dels fitxers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 msgid "Look and Feel" msgstr "Aspecte i comportament" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:686 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:698 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:709 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Interface" msgstr "Interfície" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Ajusta l'aspecte i el comportament de la interfície de calibre per tal que " "s'adapti al teu gust" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 msgid "Behavior" msgstr "Comportament" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 msgid "Change the way calibre behaves" msgstr "Canvia el comportament de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:176 msgid "Add your own columns" msgstr "Afegeix les teves columnes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 msgid "Add/remove your own columns to the calibre book list" msgstr "Afegeix/elimina les teves columnes a la llista de llibres de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 msgid "Customize the toolbar" msgstr "Personalitza la barra d'eines" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -310,59 +311,59 @@ msgstr "" "Personalitza les barres d'eines i els menús de context, canviant quines " "accions estan disponibles" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 msgid "Input Options" msgstr "Opcions d'entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:732 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:743 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Conversion" msgstr "Conversió" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 msgid "Set conversion options specific to each input format" msgstr "" "Ajusta les opcions de conversió específiques per a cada format d'entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 msgid "Common Options" msgstr "Opcions comunes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 msgid "Set conversion options common to all formats" msgstr "Ajusta les opcions de conversió comunes a tots els formats" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 msgid "Output Options" msgstr "Opcions de sortida" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 msgid "Set conversion options specific to each output format" msgstr "" "Ajusta les opcions de conversió específiques de cada format de sortida" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 msgid "Adding books" msgstr "Afegint llibres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:777 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Import/Export" msgstr "Importa/exporta" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Controla com calibre llegeix les metadades dels arxius quan s'afegeixen " "llibres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 msgid "Saving books to disk" msgstr "Desant els llibres al disc" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -370,24 +371,24 @@ msgstr "" "Controla com calibre exporta arxius de la seva base de dades al disc quan " "s'utilitza Desa al disc" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Sending books to devices" msgstr "Enviant llibres als dispositius" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre transfers files to your ebook reader" msgstr "Controla com calibre envia arxius al teu lector d'ebooks" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Sharing books by email" msgstr "Compartint llibres via correu electrònic" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 msgid "Sharing" msgstr "Compartint" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -395,11 +396,11 @@ msgstr "" "Configura compartir llibres via correu electrònic. Es pot utilitzar per " "enviar notícies descarregades als teus dispositius" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sharing over the net" msgstr "Compartint en xarxa" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -407,35 +408,35 @@ msgstr "" "Configura el Servidor de Continguts que et donarà accés a la teva llibreria " "des de qualsevol lloc i dispositiu, a través d'internet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Advanced" msgstr "Avançat" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" "Afegeix/eliminina/personalitza diversos bits de la funcionalitat de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 msgid "Tweaks" msgstr "Ajustos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Configuració detallada del comportament de calibre en diversos contextos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 msgid "Miscellaneous" msgstr "Miscel·lània" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 msgid "Miscellaneous advanced configuration" msgstr "Configuració avançada" @@ -616,15 +617,15 @@ msgstr "Connectors inhabilitats" msgid "Enabled plugins" msgstr "Connectors permesos" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:93 msgid "No valid plugin found in " msgstr "No s'ha trobat cap connector vàlid a " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:508 msgid "Initialization of plugin %s failed with traceback:" msgstr "No s'ha pogut inicialitzar el connector %s i s'ha generat la traça:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:541 msgid "" " %prog options\n" "\n" @@ -636,18 +637,18 @@ msgstr "" " Personalitzeu el calibre carregant connectors externs.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:547 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" "Afegeix un connector especificiant el camí al fitxer ZIP que el conté" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:549 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Suprimeix un connector personalitzat per nom. No té cap efecte als " "complements integrats" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:551 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -655,15 +656,15 @@ msgstr "" "Personalitza el connector. Especifiqueu el nom del connector i el text que " "desitgeu, separats per una coma." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:553 msgid "List all installed plugins" msgstr "Fes una llista amb tots els connectors instal·lats" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:555 msgid "Enable the named plugin" msgstr "Habilita el connector anomenat" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:557 msgid "Disable the named plugin" msgstr "Inhabilita el connector anomenat" @@ -671,7 +672,7 @@ msgstr "Inhabilita el connector anomenat" msgid "Communicate with Android phones." msgstr "Estableix comunicació amb telèfons Android" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:50 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:52 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -680,7 +681,7 @@ msgstr "" "dispositiu. S'usarà el primer directori del llistat que ja existeixi al " "dispositiu" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:94 msgid "Communicate with S60 phones." msgstr "Estableix comunicació amb els telèfons S60." @@ -749,7 +750,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244 #: /home/kovid/work/calibre/src/calibre/library/database2.py:198 #: /home/kovid/work/calibre/src/calibre/library/database2.py:211 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:134 msgid "News" msgstr "Notícies" @@ -757,8 +758,8 @@ msgstr "Notícies" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:556 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1669 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1687 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1693 msgid "Catalog" msgstr "Catàleg" @@ -848,25 +849,25 @@ msgstr "" "Llista separada per comes dels directoris als quals enviar llibres " "electrònics en el dispositiu. S'usarà el primer que existeixi." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:22 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "" "Estableix comunicació amb el lector de llibres electrònics Hanvon N520." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:47 msgid "Communicate with The Book reader." msgstr "Comunicar-se amb el lector de llibres electrònics." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:59 msgid "Communicate with the SpringDesign Alex eBook reader." msgstr "" "Estableix comunicació amb el lector de llibres electrònics SpringDesign Alex." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:78 msgid "Communicate with the Azbooka" msgstr "Comunicar-se amb Azbooka" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:94 msgid "Communicate with the Elonex EB 511 eBook reader." msgstr "" "Estableix comunicació amb el lector de llibres electrònics Elonex EB 511." @@ -934,7 +935,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:186 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:188 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -944,33 +945,33 @@ msgstr "" msgid "Getting list of books on device..." msgstr "S'està obtenint el llistat de llibres disponibles al dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:248 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:280 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "S'estan suprimint els llibres del dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:282 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:289 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:284 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:291 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "S'estan suprimint llibres del llistat de metadades del dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:294 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:328 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:330 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "S'estan afegint llibres al llistat de metadades del dispositiu..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:390 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "Not Implemented" msgstr "No implementat" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:391 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:393 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -3478,7 +3479,7 @@ msgstr "Copia" msgid "Copy to Clipboard" msgstr "Copia al porta-retalls" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:462 msgid "Choose Files" msgstr "Escull fitxers" @@ -3610,6 +3611,7 @@ msgstr "Afegeix a la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 msgid "No book selected" @@ -3654,8 +3656,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "Cap llibre seleccionat" @@ -3812,7 +3814,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:249 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:584 msgid "Not allowed" msgstr "No està permès" @@ -3880,7 +3882,7 @@ msgstr "No s'ha pogut copiar els llibres: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:428 msgid "Failed" msgstr "Ha fallat" @@ -4124,20 +4126,20 @@ msgid "Error" msgstr "Error" #: /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:179 msgid "Cannot edit metadata" msgstr "No puc editar les meta-dades" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210 msgid "Cannot merge books" msgstr "No es pot fusionar els llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211 msgid "At least two books must be selected for merging" msgstr "Cal seleccionar almenys dos llibres per fer una fusió" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:215 msgid "" "Book formats and metadata from the selected books will be added to the " "first selected book. ISBN will not be merged.

The " @@ -4149,7 +4151,7 @@ msgstr "" "fusionarà. El segon llibre i els que s'hagin seleccionat a continuació no " "s'esborraran ni canviaran

Si us plau confirmeu que voleu continuar." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:227 msgid "" "Book formats and metadata from the selected books will be merged into the " "first selected book. ISBN will not be merged.

After " @@ -4165,7 +4167,7 @@ msgstr "" "continuació s'esborraran de forma permanent de vostre " "ordinador.

Esteu segur que voleu continuar?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:240 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" @@ -4353,6 +4355,28 @@ msgstr "Alt+T" msgid "Books with the same tags" msgstr "Llibres amb les mateixes etiquetes" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54 +msgid "Tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 +msgid "Make small changes to ePub format books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 +msgid "T" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 +msgid "Cannot tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 +msgid "No ePub available. First convert the book to ePub." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" msgstr "V" @@ -4420,7 +4444,7 @@ msgid "The specified directory could not be processed." msgstr "La carpeta que s'ha especificat no es pot processar." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:807 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 msgid "No books" msgstr "Cap llibre" @@ -4560,13 +4584,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 -#: /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:376 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 @@ -5338,7 +5362,7 @@ msgid " is not a valid picture" msgstr " no és una imatge vàlida" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "Book Cover" msgstr "Coberta" @@ -5347,7 +5371,7 @@ msgid "Use cover from &source file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /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:414 msgid "Change &cover image:" msgstr "Canvia la imatge de la &coberta:" @@ -5356,18 +5380,18 @@ msgid "Browse for an image to use as the cover of this book." msgstr "Cerca una imatge per a utilitzar com a coberta d'aquest llibre." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "&Title: " msgstr "&Tí­tol: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "Change the title of this book" msgstr "Canvia el tí­tol del llibre" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 msgid "&Author(s): " msgstr "&Autor(s): " @@ -5383,19 +5407,19 @@ msgstr "" "Canvia l'autor(s). Per a especificar més d'un, separeu-los amb comes." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid "&Publisher: " msgstr "&Editorial: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /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:388 msgid "Ta&gs: " msgstr "Etique&tes: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -5404,22 +5428,22 @@ msgstr "" "

Pot emprar-se qualsevol paraula o frase, separada per comes." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 msgid "&Series:" msgstr "&Sèries:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:249 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 msgid "List of known series. You can add new series." msgstr "Llistat de sèries conegudes. Podeu afegir-hi de noves." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Book " msgstr "Llibre " @@ -5901,7 +5925,7 @@ msgid " index:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 msgid "Automatically number books in this series" msgstr "" @@ -6015,132 +6039,132 @@ msgstr "" "Hi ha hagut un error de comunicació amb el dispositiu. Lleve, torne a " "connectar el dispositiu i torne a iniciar el programa" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:718 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:808 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "per" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:920 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1202 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1025 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1206 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1214 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "News:" msgstr "Notícies:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:992 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:996 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1022 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1052 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1056 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1116 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1173 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1211 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1273 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1277 msgid "No space on device" msgstr "Sense espai al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1274 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "

No puc desar llibres al dispositiu perquè no hi ha espai restant " @@ -6194,7 +6218,7 @@ msgid "My Books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301 msgid "Generate catalog" msgstr "" @@ -6511,31 +6535,31 @@ msgid "" "your library before proceeding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:386 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:387 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:419 msgid "Applying changes to %d books. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 msgid "Edit Meta information" msgstr "Editar Meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -6543,63 +6567,63 @@ msgstr "" "Especifiqueu com s'ha d'ordenar l'autor(s) d'aquest llibre. Per " "exemple,ordena Vicent A. Estellés com a Estellés, Vicent A." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "&Rating:" msgstr "&Valoració:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Rating of this book. 0-5 stars" msgstr "Valora aquest llibre: 0-5 estreles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid " stars" msgstr " estreles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:242 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 msgid "&Remove tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 msgid "Remove all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 msgid "Remove &format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:253 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -6607,56 +6631,56 @@ msgid "" "Book A will have series number 1 and Book B series number 2." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:258 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:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 msgid "Search &field:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 msgid "&Search for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 msgid "&Replace with:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 msgid "Apply function &after replace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 msgid "Test &text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 msgid "Test re&sult" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 msgid "Your test:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:271 msgid "&Search and replace (experimental)" msgstr "" @@ -6714,118 +6738,118 @@ msgstr "" msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 msgid "" " The green color indicates that the current author sort matches the current " "author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354 msgid "" " The red color indicates that the current author sort does not match the " "current author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:505 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 msgid "Cannot use tag editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 msgid "The tags editor cannot be used if you have modified the tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:625 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660 msgid "Cannot fetch cover" msgstr "No puc aconseguir la coberta" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661 msgid "Could not fetch cover.
" msgstr "No puc aconseguir la coberta.
" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 msgid "" "For the error message from each cover source, click Show details below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:733 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:734 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:798 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:820 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:799 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:821 msgid "Could not open %s. Is it being used by another program?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "Edit Meta Information" msgstr "Edita la meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Meta information" msgstr "Meta-informació" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Swap the author and title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Author S&ort: " msgstr "&Ordena autors: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles.\n" @@ -6833,7 +6857,7 @@ msgid "" "strings. If it is colored red, then the authors and this text do not match." msgstr "" -#: /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:380 msgid "" "Automatically create the author sort entry based on the current author " "entry.\n" @@ -6841,72 +6865,76 @@ msgid "" "green." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "Publishe&d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 msgid "dd MMM yyyy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "&Date:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "&Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "&Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 msgid "Available Formats" msgstr "Formats disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Add a new format for this book to the database" msgstr "Afegir un nou format per a aquest llibre a la base de dades" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Remove the selected formats for this book from the database." msgstr "" "Elimina els formats seleccionats per a aquest llibre de la base de dades." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "Set the cover for the book from the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "&Browse" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +msgid "Remove border (if any) from cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 msgid "Download co&ver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 msgid "Generate a default cover based on the title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:421 msgid "&Generate cover" msgstr "" @@ -7397,6 +7425,39 @@ msgstr "" msgid "&Test" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:55 +msgid "Display contents of exploded ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:56 +msgid "&Explode ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:57 +msgid "Rebuild ePub from exploded contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:58 +msgid "&Rebuild ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:59 +msgid "Discard changes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +msgid "&Cancel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61 +msgid "" +"Explode the ePub to display contents in a file browser window. To tweak " +"individual files, right-click, then 'Open with...' your editor of choice. " +"When tweaks are complete, close the file browser window. Rebuild the ePub, " +"updating your calibre library." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127 msgid "No recipe selected" msgstr "" @@ -7790,7 +7851,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:656 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:655 msgid "Card A" msgstr "" @@ -7799,7 +7860,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:658 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:657 msgid "Card B" msgstr "" @@ -7925,7 +7986,7 @@ msgstr "" msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:585 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8624,10 +8685,6 @@ msgstr "" msgid "&Apply" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 -msgid "&Cancel" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "Restore &defaults" msgstr "" @@ -8907,7 +8964,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:320 msgid "Failed to start content server" msgstr "" @@ -9308,78 +9365,78 @@ msgstr "" msgid "Queueing " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:243 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:313 msgid "Convert existing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:310 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:314 msgid "" "The following books have already been converted to %s format. Do you wish to " "reconvert them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:170 msgid "&Donate to support calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:174 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:417 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:419 msgid "" "

Could not convert: %s

It is a DRMed book. You must " "first remove the DRM using third party tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:432 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:447 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:483 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " "Your donation helps keep calibre development going." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:509 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:512 msgid "" " is communicating with the device!
\n" " Quitting may cause corruption on the device.
\n" " Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:584 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -10156,48 +10213,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:232 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:234 msgid "today" msgstr "avui" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:235 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:237 msgid "yesterday" msgstr "ahir" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:238 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "thismonth" msgstr "aquestmes" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:241 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:242 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:243 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:244 msgid "daysago" msgstr "dies" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "no" msgstr "no" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "yes" msgstr "sí" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "empty" msgstr "buit" @@ -10780,31 +10837,31 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:654 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:653 msgid "Main" msgstr "Inici" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1992 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1998 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2027 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2038 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2044 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2131 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2137 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2170 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2176 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2192 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2198 msgid "Checked id" msgstr "" @@ -11274,59 +11331,59 @@ msgid "" "Do not download latest version of builtin recipes from the calibre server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:46 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:47 msgid "Unknown News Source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:611 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:612 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:710 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:711 msgid "Download finished" msgstr "S'ha finalitzat la baixada" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:712 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713 msgid "Failed to download the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:719 msgid "Failed to download parts of the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:721 msgid " from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:722 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:723 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:811 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:812 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:832 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:833 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:837 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:838 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:843 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:844 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:845 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:846 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:926 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:927 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:942 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:943 msgid "Feeds downloaded to %s" msgstr "" @@ -11334,37 +11391,37 @@ msgstr "" msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:964 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:959 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1005 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1004 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1173 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1172 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1244 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1243 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1255 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1254 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1271 msgid "Fetching feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1419 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1418 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1435 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1433 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." diff --git a/src/calibre/translations/da.po b/src/calibre/translations/da.po index df0f6d11a4..a7df259e89 100644 --- a/src/calibre/translations/da.po +++ b/src/calibre/translations/da.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-09-17 21:00+0000\n" -"PO-Revision-Date: 2010-09-23 17:40+0000\n" -"Last-Translator: Glenn \n" +"POT-Creation-Date: 2010-09-24 21:33+0000\n" +"PO-Revision-Date: 2010-09-24 20:56+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-24 04:39+0000\n" +"X-Launchpad-Export-Date: 2010-09-25 04:39+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -24,7 +24,8 @@ msgstr "Gør absolut ingenting" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:410 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:46 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:412 #: /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 @@ -105,24 +106,24 @@ msgstr "Gør absolut ingenting" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:299 #: /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 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1161 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1162 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1165 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:357 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 @@ -135,11 +136,11 @@ msgstr "Gør absolut ingenting" #: /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:1065 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1137 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1837 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1839 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1966 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1064 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1139 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1843 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1845 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 #: /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 @@ -261,43 +262,43 @@ msgstr "Gemmer metadata i %s filerne" msgid "Set metadata from %s files" msgstr "Sæt metadata fra %s filer" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 msgid "Look and Feel" msgstr "Fremtoning" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:686 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:698 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:709 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Interface" msgstr "Brugergrænseflade" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Tilpas calibres grænseflades fremtoning til din smag" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 msgid "Behavior" msgstr "Opførsel" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 msgid "Change the way calibre behaves" msgstr "Ændr måden calibre opfører sig på" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:176 msgid "Add your own columns" msgstr "Tilføj dine egne søjler" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 msgid "Add/remove your own columns to the calibre book list" msgstr "Tilføj/fjern dine egne søjler til calibre boglisten" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 msgid "Customize the toolbar" msgstr "Tilpas værktøjslinjen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -305,55 +306,55 @@ msgstr "" "Tilpas værktøjslinjen og kontekstmenuen, ændre hvilke aktioner som er " "tilgængelige i hver" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 msgid "Input Options" msgstr "Input tilvalg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:732 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:743 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Conversion" msgstr "Konvertering" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 msgid "Set conversion options specific to each input format" msgstr "Vælg konverteringsvalgmuligheder specifikke for hvert input-format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 msgid "Common Options" msgstr "Fælles tilvalg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 msgid "Set conversion options common to all formats" msgstr "Vælg konverteringsvalgmuligheder fælles for alle formater" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 msgid "Output Options" msgstr "Output valgmuligheder" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 msgid "Set conversion options specific to each output format" msgstr "Vælg konverteringsvalgmuligheder specifikke for hvert output-format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 msgid "Adding books" msgstr "Tilføjer boger" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:777 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Import/Export" msgstr "Import/eksport" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 msgid "Control how calibre reads metadata from files when adding books" msgstr "Styre hvordan calibre læser metadata fra filer, når bøger tilføjes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 msgid "Saving books to disk" msgstr "Gemmer bøger til disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -361,24 +362,24 @@ msgstr "" "Styre hvordan calibre eksporterer filer fra dens database til disk, når gem-" "til-disk anvendes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Sending books to devices" msgstr "Sender bøger til enheder" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre transfers files to your ebook reader" msgstr "Styre hvordan calibre overfører filer til dil e-bogslæser" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Sharing books by email" msgstr "Deler bøger via email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 msgid "Sharing" msgstr "Deler" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -386,11 +387,11 @@ msgstr "" "Opsætning som deler bøger via email. Kan anvendes til automatisk sending af " "downloadede nyheder til dine enheder" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sharing over the net" msgstr "Deler over internettet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -398,33 +399,33 @@ msgstr "" "Opsætning af calibre indholdsserveren, hvilket vil give dig adgang til dit " "calibre-bibliotek fra overalt, på enhver enhed, over internettet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Plugins" msgstr "Udvidelsesmoduler" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Advanced" msgstr "Avanceret" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Tilføj/fjern/tilpas forskellige dele af calibres funktionalitet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 msgid "Tweaks" msgstr "Tweaks" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846 msgid "Fine tune how calibre behaves in various contexts" msgstr "Finjustér hvordan calibre opfører sig i forskellige sammenhænge" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 msgid "Miscellaneous" msgstr "Diverse" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 msgid "Miscellaneous advanced configuration" msgstr "Diverse avanceret opsætning" @@ -603,16 +604,16 @@ msgstr "Deaktiverede udvidelsesmoduler" msgid "Enabled plugins" msgstr "Aktiverede udvidelsesmoduler" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:93 msgid "No valid plugin found in " msgstr "Intet gyldigt udvidelsesmodul fundet i " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:508 msgid "Initialization of plugin %s failed with traceback:" msgstr "" "Initialiseringen af udvidelsesmodul %s fejlede med følgende backtrace:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:541 msgid "" " %prog options\n" "\n" @@ -624,19 +625,19 @@ msgstr "" " Tilpas Calibre ved at indlæse eksterne udvidelsesmoduler.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:547 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" "Tilføj et udvidelsesmodul ved at angive stien til ZIP-filen, hvori det er " "gemt." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:549 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Fjerner det angivne brugerdefinerede udvidelsesmodul. Har ingen effekt på " "indbyggede udvidelser" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:551 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -644,15 +645,15 @@ msgstr "" "Brugertilpasset udvidelsesmodul. Angiv udvidelsesmodulnavn og " "tilpasningstekststrenge adskilt af kommaer." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:553 msgid "List all installed plugins" msgstr "Vis alle installerede udvidelsesmoduler" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:555 msgid "Enable the named plugin" msgstr "Aktivér det angivne udvidelsesmodul" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:557 msgid "Disable the named plugin" msgstr "Deaktivér det angivne udvidelsesmodul" @@ -660,7 +661,7 @@ msgstr "Deaktivér det angivne udvidelsesmodul" msgid "Communicate with Android phones." msgstr "Kommunikér med Android telefoner" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:50 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:52 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -668,7 +669,7 @@ msgstr "" "Komma separeret liste af mapper til at sende e-bøger til, på enheden. Den " "første som findes, vil blive brugt." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:94 msgid "Communicate with S60 phones." msgstr "Kommunikér med S60 telefoner." @@ -737,7 +738,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244 #: /home/kovid/work/calibre/src/calibre/library/database2.py:198 #: /home/kovid/work/calibre/src/calibre/library/database2.py:211 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:134 msgid "News" msgstr "Nyheder" @@ -745,8 +746,8 @@ msgstr "Nyheder" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:556 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1669 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1687 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1693 msgid "Catalog" msgstr "Katalog" @@ -830,23 +831,23 @@ msgstr "" "Komma separeret liste af mapper til at sende e-bøger til på enheden. Den " "første først fundne anvendes." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:22 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "Kommunikér med Hanvon N520 eBook læser." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:47 msgid "Communicate with The Book reader." msgstr "Kommunikér med The Book læser." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:59 msgid "Communicate with the SpringDesign Alex eBook reader." msgstr "Kommunikér med SpringDesign Alex eBook læser." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:78 msgid "Communicate with the Azbooka" msgstr "Kommunikér med Azbooka" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:94 msgid "Communicate with the Elonex EB 511 eBook reader." msgstr "Kommunikér med Elonex EB 511 eBook læser." @@ -907,7 +908,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:186 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:188 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -917,33 +918,33 @@ msgstr "" msgid "Getting list of books on device..." msgstr "Henter liste over bøger på enheden..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:248 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:280 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "Fjerner bøger fra enhed..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:282 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:289 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:284 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:291 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "Fjerner bøger fra enhedens metadataliste..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:294 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:328 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:330 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "Tilføjer bøger til enhedens metadataliste..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:390 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "Not Implemented" msgstr "Ikke implementeret" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:391 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:393 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -3387,7 +3388,7 @@ msgstr "Kopiér" msgid "Copy to Clipboard" msgstr "Kopiér til udklipsholder" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:462 msgid "Choose Files" msgstr "Vælg filer" @@ -3519,6 +3520,7 @@ msgstr "Tilføj til bibliotek" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 msgid "No book selected" @@ -3563,8 +3565,8 @@ msgstr "Kun brugernoter genereret fra arbejdsbibliotek" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "Ingen bøger valgt" @@ -3720,7 +3722,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:249 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:584 msgid "Not allowed" msgstr "Ikke tilladt" @@ -3787,7 +3789,7 @@ msgstr "Kunne ikke kopiere bøger: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:428 msgid "Failed" msgstr "Fejlede" @@ -4028,20 +4030,20 @@ msgid "Error" msgstr "Fejl" #: /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:179 msgid "Cannot edit metadata" msgstr "Kan ikke redigere metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210 msgid "Cannot merge books" msgstr "Kan ikke flette bøger" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211 msgid "At least two books must be selected for merging" msgstr "Mindst to bøger skal vælges for at kunne flette" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:215 msgid "" "Book formats and metadata from the selected books will be added to the " "first selected book. ISBN will not be merged.

The " @@ -4053,7 +4055,7 @@ msgstr "" "og resterende valgte bøger, vil ikke blive slettet eller " "ændret.

Venligst bekræft at du ønsker at fortsætte." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:227 msgid "" "Book formats and metadata from the selected books will be merged into the " "first selected book. ISBN will not be merged.

After " @@ -4071,7 +4073,7 @@ msgstr "" "slettet fra din computer.

Er du sikker på at du vil " "fortsætte?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:240 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" @@ -4258,6 +4260,28 @@ msgstr "Alt+T" msgid "Books with the same tags" msgstr "Bøger med samme mærker" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54 +msgid "Tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 +msgid "Make small changes to ePub format books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 +msgid "T" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 +msgid "Cannot tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 +msgid "No ePub available. First convert the book to ePub." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" msgstr "V" @@ -4325,7 +4349,7 @@ msgid "The specified directory could not be processed." msgstr "Den angivne mappe kunne ikke behandles." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:807 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 msgid "No books" msgstr "Ingen bøger" @@ -4464,13 +4488,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 -#: /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:376 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 @@ -5257,7 +5281,7 @@ msgid " is not a valid picture" msgstr " er ikke valid billede" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "Book Cover" msgstr "Bogomslag" @@ -5266,7 +5290,7 @@ msgid "Use cover from &source file" msgstr "Brug omslag fra &kildefilen" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /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:414 msgid "Change &cover image:" msgstr "Skift &omslagsbillede:" @@ -5275,18 +5299,18 @@ msgid "Browse for an image to use as the cover of this book." msgstr "Browse efter et billede til anvendelse som denne bogs omslag." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "&Title: " msgstr "&Titel: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "Change the title of this book" msgstr "Udskift bogens titel" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 msgid "&Author(s): " msgstr "&Forfatter(e): " @@ -5302,19 +5326,19 @@ msgstr "" "Udskift bogens forfatter(e). Flere forfattere skal adskilles med et komma" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid "&Publisher: " msgstr "F&orlag: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /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:388 msgid "Ta&gs: " msgstr "&Mærker: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -5324,22 +5348,22 @@ msgstr "" "kommaer." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 msgid "&Series:" msgstr "&Serier:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:249 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 msgid "List of known series. You can add new series." msgstr "Liste over kendte serier. Du kan tilføje nye serier." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Book " msgstr "Bog " @@ -5838,7 +5862,7 @@ msgid " index:" msgstr " indeks:" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 msgid "Automatically number books in this series" msgstr "Automatisk nummerér bøger i denne serie" @@ -5952,123 +5976,123 @@ msgstr "" "Der var en midlertidig fejl ved kommunikation med enheden. Afbryd og " "genforbind enheden eller genstart." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 msgid "Device: " msgstr "Enhed: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:718 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 msgid " detected." msgstr " detekteret." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:808 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 msgid "selected to send" msgstr "valgt til at sende" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 msgid "Choose format to send to device" msgstr "Vælg format til at sende til enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 msgid "No device" msgstr "Ingen enhed" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 msgid "Cannot send: No device is connected" msgstr "Kan ikke sende: Ingen enhed er forbundet" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 msgid "No card" msgstr "Intet hukommelseskort" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 msgid "Cannot send: Device has no storage card" msgstr "Kan ikke sende: Enheden har intet hukommelseskort" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 msgid "E-book:" msgstr "E-bog:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Attached, you will find the e-book" msgstr "Tilknyttet, vil du finde e-bogen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "af" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 msgid "in the %s format." msgstr "i %s formatet." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 msgid "Sending email to" msgstr "Sender e-mail til" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:920 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1202 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1025 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1206 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1214 msgid "No suitable formats" msgstr "Ingen egnede formater" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 msgid "Auto convert the following books before sending via email?" msgstr "Auto konvertér følgende bøger før sending via e-mail?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "Kunne ikke e-maile følgende bøger da ingen egnede formater blev fundet:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951 msgid "Failed to email books" msgstr "Fejlede med at e-maile bøger" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Failed to email the following books:" msgstr "Fejlede med at e-maile følgende bøger:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956 msgid "Sent by email:" msgstr "Sendt via e-mail:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "News:" msgstr "Nyheder:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Attached is the" msgstr "Forbundet er" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:992 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:996 msgid "Sent news to" msgstr "Send nyheder til" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1022 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Auto convert the following books before uploading to the device?" msgstr "Auto konvertér følgende bøger før upload til enheden?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1052 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1056 msgid "Sending catalogs to device." msgstr "Sender kataloger til enheden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1116 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending news to device." msgstr "Sender nyheder til enheden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1173 msgid "Sending books to device." msgstr "Sender bøger til enheden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1211 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 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." @@ -6076,11 +6100,11 @@ msgstr "" "Kunne ikke uploade følgende bøger til enheden, da ingen egnede formater blev " "fundet. Konvertér bog/bøgerne til et format understøttet af din enhed først." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1273 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1277 msgid "No space on device" msgstr "Ingen plads på enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1274 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -6139,7 +6163,7 @@ msgid "My Books" msgstr "Mine bøger" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301 msgid "Generate catalog" msgstr "Generér katalog" @@ -6479,31 +6503,31 @@ msgstr "" "Ændringer er permanente. Der er ingen fortryd funktion. Du anbefales at tage " "en kopi af dit bibliotek før fortsættelse." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:386 msgid "Search/replace invalid" msgstr "Søg/erstat ugyldig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:387 msgid "Search pattern is invalid: %s" msgstr "Søge mønsteret er ugyldigt: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:419 msgid "Applying changes to %d books. This may take a while." msgstr "Gennemfører ændringer på %d bøger. Dette kan tage et stykke tid." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 msgid "Edit Meta information" msgstr "Rediger metaoplysninger" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 msgid "A&utomatically set author sort" msgstr "A&utomatisk forfattersortering" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 msgid "Author s&ort: " msgstr "Forfatters&ortering: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -6511,63 +6535,63 @@ msgstr "" "Angiv hvordan bogens forfatter(e) skal sorteres. Som eksempel burde Charles " "Dickens sorteres som Dickens, Charles." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "&Rating:" msgstr "&Vurdering:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Rating of this book. 0-5 stars" msgstr "Vurdering af bogen. 0-5 stjerner" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 msgid "No change" msgstr "Ingen ændring" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid " stars" msgstr " stjerner" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 msgid "Add ta&gs: " msgstr "Tilføj &mærker: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:242 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "Open Tag Editor" msgstr "Åben mærke-editor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 msgid "&Remove tags:" msgstr "&Fjern mærker:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 msgid "Comma separated list of tags to remove from the books. " msgstr "Kommasepareret liste over mærker, der skal fjernes fra bøgerne. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 msgid "Check this box to remove all tags from the books." msgstr "Afkryds denne boks for at fjerne alle mærker fra bøgerne." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 msgid "Remove all" msgstr "Fjern alt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 msgid "Remove &format:" msgstr "Fjern &format" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 msgid "&Swap title and author" msgstr "&Ombyt titel og forfatter" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:253 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -6579,7 +6603,7 @@ msgstr "" "Så hvis du valgte Book A og derefter Book B,\n" "Book A vil have serienummer 1 - og Book B serienummer 2." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:258 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" @@ -6589,49 +6613,49 @@ msgstr "" "\n" "Fremtidige konverteringer af disse bøger vil anvende standardindstillinger." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 msgid "Remove &stored conversion settings for the selected books" msgstr "Fjern &gemte konverteringsindstillinger for de valgte bøger" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 msgid "&Basic metadata" msgstr "&Grund metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423 msgid "&Custom metadata" msgstr "&Tilpas metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 msgid "Search &field:" msgstr "Søg &felt:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 msgid "&Search for:" msgstr "&Søg efter:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 msgid "&Replace with:" msgstr "E&rstat med:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 msgid "Apply function &after replace:" msgstr "Anvend funktion &efter erstat:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 msgid "Test &text" msgstr "Test &tekst" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 msgid "Test re&sult" msgstr "Test re&sultat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 msgid "Your test:" msgstr "Dit resultat:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:271 msgid "&Search and replace (experimental)" msgstr "&Søg og erstat (eksperimentiel)" @@ -6689,7 +6713,7 @@ msgstr "Kunne ikke læse omslaget fra %s-formatet" msgid "The cover in the %s format is invalid" msgstr "Omslaget i %s-formatet er ugyldigt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 msgid "" " The green color indicates that the current author sort matches the current " "author" @@ -6697,7 +6721,7 @@ msgstr "" " Den grønne farve indikerer at den aktuelle forfatter-sort, matcher den " "aktuelle forfatter" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354 msgid "" " The red color indicates that the current author sort does not match the " "current author" @@ -6705,108 +6729,108 @@ msgstr "" " Den røde farve indikerer at den aktuelle forfatter-sort, ikke matcher den " "aktuelle forfatter" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 msgid "Abort the editing of all remaining books" msgstr "Afbryd redigeringen af alle resterende bøger" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:505 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 msgid "This ISBN number is valid" msgstr "Dette ISBN-nummer er gyldigt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 msgid "This ISBN number is invalid" msgstr "Dette ISBN-nummer er ugyldigt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 msgid "Cannot use tag editor" msgstr "Kan ikke anvende mærke-editor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 msgid "The tags editor cannot be used if you have modified the tags" msgstr "Mærke-editor kan ikke anvendes hvis du har ændret mærkaterne" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632 msgid "Downloading cover..." msgstr "Henter omslag..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:625 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660 msgid "Cannot fetch cover" msgstr "Kan ikke hente omslag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661 msgid "Could not fetch cover.
" msgstr "Kunne ikke hente omslag
" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 msgid "The download timed out." msgstr "Download timeout." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "Kunne ikke finde et omslag til denne bog. Prøv at angive ISBN først." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 msgid "" "For the error message from each cover source, click Show details below." msgstr "" "For hver fejlmeddelse fra hver omslagskilde, tryk på \"Vis detaljer\" " "herunder." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669 msgid "Bad cover" msgstr "Dårligt omslag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670 msgid "The cover is not a valid picture" msgstr "Omslaget er ikke et gyldigt billede" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703 msgid "There were errors" msgstr "Der var fejl" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704 msgid "There were errors downloading social metadata" msgstr "Der var fejl under download af sociale metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:733 msgid "Cannot fetch metadata" msgstr "Kan ikke hente metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:734 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "Du skal mindst angive ISBN, titel, forfatter eller udgiver" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:798 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:820 msgid "Permission denied" msgstr "Adgang nægtet" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:799 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:821 msgid "Could not open %s. Is it being used by another program?" msgstr "Kunne ikke åbne %s. Bliver den anvendt af et andet program?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "Edit Meta Information" msgstr "Rediger metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Meta information" msgstr "Metaoplysninger" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Swap the author and title" msgstr "Ombyt forfatter og titel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Author S&ort: " msgstr "Forfatters&ortering " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles.\n" @@ -6819,7 +6843,7 @@ msgstr "" "strenge. Hvis boksen er rødfarvet, så matcher forfatterens og denne tekst " "ikke." -#: /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:380 msgid "" "Automatically create the author sort entry based on the current author " "entry.\n" @@ -6831,71 +6855,75 @@ msgstr "" "Anvend denne knap for at oprette forfatter-sort, vil ændre forfatter-sort " "fra rød til grøn." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "Remove unused series (Series that have no books)" msgstr "Fjern ubenyttede serier (Serier uden bøger)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "IS&BN:" msgstr "IS&BN:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "Publishe&d:" msgstr "Ud&givet:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 msgid "dd MMM yyyy" msgstr "dd MMM yyyy" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "&Date:" msgstr "&Dato:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "&Comments" msgstr "&Kommentarer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "&Fetch metadata from server" msgstr "&Hent metadata fra server" -#: /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:405 msgid "Available Formats" msgstr "Tilgængelige formater" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Add a new format for this book to the database" msgstr "Tilføj et nyt format for denne bog til databasen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Remove the selected formats for this book from the database." msgstr "Fjern de valgte formater for denne bog fra databasen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "Set the cover for the book from the selected format" msgstr "Vælg omslaget for denne bog fra det valgte format" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 msgid "Update metadata from the metadata in the selected format" msgstr "Opdatér metadata fra metadata i det valgte format" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "&Browse" msgstr "&Gennemse" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +msgid "Remove border (if any) from cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 msgid "Reset cover to default" msgstr "Nulstil til standardomslag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 msgid "Download co&ver" msgstr "Download &omslag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 msgid "Generate a default cover based on the title and author" msgstr "Lav et standard omslag baseret på titlen og forfatteren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:421 msgid "&Generate cover" msgstr "&Lav omslag" @@ -7408,6 +7436,39 @@ msgstr "Send test e-mail fra %s til:" msgid "&Test" msgstr "&Test" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:55 +msgid "Display contents of exploded ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:56 +msgid "&Explode ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:57 +msgid "Rebuild ePub from exploded contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:58 +msgid "&Rebuild ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:59 +msgid "Discard changes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +msgid "&Cancel" +msgstr "&Annullér" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61 +msgid "" +"Explode the ePub to display contents in a file browser window. To tweak " +"individual files, right-click, then 'Open with...' your editor of choice. " +"When tweaks are complete, close the file browser window. Rebuild the ePub, " +"updating your calibre library." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127 msgid "No recipe selected" msgstr "Ingen opskrift valgt" @@ -7836,7 +7897,7 @@ msgid "Show books in the main memory of the device" msgstr "Vis bøger i enhedens arbejdshukommelse" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:656 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:655 msgid "Card A" msgstr "Kort A" @@ -7845,7 +7906,7 @@ msgid "Show books in storage card A" msgstr "Vis bøger i hukommelseskort A" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:658 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:657 msgid "Card B" msgstr "Kort B" @@ -7974,7 +8035,7 @@ msgstr "Vis kolonne" msgid "Restore default layout" msgstr "Gendan standard layout" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:585 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8730,10 +8791,6 @@ msgstr "&Del værktøjslinjen i to værktøjslinjer" msgid "&Apply" msgstr "&Anvend" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 -msgid "&Cancel" -msgstr "&Annullér" - #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "Restore &defaults" msgstr "Gendan &standardindstillinger" @@ -9048,7 +9105,7 @@ msgstr "" ">Avanceret->Moduludvidelser" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:320 msgid "Failed to start content server" msgstr "Fejlede med at starte indholdsserveren" @@ -9471,15 +9528,15 @@ msgstr "Lægger bøger i kø for klyngekonvertering" msgid "Queueing " msgstr "Lægger i kø " -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:243 msgid "Fetch news from " msgstr "Henter nyheder fra " -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:313 msgid "Convert existing" msgstr "Konverterer eksisterende" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:310 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:314 msgid "" "The following books have already been converted to %s format. Do you wish to " "reconvert them?" @@ -9487,28 +9544,28 @@ msgstr "" "Følgende bøger er allerede konverteret til %s formatet. Ønsker du at " "genkonvertere dem?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 msgid "&Restore" msgstr "&Gendan" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:170 msgid "&Donate to support calibre" msgstr "&Donér for at støtte calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:174 msgid "&Eject connected device" msgstr "&Skub forbunden enhed ud" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 msgid "Calibre Quick Start Guide" msgstr "Calibre kvik start guide" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:417 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 msgid "Conversion Error" msgstr "Konverteringsfejl" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:419 msgid "" "

Could not convert: %s

It is a DRMed book. You must " "first remove the DRM using third party tools." @@ -9516,15 +9573,15 @@ msgstr "" "

Kunne ikke konvertere: %s

Det er en e-bog med DRM. " "Du skal først fjerne DRM med et tredjepartsværktøj." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:432 msgid "Recipe Disabled" msgstr "Opskrift deaktiveret" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:447 msgid "Failed" msgstr "Fejlede" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:483 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " @@ -9534,11 +9591,11 @@ msgstr "" "calibre brugbart, venligst overvej at give en donation for at støtte dets " "udvikling. Din donation hjælper med calibres fortsatte udvikling." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:509 msgid "There are active jobs. Are you sure you want to quit?" msgstr "Der er aktive opgaver. Er du sikker på du vil afslutte?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:512 msgid "" " is communicating with the device!
\n" " Quitting may cause corruption on the device.
\n" @@ -9549,11 +9606,11 @@ msgstr "" "enheden.
\n" " Er du sikker på at du vil afslutte?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 msgid "WARNING: Active jobs" msgstr "ADVARSEL: Aktive opgaver" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:584 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -10386,48 +10443,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "Slå &indholdsserveren til" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:232 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:234 msgid "today" msgstr "i dag" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:235 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:237 msgid "yesterday" msgstr "i går" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:238 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "thismonth" msgstr "denne måned" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:241 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:242 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:243 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:244 msgid "daysago" msgstr "dage siden" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "no" msgstr "nej" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "unchecked" msgstr "umarkeret" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "checked" msgstr "markeret" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "yes" msgstr "ja" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "blank" msgstr "blank" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "empty" msgstr "tom" @@ -11225,31 +11282,31 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "%sMiddel vurderingen er %3.1f" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:654 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:653 msgid "Main" msgstr "Main/hjem/primær" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1992 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1998 msgid "

Migrating old database to ebook library in %s

" msgstr "

Flytter gammel database til e-bogsbibliotek i %s

" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2027 msgid "Copying %s" msgstr "Kopierer %s" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2038 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2044 msgid "Compacting database" msgstr "Komprimerer database" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2131 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2137 msgid "Checking SQL integrity..." msgstr "Checker SQL integritet..." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2170 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2176 msgid "Checking for missing files." msgstr "Checker for manglende filer." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2192 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2198 msgid "Checked id" msgstr "Checket id" @@ -11764,59 +11821,59 @@ msgstr "" "Download ikke den sidste version af de indbyggede opskrifter fra calibre-" "serveren" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:46 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:47 msgid "Unknown News Source" msgstr "Ukendt nyhedskilde" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:611 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:612 msgid "The \"%s\" recipe needs a username and password." msgstr "\"%s\"-opskriften kræver et brugernavn og adgangskode." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:710 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:711 msgid "Download finished" msgstr "Download afsluttet" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:712 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713 msgid "Failed to download the following articles:" msgstr "Kunne ikke downloade følgende artikler:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:719 msgid "Failed to download parts of the following articles:" msgstr "Kunne ikke downloade dele af følgende artikler:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:721 msgid " from " msgstr " fra " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:722 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:723 msgid "\tFailed links:" msgstr "\tMislykkede henvisninger:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:811 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:812 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "Kunne ikke hente artikler. Kør med -vv for at se årsagen" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:832 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:833 msgid "Fetching feeds..." msgstr "Henter feeds..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:837 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:838 msgid "Got feeds from index page" msgstr "Fik feeds fra indekssiden" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:843 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:844 msgid "Trying to download cover..." msgstr "Prøver at downloade omslag..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:845 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:846 msgid "Generating masthead..." msgstr "Genererer masthead..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:926 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:927 msgid "Starting download [%d thread(s)]..." msgstr "Starter download [%d tråd(e)]..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:942 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:943 msgid "Feeds downloaded to %s" msgstr "Feeds er hentet til %s" @@ -11824,31 +11881,31 @@ msgstr "Feeds er hentet til %s" msgid "Could not download cover: %s" msgstr "Kunne ikke hente omslaget: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:964 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:959 msgid "Downloading cover from %s" msgstr "Downloader omslag fra %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1005 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1004 msgid "Masthead image downloaded" msgstr "Masthead billede downloadet" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1173 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1172 msgid "Untitled Article" msgstr "Unavngiven artikel" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1244 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1243 msgid "Article downloaded: %s" msgstr "Artikel hentet: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1255 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1254 msgid "Article download failed: %s" msgstr "Hentning af artikel mislykkedes: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1271 msgid "Fetching feed" msgstr "Henter feed" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1419 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1418 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." @@ -11856,7 +11913,7 @@ msgstr "" "Login mislykkedes, check dit brugernavn og adgangskode til calibre " "tidsskriftsservice." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1435 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1433 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." diff --git a/src/calibre/translations/eu.po b/src/calibre/translations/eu.po index 8a78bae393..88094f0fb2 100644 --- a/src/calibre/translations/eu.po +++ b/src/calibre/translations/eu.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-09-17 21:00+0000\n" -"PO-Revision-Date: 2010-09-20 11:11+0000\n" +"POT-Creation-Date: 2010-09-24 21:33+0000\n" +"PO-Revision-Date: 2010-09-24 20:42+0000\n" "Last-Translator: gorkaazk \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-21 04:57+0000\n" +"X-Launchpad-Export-Date: 2010-09-25 04:39+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -24,7 +24,8 @@ msgstr "Ez du ezer egiten" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:410 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:46 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:412 #: /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 @@ -105,24 +106,24 @@ msgstr "Ez du ezer egiten" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:299 #: /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 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1161 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1162 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1165 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:357 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 @@ -135,11 +136,11 @@ msgstr "Ez du ezer egiten" #: /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:1065 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1137 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1837 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1839 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1966 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1064 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1139 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1843 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1845 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 #: /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 @@ -261,43 +262,43 @@ msgstr "Ezarri metadatuak %s fitxategietan" msgid "Set metadata from %s files" msgstr "Ezarri metadatuak %s fitxategietatik" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 msgid "Look and Feel" msgstr "Itxura eta izaera" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:686 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:698 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:709 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Interface" msgstr "Interfazea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Doi ezazu calibreren interfazearen itxura zure gustuen arabera" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 msgid "Behavior" msgstr "Jokabidea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 msgid "Change the way calibre behaves" msgstr "Calibre-ren jokatzeko era aldatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:176 msgid "Add your own columns" msgstr "Gehi itzazu zureak diren zutabeak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 msgid "Add/remove your own columns to the calibre book list" msgstr "Calibre-ren liburu zerrendan zuk egindako zutabeak gehitu/ezabatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 msgid "Customize the toolbar" msgstr "Tresna-barra pertsonalizatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -305,57 +306,57 @@ msgstr "" "Tresna-barra eta kontextuaren araberako menuak pertsonalizatu, bakoitzean " "aukeragarri agertuko diren ekintzak aldatuz." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 msgid "Input Options" msgstr "Sorburu aukerak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:732 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:743 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Conversion" msgstr "Bihurketa" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 msgid "Set conversion options specific to each input format" msgstr "Ezarri itzazu sorburu formatu bakoitzeko bihurketa aukera zehatzak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 msgid "Common Options" msgstr "Aukera komunak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 msgid "Set conversion options common to all formats" msgstr "Formatu guztientzako eraldatze aukera komunak ezartzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 msgid "Output Options" msgstr "Helburu aukerak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 msgid "Set conversion options specific to each output format" msgstr "Ezarri itzazu helburu formatu bakoitzeko bihurketa aukera zehatzak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 msgid "Adding books" msgstr "Liburuak gehitzen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:777 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Import/Export" msgstr "Inportatu/Esportatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Liburuak gehitzean, calibre-k fitxategietako metadatuak zelan irakurriko " "dituen kontrolatzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 msgid "Saving books to disk" msgstr "Liburuak diskan gordetzen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -363,26 +364,26 @@ msgstr "" "Kontrola ezazu calibrek nola esportatzen dituen fitxategiak bere datu " "basetik diskora \"Diskoan gorde\" aukera erabiltzen denean." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Sending books to devices" msgstr "Liburuak gailuetara bidaltzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre transfers files to your ebook reader" msgstr "" "calibre-k zure liburu elektronikoen irakurgailura fitxategiak zelan igaroko " "dituen kontrolatzen du" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Sharing books by email" msgstr "elektropostaz liburuak elkarbanatzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 msgid "Sharing" msgstr "Elkarbanatzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -390,11 +391,11 @@ msgstr "" "Elektropostaz liburuak elkarbanatzea arautzen du. Saretik jaitsitako " "albisteak norbere gailuetara automatikoki bidaltzeko erabil daiteke" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sharing over the net" msgstr "Sarean zehar elkarbanatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -403,35 +404,35 @@ msgstr "" "interneten bidezko sarbidea emango dizun edozein lekutan eta edozein " "gailuren bidez" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Plugins" msgstr "Gehigarriak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Advanced" msgstr "Aurreratua" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Gehitu/ezabatu/pertsonalizatu calibreren zenbait funtzio" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 msgid "Tweaks" msgstr "Doikuntzak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Afina ezazu zehaztasun handiz nola jokatuko duen calibrek hainbat " "testuingurutan" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 msgid "Miscellaneous" msgstr "Denetarik" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 msgid "Miscellaneous advanced configuration" msgstr "Hainbat gauzetarako ezarpen aurreratuak" @@ -614,16 +615,16 @@ msgstr "Desgaitutako gehigarriak" msgid "Enabled plugins" msgstr "Gehigarri gaituak" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:93 msgid "No valid plugin found in " msgstr "Baliogabeko gehigarria aurkitu da hemen: " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:508 msgid "Initialization of plugin %s failed with traceback:" msgstr "" "%s gehigarriaren abiarazteak huts egin du eta ondoko aztarna utzi du:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:541 msgid "" " %prog options\n" "\n" @@ -635,18 +636,18 @@ msgstr "" " Pertsonalizatu calibre kanpoko gehigarriak kargatuz.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:547 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" "Gehigarria gehitu bere barnean duen ZIP fitxategiaren bidea adieraziz." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:549 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Pertsonalizatutako gehigarria izenez kendu. Ez du efekturik izango " "\"builtin\" gehigarrietan, \"Nola eraiki zen\" gehigarrietan." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:551 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -654,15 +655,15 @@ msgstr "" "Pertsonalizatu gehigarria. Adierazi gehigarriaren izena eta " "pertsonalizaturiko katearena komaren bidez bereizirik." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:553 msgid "List all installed plugins" msgstr "Zerrendatu instalatutako gehigarri guztiak" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:555 msgid "Enable the named plugin" msgstr "Gaitu izendaturiko gehigarria." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:557 msgid "Disable the named plugin" msgstr "Desgaitu izendaturiko gehigarria." @@ -670,7 +671,7 @@ msgstr "Desgaitu izendaturiko gehigarria." msgid "Communicate with Android phones." msgstr "Adroid telefonoekin komunikatu." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:50 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:52 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -678,7 +679,7 @@ msgstr "" "Gailuan dagoen komen bitartez bereizitako direktorioen zerrenda, liburu " "elektronikoak hara igortzeko. Existitzen den lehena erabiliko da." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:94 msgid "Communicate with S60 phones." msgstr "S60 telefonoekin komunikatu." @@ -751,7 +752,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244 #: /home/kovid/work/calibre/src/calibre/library/database2.py:198 #: /home/kovid/work/calibre/src/calibre/library/database2.py:211 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:134 msgid "News" msgstr "Albisteak" @@ -759,8 +760,8 @@ msgstr "Albisteak" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:556 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1669 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1687 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1693 msgid "Catalog" msgstr "Katalogoa" @@ -845,23 +846,23 @@ msgstr "" "Gailuan dagoen komen bitartez bereizitako direktorioen zerrenda, liburu " "elektronikoak hara igortzeko. Existitzen den lehena erabiliko da." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:22 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "Jar zaitez harremanetan \"Hanvon N520 eBook reader\" horrekin." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:47 msgid "Communicate with The Book reader." msgstr "Jar zaitez harremanetan \"The Book reader\" horrekin." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:59 msgid "Communicate with the SpringDesign Alex eBook reader." msgstr "Jar zaitez harremanetan \"SpringDesign Alex eBook reader\" horrekin." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:78 msgid "Communicate with the Azbooka" msgstr "Jar zaitez harremanetan \"Azabooka\" horrekin." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:94 msgid "Communicate with the Elonex EB 511 eBook reader." msgstr "Jar zaitez harremanetan \"Elonex EB 511 eBook reader\" horrekin." @@ -922,7 +923,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:186 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:188 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -932,33 +933,33 @@ msgstr "" msgid "Getting list of books on device..." msgstr "Liburu zerrenda gailutik eskuratzen..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:248 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:280 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "Gailutik liburuak ezabatzen..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:282 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:289 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:284 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:291 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "Gailuaren metadatu zerrendatik liburuak kentzen..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:294 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:328 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:330 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "Gailuaren metadatu zerrendara liburuak gehitzen..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:390 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "Not Implemented" msgstr "Abiarazi gabea, inplementatu gabea" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:391 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:393 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -3545,7 +3546,7 @@ msgstr "Kopiatu" msgid "Copy to Clipboard" msgstr "Kopiatu arbelean" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:462 msgid "Choose Files" msgstr "Aukeratu fitxategiak" @@ -3680,6 +3681,7 @@ msgstr "Gehitu liburutegira" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 msgid "No book selected" @@ -3724,8 +3726,8 @@ msgstr "Liburutegi nagusian erabiltzaileak sortu dituen oharrak bakarrik" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "Libururik ez da hautatu" @@ -3883,7 +3885,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:249 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:584 msgid "Not allowed" msgstr "Not allowed" @@ -3952,7 +3954,7 @@ msgstr "Ezin izan dira liburuak kopiatu: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:428 msgid "Failed" msgstr "Huts egin du" @@ -4193,20 +4195,20 @@ msgid "Error" msgstr "Errorea" #: /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:179 msgid "Cannot edit metadata" msgstr "Ezin izan dira metadatuak editatu" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210 msgid "Cannot merge books" msgstr "Ezin izan dira liburuak bateratu" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211 msgid "At least two books must be selected for merging" msgstr "Gutxienez bi liburu hautatu beharko dira haiekin bakarra egiteko" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:215 msgid "" "Book formats and metadata from the selected books will be added to the " "first selected book. ISBN will not be merged.

The " @@ -4218,7 +4220,7 @@ msgstr "" "Hautatutako bigarren liburua eta hurrengoak ez dira ez ezabatuko ezta " "aldatuko ere.

Mesedez, baiezta ezazu aurrera egin nahi duzula." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:227 msgid "" "Book formats and metadata from the selected books will be merged into the " "first selected book. ISBN will not be merged.

After " @@ -4236,7 +4238,7 @@ msgstr "" "bigarren liburuan eta hurrengoetan betiko ezabatu egingo dira zure " "ordenagailutik.

Ziur zaude? Benetan aurrera egin nahi duzu?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:240 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" @@ -4424,6 +4426,28 @@ msgstr "Alt+T" msgid "Books with the same tags" msgstr "Books with the same tags" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54 +msgid "Tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 +msgid "Make small changes to ePub format books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 +msgid "T" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 +msgid "Cannot tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 +msgid "No ePub available. First convert the book to ePub." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" msgstr "I" @@ -4492,7 +4516,7 @@ msgid "The specified directory could not be processed." msgstr "Zehaztutako direktorioa ezin izan da prozesatu." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:807 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 msgid "No books" msgstr "Libururik ez" @@ -4634,13 +4658,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 -#: /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:376 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 @@ -5436,7 +5460,7 @@ msgid " is not a valid picture" msgstr " ez da irudi baliogarria" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "Book Cover" msgstr "Liburuaren azala" @@ -5445,7 +5469,7 @@ msgid "Use cover from &source file" msgstr "Erabil ezazu liburu-azala &sorburu fitxategitik" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /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:414 msgid "Change &cover image:" msgstr "Aldatu &azaleko irudia:" @@ -5454,18 +5478,18 @@ msgid "Browse for an image to use as the cover of this book." msgstr "Arakatu irudi egoki baten bila liburu honen azal bezala erabiltzeko" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "&Title: " msgstr "&Izenburua: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "Change the title of this book" msgstr "Aldatu liburu honen izenburua" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 msgid "&Author(s): " msgstr "&Egilea(k):s " @@ -5482,19 +5506,19 @@ msgstr "" "beharko lirateke." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid "&Publisher: " msgstr "&Argitaratzailea: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /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:388 msgid "Ta&gs: " msgstr "Etike&tak: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -5504,22 +5528,22 @@ msgstr "" "etiketa, komekin bereiziak." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 msgid "&Series:" msgstr "&Sailak:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:249 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 msgid "List of known series. You can add new series." msgstr "Ezagunak diren sailen zerrenda. Sail berria gehi dezakezu." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Book " msgstr "Liburua " @@ -6024,7 +6048,7 @@ msgid " index:" msgstr " aurkibidea:" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 msgid "Automatically number books in this series" msgstr "Automatikoki esleitu zenbakiak liburuei sail honetan" @@ -6138,127 +6162,127 @@ msgstr "" "Behin-behineko huts egite bat egon da irakurgailuarekin komunikatzerakoan. " "Mesedez, deskonektatu eta konektatu berriro gailua, edo berrabiarazi." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 msgid "Device: " msgstr "Gailua: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:718 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 msgid " detected." msgstr " detektaturik." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:808 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 msgid "selected to send" msgstr "hautatua bidaltzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 msgid "Choose format to send to device" msgstr "Aukeratu irakurgailura bidaltzeko formatua" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 msgid "No device" msgstr "Gailurik ez dago" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 msgid "Cannot send: No device is connected" msgstr "Ezin izan da igorri: ez dago inolako gailurik konektatua" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 msgid "No card" msgstr "Txartelik ez dago" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 msgid "Cannot send: Device has no storage card" msgstr "Ezin bidali: gailuak ez dauka memoria-txartelik" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 msgid "E-book:" msgstr "Liburu elektronikoa:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Attached, you will find the e-book" msgstr "Erantsita, liburu elektronikoa topatuko duzu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "egilea:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 msgid "in the %s format." msgstr "%s formatuan." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 msgid "Sending email to" msgstr "E-posta igortzen honi:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:920 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1202 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1025 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1206 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1214 msgid "No suitable formats" msgstr "Ez dago formatu egokirik" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 msgid "Auto convert the following books before sending via email?" msgstr "" "Bihurtu modu automatikoan ondorengo liburuak e-postaren bidez igorri " "aurretik?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "Ezin izan da e-postaz ondorengo liburuak igorri formatu egokirik topatu ez " "delako:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951 msgid "Failed to email books" msgstr "Huts egin du liburuak igortzerakoan" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Failed to email the following books:" msgstr "Huts egin du e-postaz hurrengo liburuak bidaltzerakoan:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956 msgid "Sent by email:" msgstr "E-postaz igorria:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "News:" msgstr "Albisteak:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Attached is the" msgstr "Erantsita doana hau da" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:992 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:996 msgid "Sent news to" msgstr "Bidali albisteak honi:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1022 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Bihurtu modu automatikoan hurrengo liburuak irakurgailuan kargatu aurretik?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1052 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1056 msgid "Sending catalogs to device." msgstr "Katalogoak irakurgailura bidaltzen." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1116 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending news to device." msgstr "Albisteak irakurgailura bidaltzen." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1173 msgid "Sending books to device." msgstr "Liburuak irakurgailura bidaltzen." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1211 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 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." @@ -6267,11 +6291,11 @@ msgstr "" "topatu egin ez delako. Lehenengo eta behin, bihurtu liburua(k) zure " "irakurgailuak onartzen duen formaturen batean." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1273 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1277 msgid "No space on device" msgstr "Lekurik ez irakurgailuan" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1274 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -6332,7 +6356,7 @@ msgid "My Books" msgstr "Nire liburuak" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301 msgid "Generate catalog" msgstr "Sortu katalogoa" @@ -6685,32 +6709,32 @@ msgstr "" "Mesedez, arren, otoi eskatzen zaizu liburutegiaren babes kopia ona egitea " "kontu hauekin aurrera segi baino lehen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:386 msgid "Search/replace invalid" msgstr "Bilatu/ordeztu ez dabil" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:387 msgid "Search pattern is invalid: %s" msgstr "Bilatzeko patroaia ez dabil: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:419 msgid "Applying changes to %d books. This may take a while." msgstr "" "Aplikatu aldaketak %d liburuetara. Honek denbora une bat beharko du, agian." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 msgid "Edit Meta information" msgstr "Editatu meta informazioa" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 msgid "A&utomatically set author sort" msgstr "A&utomatikoki ezarri egile izenaren araberako sailkapena" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 msgid "Author s&ort: " msgstr "Egile izenaren araberako s&ailkapena: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -6718,63 +6742,63 @@ msgstr "" "Zehaztu ea nola sailkatuko d(ir)en liburu honen egile izena(k) Adibidez " "Charles Dickens honela sailkatuko da; Dickens, Charles." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "&Rating:" msgstr "&Balorazioa:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Rating of this book. 0-5 stars" msgstr "Liburu honen balorazioa. 0-5 izar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 msgid "No change" msgstr "Aldaketarik ez" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid " stars" msgstr " izarrak" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 msgid "Add ta&gs: " msgstr "Gehitu eti&ketak: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:242 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "Open Tag Editor" msgstr "Zabaldu etiketen editorea" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 msgid "&Remove tags:" msgstr "&Ezabatu etiketak:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 msgid "Comma separated list of tags to remove from the books. " msgstr "Liburuetatik ezabatzeko komen bidez bereiziriko etiketen zerrenda. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 msgid "Check this box to remove all tags from the books." msgstr "Aztertu kutxatila hau liburuetako etiketa guztiak ezabatzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 msgid "Remove all" msgstr "Ezabatu dena" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 msgid "Remove &format:" msgstr "Ezabatu &formatua:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 msgid "&Swap title and author" msgstr "&Trukatu haien artean izenburua eta egilearen izena" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:253 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -6786,7 +6810,7 @@ msgstr "" "Beraz, aukeratu badituzu A liburua eta gero B liburua, A liburuak zerrendako " "1. zenbakia izango du eta B liburuak zerrendako 2. zenbakia." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:258 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" @@ -6797,49 +6821,49 @@ msgstr "" "Etorkizunean liburu hauen bihurketek lehenetsitako ezarpenak erabiliko " "dituzte." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 msgid "Remove &stored conversion settings for the selected books" msgstr "Ezabatu &gordetako bihurketa ezarpenak hautatutako liburuentzat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 msgid "&Basic metadata" msgstr "&Oinarrizko metadatuak" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423 msgid "&Custom metadata" msgstr "&Pertsonalizaturiko metadatuak" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 msgid "Search &field:" msgstr "Search &eremua:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 msgid "&Search for:" msgstr "&Bilatu hau:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 msgid "&Replace with:" msgstr "&Ordeztu honekin:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 msgid "Apply function &after replace:" msgstr "Aplikatu funtzioa ordeztu &eta_gero" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 msgid "Test &text" msgstr "Testua &testua" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 msgid "Test re&sult" msgstr "Testu emai&tza" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 msgid "Your test:" msgstr "Zure testua:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:271 msgid "&Search and replace (experimental)" msgstr "&Bilatu eta ordeztu (esperimentala, beta)" @@ -6898,7 +6922,7 @@ msgstr "Ezin izan da %s formatutik irakurri" msgid "The cover in the %s format is invalid" msgstr "Liburu-azala %s formatuan ez du balio" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 msgid "" " The green color indicates that the current author sort matches the current " "author" @@ -6906,7 +6930,7 @@ msgstr "" " Kolore berdeak adierazten du erabiltzen ari garen egile mota honek bat " "egiten duela erabiltzen ari garen egilearekin" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354 msgid "" " The red color indicates that the current author sort does not match the " "current author" @@ -6914,112 +6938,112 @@ msgstr "" " Kolore gorriak adierazten du erabiltzen ari garen egile mota honek ez duela " "bat egiten erabiltzen ari garen egilearekin" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 msgid "Abort the editing of all remaining books" msgstr "Bertan behera utzi geratzen diren liburu guztien editatze lana" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:505 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 msgid "This ISBN number is valid" msgstr "ISBN zenbaki baliogarria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 msgid "This ISBN number is invalid" msgstr "ISBN zenbaki balio gabea" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 msgid "Cannot use tag editor" msgstr "Ezin da etiketa editorea erabili" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 msgid "The tags editor cannot be used if you have modified the tags" msgstr "Etiketa editorea ezin izango da erabili etiketak aldatu badituzu" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632 msgid "Downloading cover..." msgstr "Deskargatzen liburu-azala..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:625 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660 msgid "Cannot fetch cover" msgstr "Ezin da liburu-azala eskuratu" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661 msgid "Could not fetch cover.
" msgstr "Ezin izan da liburu-azalik eskuratu.
" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 msgid "The download timed out." msgstr "Deskargatzeko denbora gainditu egin da." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" "Ezin izan da liburu honetarako liburu-azalik aurkitu. Saia zaitez, lehenengo " "eta behin, ISBN-arekin." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 msgid "" "For the error message from each cover source, click Show details below." msgstr "" "Liburu-azaletako sorburuen errore mezurik balego, egin klik Erakutsi " "zehaztasunak behean." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669 msgid "Bad cover" msgstr "Liburu-azal okerra" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670 msgid "The cover is not a valid picture" msgstr "Liburu azala ez da irudi baliogarria" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703 msgid "There were errors" msgstr "Akatsak egon dira" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704 msgid "There were errors downloading social metadata" msgstr "Akatsak egon dira gizarte mailako metadatuak deskargatzerakoan" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:733 msgid "Cannot fetch metadata" msgstr "Ezin dira metadatuak eskuratu" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:734 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" "Gutxienez hauetako bat zehaztu beharko duzu: ISBNa, izenburua, egilea(k) " "edo argitaletxea" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:798 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:820 msgid "Permission denied" msgstr "Ez zaizu baimenik eman" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:799 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:821 msgid "Could not open %s. Is it being used by another program?" msgstr "Ezin izan da %s zabaldu. Beste programa bat erabiltzen ari?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "Edit Meta Information" msgstr "Editatu meta informazioa" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Meta information" msgstr "Meta informazioa" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Swap the author and title" msgstr "Trukatu haien artean zenburua eta egilearen izena" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Author S&ort: " msgstr "Egile izenaren araberako S&ailkapena: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles.\n" @@ -7032,7 +7056,7 @@ msgstr "" "batekin. Kutxatila gorri baldin badago, orduan egileak edo egileek eta " "testuek ez dute bat egin." -#: /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:380 msgid "" "Automatically create the author sort entry based on the current author " "entry.\n" @@ -7044,73 +7068,77 @@ msgstr "" "Egile mota berria sortzeko botoi hau erabiliz gero, egile mota gorritik " "berdera aldatzea lortuko dugu." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "Remove unused series (Series that have no books)" msgstr "Ezabatu erabiltzen ez diren serieak (libururik ez daukaten serieak)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "IS&BN:" msgstr "IS&BNa:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "Publishe&d:" msgstr "Argitaratu&rik:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 msgid "dd MMM yyyy" msgstr "dd MMM yyyy (AEBetako ohitura)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "&Date:" msgstr "&Data:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "&Comments" msgstr "&Iruzkinak" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "&Fetch metadata from server" msgstr "&Eskuratu metadatuak zerbitzaritik" -#: /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:405 msgid "Available Formats" msgstr "Eskuragarri dauden formatuak" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Add a new format for this book to the database" msgstr "Gehi ezazu datu basera liburu honetarako formatu berri bat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Remove the selected formats for this book from the database." msgstr "Ezaba ezazu datu basetik liburu honetarako hautatutako formatuak" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "Set the cover for the book from the selected format" msgstr "Ezarri ezazu liburu honen azala hautatutako formatutik" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 msgid "Update metadata from the metadata in the selected format" msgstr "Egunera itzazu metadatuak hautatutako formatuaren metadatuetatik" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "&Browse" msgstr "&Arakatu" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +msgid "Remove border (if any) from cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 msgid "Reset cover to default" msgstr "Berrezarri lehenetsitako liburu-azala" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 msgid "Download co&ver" msgstr "Deskargatu liburu&azala" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 msgid "Generate a default cover based on the title and author" msgstr "" "Sortu lehenetsitako liburu-azal oinarrizko bat egilearen izenarekin eta " "izenbuarekin" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:421 msgid "&Generate cover" msgstr "&Sortu liburu-azala" @@ -7631,6 +7659,39 @@ msgstr "Igorri aztertzeko e-posta bat hemendik %s horra:" msgid "&Test" msgstr "&Aztertu" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:55 +msgid "Display contents of exploded ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:56 +msgid "&Explode ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:57 +msgid "Rebuild ePub from exploded contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:58 +msgid "&Rebuild ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:59 +msgid "Discard changes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +msgid "&Cancel" +msgstr "&Bertan behera utzi" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61 +msgid "" +"Explode the ePub to display contents in a file browser window. To tweak " +"individual files, right-click, then 'Open with...' your editor of choice. " +"When tweaks are complete, close the file browser window. Rebuild the ePub, " +"updating your calibre library." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127 msgid "No recipe selected" msgstr "Ez da formula edo errezetarik hautatu" @@ -8060,7 +8121,7 @@ msgid "Show books in the main memory of the device" msgstr "Erakutsi liburuak irakurgailuaren memoria nagusian" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:656 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:655 msgid "Card A" msgstr "A txartela" @@ -8069,7 +8130,7 @@ msgid "Show books in storage card A" msgstr "Erakutsi liburuak A memoria-txartelean" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:658 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:657 msgid "Card B" msgstr "B txartela" @@ -8199,7 +8260,7 @@ msgstr "Erakutsi zutabea" msgid "Restore default layout" msgstr "Berrezarri lehenetsitako diseinua" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:585 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8984,10 +9045,6 @@ msgstr "&Banatu tresna barra bi tresna barra berrietan" msgid "&Apply" msgstr "&Aplikatu" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 -msgid "&Cancel" -msgstr "&Bertan behera utzi" - #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "Restore &defaults" msgstr "Berrezarri &lehenetsiak" @@ -9311,7 +9368,7 @@ msgstr "" "honela: Preferences->Advanced->Plugins (Aukerak>Aurreratua>Gehigarriak)" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:320 msgid "Failed to start content server" msgstr "Huts egin du edukien zerbitzaria abiarazten" @@ -9743,15 +9800,15 @@ msgstr "Liburuak errenkadan jartzen bihurketa multzoka egiteko" msgid "Queueing " msgstr "Errenkadan jartzen " -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:243 msgid "Fetch news from " msgstr "Eskuratu berriak hemendik " -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:313 msgid "Convert existing" msgstr "Bihurtu dagoen" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:310 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:314 msgid "" "The following books have already been converted to %s format. Do you wish to " "reconvert them?" @@ -9759,28 +9816,28 @@ msgstr "" "Honako liburuak dagoeneko %s formatura bihurtu dira. Nahi dituzu berriro " "bihurtu?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 msgid "&Restore" msgstr "&Lehengoratu" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:170 msgid "&Donate to support calibre" msgstr "&Emaitza egin calibre diruz laguntzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:174 msgid "&Eject connected device" msgstr "&Deskonektatu konektatuta zegoen gailua" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 msgid "Calibre Quick Start Guide" msgstr "Calibre Quick Start Guide (azkar erabiltzeko gida)" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:417 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 msgid "Conversion Error" msgstr "Bihurketa akatsa" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:419 msgid "" "

Could not convert: %s

It is a DRMed book. You must " "first remove the DRM using third party tools." @@ -9790,15 +9847,15 @@ msgstr "" "sistema bat). Bihurtu ahal izateko DRM arazo hori konpondu beharko duzu " "beste batzuen lanabesak erabiliz." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:432 msgid "Recipe Disabled" msgstr "Formula desgaitua" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:447 msgid "Failed" msgstr "Huts egin du" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:483 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " @@ -9809,12 +9866,12 @@ msgstr "" "kontua garapenean laguntzeko. Zure emaitzak lagunduko dio calibreri garatzen " "jarraitzen." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:509 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" "Oraintxe bertan lan batzuk egiten ari dira. Ziur zaude irten nahi duzula?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:512 msgid "" " is communicating with the device!
\n" " Quitting may cause corruption on the device.
\n" @@ -9825,11 +9882,11 @@ msgstr "" "daiteke.
\n" " Ziur zaude? Benetan irten nahi duzu?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 msgid "WARNING: Active jobs" msgstr "ABISUA: lanean dihardu" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:584 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -10681,48 +10738,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "Gaitu &edukien zerbitzaria" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:232 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:234 msgid "today" msgstr "gaur" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:235 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:237 msgid "yesterday" msgstr "atzo" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:238 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "thismonth" msgstr "hilabetehonetan" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:241 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:242 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:243 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:244 msgid "daysago" msgstr "duelaegunbatzuk" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "no" msgstr "Ez" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "unchecked" msgstr "aztertu gabea" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "checked" msgstr "aztertua" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "yes" msgstr "bai" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "blank" msgstr "hutsunea, zuriunea" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "empty" msgstr "hutsik" @@ -10908,7 +10965,7 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" "Baita ere bere baitan 'Serieak atala, katalogoan.\n" -"Lehenetsita: '%lehenetsita'\n" +"Lehenetsita: '%default'\n" "Aplikatzeko: ePub, MOBI output formatuetara" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:581 @@ -11539,33 +11596,33 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "%sBatezbesteko balorazioa hauxe: %3.1f" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:654 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:653 msgid "Main" msgstr "Nagusia" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1992 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1998 msgid "

Migrating old database to ebook library in %s

" msgstr "" "

Migrazioa egiten datu base zaharretik liburu elektronikoen liburutegira " "zera honetan: %s

" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2027 msgid "Copying %s" msgstr "Kopiatzen %s" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2038 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2044 msgid "Compacting database" msgstr "Trinkotzen datu basea" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2131 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2137 msgid "Checking SQL integrity..." msgstr "Aztertzen SQL-ren osotasuna..." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2170 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2176 msgid "Checking for missing files." msgstr "Aztertzen fitxategi galduen bila." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2192 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2198 msgid "Checked id" msgstr "Aztertutako ID" @@ -12092,61 +12149,61 @@ msgid "" "Do not download latest version of builtin recipes from the calibre server" msgstr "Ez deskargatu azken builtin formulen bertsioak calibre zerbitzaritik" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:46 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:47 msgid "Unknown News Source" msgstr "Albiste iturri ezezaguna" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:611 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:612 msgid "The \"%s\" recipe needs a username and password." msgstr "" "Honek \"%s\" formula honek erabiltzaile-izena eta pasahitza behar ditu." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:710 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:711 msgid "Download finished" msgstr "Deskarga burutua" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:712 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713 msgid "Failed to download the following articles:" msgstr "Huts egin du honako artikulu hauek deskargatzerakoan:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:719 msgid "Failed to download parts of the following articles:" msgstr "Huts egin du honako artikulu hauen zatiak deskargatzerakoan:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:721 msgid " from " msgstr " hemendik " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:722 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:723 msgid "\tFailed links:" msgstr "\tEz dabiltzan estekak:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:811 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:812 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" "Ezin izan da artikulua eskuratu. Exekutatu -vv hori zergatia ikusteko" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:832 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:833 msgid "Fetching feeds..." msgstr "Jarioak eskuratzen..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:837 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:838 msgid "Got feeds from index page" msgstr "Jarioak hartuta hasiera orrialdetik" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:843 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:844 msgid "Trying to download cover..." msgstr "Liburu-azala deskargatzen saiatzen..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:845 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:846 msgid "Generating masthead..." msgstr "Sortzen idazpurua..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:926 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:927 msgid "Starting download [%d thread(s)]..." msgstr "Hasi deskarga [%d haria(k)]..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:942 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:943 msgid "Feeds downloaded to %s" msgstr "Jarioak hona deskargatuta %s" @@ -12154,31 +12211,31 @@ msgstr "Jarioak hona deskargatuta %s" msgid "Could not download cover: %s" msgstr "Ezin izan da liburu-azala deskargatu: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:964 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:959 msgid "Downloading cover from %s" msgstr "Deskargatzen liburu-azala hemendik %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1005 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1004 msgid "Masthead image downloaded" msgstr "Idazpuruko irudia deskargatuta" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1173 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1172 msgid "Untitled Article" msgstr "Izenbururik gabeko artikulua" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1244 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1243 msgid "Article downloaded: %s" msgstr "Deskargatutako artikulua: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1255 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1254 msgid "Article download failed: %s" msgstr "Huts egin du artikuluaren deskarga: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1271 msgid "Fetching feed" msgstr "Jarioa eskuratzen" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1419 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1418 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." @@ -12186,7 +12243,7 @@ msgstr "" "Izena emate saioak huts egin du, azter itzazu zure erabiltzaile-izena eta " "pasahitza calibreren Aldian behingo zerbitzurako." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1435 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1433 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index 50367ea8b7..8e874a61e4 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-09-17 21:00+0000\n" -"PO-Revision-Date: 2010-09-21 05:52+0000\n" -"Last-Translator: sengian \n" +"POT-Creation-Date: 2010-09-24 21:33+0000\n" +"PO-Revision-Date: 2010-09-24 20:44+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-22 04:59+0000\n" +"X-Launchpad-Export-Date: 2010-09-25 04:40+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,-1,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -25,7 +25,8 @@ msgstr "Ne fait strictement rien" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:410 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:46 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:412 #: /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 @@ -106,24 +107,24 @@ msgstr "Ne fait strictement rien" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:299 #: /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 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:874 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1158 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1161 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1162 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1165 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:357 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 @@ -136,11 +137,11 @@ msgstr "Ne fait strictement rien" #: /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:1065 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1137 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1837 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1839 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1966 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1064 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1139 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1843 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1845 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 #: /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 @@ -262,44 +263,44 @@ msgstr "Définir les métadonnées des fichiers %s" msgid "Set metadata from %s files" msgstr "Définir les métadonnées à partir des fichiers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:684 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 msgid "Look and Feel" msgstr "Apparence" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:686 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:698 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:709 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Interface" msgstr "Interface" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Ajuster l'aspect et l'ergonomie de l'interface de Calibre à votre convenance" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 msgid "Behavior" msgstr "Comportement" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 msgid "Change the way calibre behaves" msgstr "Changer le comportement de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:707 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:176 msgid "Add your own columns" msgstr "Ajouter vos colonnes personnalisées" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 msgid "Add/remove your own columns to the calibre book list" msgstr "Ajouter/retirer vos propres colonnes dans la liste des livres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 msgid "Customize the toolbar" msgstr "Personnaliser la barre d'outils" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -307,59 +308,59 @@ msgstr "" "Personnaliser les barres d'outils et les menus contextuels, en changeant les " "actions disponibles dans ceux-ci" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 msgid "Input Options" msgstr "Options de saisie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:732 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:743 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Conversion" msgstr "Conversion" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 msgid "Set conversion options specific to each input format" msgstr "" "Définissez les options de conversion spécfiques pour chaque format d'entrée" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 msgid "Common Options" msgstr "Options communes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 msgid "Set conversion options common to all formats" msgstr "" "Définisser les options de conversion communes à tous les formats d'entrée" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 msgid "Output Options" msgstr "Formats de sortie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 msgid "Set conversion options specific to each output format" msgstr "Définissez des options spécifiques pour chaque format de sortie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 msgid "Adding books" msgstr "Ajouter des livres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:777 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Import/Export" msgstr "Import/Export" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Définir comment les métadonnées sont lues par Calibre lors de l'ajout de " "livres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 msgid "Saving books to disk" msgstr "Sauvegarder les livres sur le disque" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -367,26 +368,26 @@ msgstr "" "Contrôle la manière dont Calibre exporte les fichiers de sa base de données " "sur le disque lors des sauvegardes sur disque" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Sending books to devices" msgstr "Envoyer les livres aux appareils" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre transfers files to your ebook reader" msgstr "" "Controller la façon dont calibre exporte les fichiers vers votre lecteur " "d'eBook" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Sharing books by email" msgstr "Partager des livres par courriel" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 msgid "Sharing" msgstr "Partage" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -394,11 +395,11 @@ msgstr "" "Mise en place du partage de livre par courriel. Peu aussi être utilisé pour " "envoyer automatiquement les dernières nouvelles téléchargées à votre appareil" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sharing over the net" msgstr "Partager a travers le réseau" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -407,34 +408,34 @@ msgstr "" "bibliothèque de calibre depuis n'importe où, sur tout les périphérique ou " "depuis Internet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:824 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Advanced" msgstr "Mode avancé" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Ajouter/Retirer/Modifier diverses fonctionalités de Calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 msgid "Tweaks" msgstr "Ajustements" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Affiner la manière dont Calibre se comporte dans différents contextes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 msgid "Miscellaneous" msgstr "Divers" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 msgid "Miscellaneous advanced configuration" msgstr "Diverses configurations avancées" @@ -613,15 +614,15 @@ msgstr "Plugins désactivés." msgid "Enabled plugins" msgstr "Plugins activés" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:93 msgid "No valid plugin found in " msgstr "Absence de plugin compatible dans " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:508 msgid "Initialization of plugin %s failed with traceback:" msgstr "L'initialisation du plugin %s a échoué en laissant une trace:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:541 msgid "" " %prog options\n" "\n" @@ -633,18 +634,18 @@ msgstr "" " Personnaliser Calibre en chargeant des modules additionnels externes.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:547 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" "Ajouter un plugin en précisant le chemin vers le fichier zip qui le contient." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:549 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Suppression d'un plugin personnalisé d'après son nom. Ceci n'a pas d'effet " "sur les plugins intégrés." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:551 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -652,15 +653,15 @@ msgstr "" "Personnaliser le plugin. Spécifier le nom du plugin et la chaîne de " "personnalisation séparés par une virgule." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:553 msgid "List all installed plugins" msgstr "Lister tous les plugins installés" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:555 msgid "Enable the named plugin" msgstr "Activer le plugin nommé" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:557 msgid "Disable the named plugin" msgstr "Désactive le plugin nommé" @@ -668,7 +669,7 @@ msgstr "Désactive le plugin nommé" msgid "Communicate with Android phones." msgstr "Communiquer avec les téléphones Android" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:50 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:52 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -676,7 +677,7 @@ msgstr "" "Liste de répertoires séparés par des virgules utilisée pour envoyer les " "ebooks vers l'appareil. Le premier existant sera utilisé." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:94 msgid "Communicate with S60 phones." msgstr "Communiquer avec les téléphones S60" @@ -745,7 +746,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:244 #: /home/kovid/work/calibre/src/calibre/library/database2.py:198 #: /home/kovid/work/calibre/src/calibre/library/database2.py:211 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1706 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:134 msgid "News" msgstr "Informations" @@ -753,8 +754,8 @@ msgstr "Informations" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:556 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1669 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1687 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1693 msgid "Catalog" msgstr "Catalogue" @@ -838,23 +839,23 @@ msgstr "" "Liste des répertoires séparés par une virgule utilisés pour envoyer les " "livres électroniques à l'appareil. Le premier qui existe sera utilisé." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:22 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "Communiquer avec le lecteur d'ebook Hanvon N520." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:47 msgid "Communicate with The Book reader." msgstr "Communiquer avec le lecteur The Book" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:59 msgid "Communicate with the SpringDesign Alex eBook reader." msgstr "Communiquer avec le lecteur d'ebook Alex de SpringDesign" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:78 msgid "Communicate with the Azbooka" msgstr "Communiquer avec l'Azbooka" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:94 msgid "Communicate with the Elonex EB 511 eBook reader." msgstr "Communiquer avec le lecteur d'ebook Elonex EB 511." @@ -915,7 +916,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:186 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:188 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -925,33 +926,33 @@ msgstr "" msgid "Getting list of books on device..." msgstr "Lit la liste des livres de l'appareil..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:248 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:280 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "Supprime les livres de l'appareil..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:282 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:289 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:284 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:291 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "Supprime les livres de la liste des métadonnées de l'appareil..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:294 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:328 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:330 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "Ajoute les livres à liste des métadonnées de l'appareil..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:390 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "Not Implemented" msgstr "Non implémenté" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:391 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:393 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -3466,7 +3467,7 @@ msgstr "Copier" msgid "Copy to Clipboard" msgstr "Copier dans le Presse-papiers" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:462 msgid "Choose Files" msgstr "Choisir les fichiers" @@ -3599,6 +3600,7 @@ msgstr "Ajouter à la bibliothèqye" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 msgid "No book selected" @@ -3648,8 +3650,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "Aucun livre sélectionné" @@ -3808,7 +3810,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:249 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:584 msgid "Not allowed" msgstr "Interdit" @@ -3878,7 +3880,7 @@ msgstr "IImposible de copier les livres: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:428 msgid "Failed" msgstr "Echec" @@ -4121,20 +4123,20 @@ msgid "Error" msgstr "Erreur" #: /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:179 msgid "Cannot edit metadata" msgstr "Impossible d'éditer les métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:204 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210 msgid "Cannot merge books" msgstr "Impossible de fusionner les livres" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211 msgid "At least two books must be selected for merging" msgstr "Au moins deux livres doivent être séléctionnés avant de fusionner" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:215 msgid "" "Book formats and metadata from the selected books will be added to the " "first selected book. ISBN will not be merged.

The " @@ -4142,7 +4144,7 @@ msgid "" "changed.

Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:227 msgid "" "Book formats and metadata from the selected books will be merged into the " "first selected book. ISBN will not be merged.

After " @@ -4153,7 +4155,7 @@ msgid "" "you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:240 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" @@ -4343,6 +4345,28 @@ msgstr "Alt+T" msgid "Books with the same tags" msgstr "Livres avec les mêmes étiquettes" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54 +msgid "Tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 +msgid "Make small changes to ePub format books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 +msgid "T" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 +msgid "Cannot tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 +msgid "No ePub available. First convert the book to ePub." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" msgstr "V" @@ -4411,7 +4435,7 @@ msgid "The specified directory could not be processed." msgstr "Le chemin spécifié ne peut pas être traité." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:807 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 msgid "No books" msgstr "Aucun livre" @@ -4551,13 +4575,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 -#: /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:376 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 @@ -5347,7 +5371,7 @@ msgid " is not a valid picture" msgstr " n'est pas une image compatible" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "Book Cover" msgstr "Couverture du livre" @@ -5356,7 +5380,7 @@ msgid "Use cover from &source file" msgstr "Utiliser la couverture du fichier &source" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /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:414 msgid "Change &cover image:" msgstr "Modifier l'image de la &couverture:" @@ -5365,18 +5389,18 @@ msgid "Browse for an image to use as the cover of this book." msgstr "Rechercher une image à utiliser en tant que couverture du livre." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "&Title: " msgstr "&Titre : " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "Change the title of this book" msgstr "Modifie le titre du livre" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 msgid "&Author(s): " msgstr "&Auteur(s): " @@ -5393,19 +5417,19 @@ msgstr "" "séparer leurs noms par une virgule." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid "&Publisher: " msgstr "&Editeur: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /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:388 msgid "Ta&gs: " msgstr "Eti&quettes: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -5415,22 +5439,22 @@ msgstr "" "ou phrases, séparés par des virgules." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 msgid "&Series:" msgstr "&Séries:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:249 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 msgid "List of known series. You can add new series." msgstr "Liste de séries connues. Vous pouvez ajouter de nouvelles séries." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Book " msgstr "Livre " @@ -5937,7 +5961,7 @@ msgid " index:" msgstr " index:" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 msgid "Automatically number books in this series" msgstr "Numérote automatiquement les livres dans ces séries" @@ -6052,128 +6076,128 @@ msgstr "" "lecteur électronique. Veuillez déconnecter et reconnecter le lecteur " "électronique et redémarrer." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 msgid "Device: " msgstr "Appareil: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:718 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 msgid " detected." msgstr " detecté." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:808 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 msgid "selected to send" msgstr "sélectionné pour l'envoi" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 msgid "Choose format to send to device" msgstr "Choisir le format à envoyer au lecteur" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:822 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 msgid "No device" msgstr "Aucun appareil" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:823 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 msgid "Cannot send: No device is connected" msgstr "Impossible d'envoyer: Aucun appareil connecté" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 msgid "No card" msgstr "Aucune carte" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 msgid "Cannot send: Device has no storage card" msgstr "Impossible d'envoyer: L'appareil n'a pas de carte mémoire" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 msgid "E-book:" msgstr "E-book:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 msgid "Attached, you will find the e-book" msgstr "En pièce jointe, vous trouverez l'ebook" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "par" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 msgid "in the %s format." msgstr "dans le format %s." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 msgid "Sending email to" msgstr "Envoi d'un email à" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:920 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1202 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1025 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1206 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1214 msgid "No suitable formats" msgstr "Pas de format convenable" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:921 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 msgid "Auto convert the following books before sending via email?" msgstr "" "Convertir automatiquement les livres suivants avant de les envoyer par email " "?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "Impossible d'envoyer par email les livres suivants car aucun format " "convenable n'a été trouvé :" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951 msgid "Failed to email books" msgstr "L'envoi par email des livres a échoué" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Failed to email the following books:" msgstr "L'envoi par email des livres suivants a échoué:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956 msgid "Sent by email:" msgstr "Envoyer par email:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "News:" msgstr "News:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Attached is the" msgstr "Le fichier attaché est" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:992 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:996 msgid "Sent news to" msgstr "Envoi des News vers" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1022 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1203 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Convertir automatiquement les livres suivants avant de les télécharger dans " "l'appareil ?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1052 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1056 msgid "Sending catalogs to device." msgstr "Envoie les catalogues vers l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1116 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending news to device." msgstr "Envoi les News vers l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1173 msgid "Sending books to device." msgstr "Envoie les livres dans l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1211 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 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." @@ -6182,11 +6206,11 @@ msgstr "" "convenable n'a été trouvé. Convertissez avant le(s) livre(s) vers un format " "supporté par votre appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1273 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1277 msgid "No space on device" msgstr "Le lecteur électronique n'a plus d'espace mémoire disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1274 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -6247,7 +6271,7 @@ msgid "My Books" msgstr "Mes Livres" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301 msgid "Generate catalog" msgstr "Générer le catalogue" @@ -6590,32 +6614,32 @@ msgstr "" "revenir en arrière. Vous êtes fortement encouragé à sauvegarder votre " "bibliothèque avant de continuer." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:386 msgid "Search/replace invalid" msgstr "Recherche/Remplacement erroné" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:387 msgid "Search pattern is invalid: %s" msgstr "Motif de recherche erroné: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:419 msgid "Applying changes to %d books. This may take a while." msgstr "" "Application des modifications à %d livres. Ceci peut prendre un moment." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 msgid "Edit Meta information" msgstr "Editer les informations sur les Métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 msgid "A&utomatically set author sort" msgstr "Effectuer un tri a&utomatique par auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 msgid "Author s&ort: " msgstr "&Tri par auteur: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -6623,64 +6647,64 @@ msgstr "" "Définit comment l'auteur de ce livre doit être classé. Par exemple, Charles " "Dickens peut être classé comme Dickens, Charles." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "&Rating:" msgstr "&Note :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:235 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Rating of this book. 0-5 stars" msgstr "Note de ce livre. de 0 à 5 étoiles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 msgid "No change" msgstr "Aucune modification" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid " stars" msgstr " étoiles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 msgid "Add ta&gs: " msgstr "Ajouter des &étiquettes: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:242 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "Open Tag Editor" msgstr "Ouvre l'éditeur de mots-clefs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 msgid "&Remove tags:" msgstr "&Supprime les étiquettes :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 msgid "Comma separated list of tags to remove from the books. " msgstr "" "Liste d'étiquettes séparées par des virgules à supprimer des livres. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 msgid "Check this box to remove all tags from the books." msgstr "Cocher cette cas pour supprimer toutes les étiquettes des livres." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 msgid "Remove all" msgstr "Tout supprimer" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 msgid "Remove &format:" msgstr "Supprimer le &format:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 msgid "&Swap title and author" msgstr "&Intervertir le titre et l'auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:253 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -6692,7 +6716,7 @@ msgstr "" "Ainsi si vous avez sélectionné le livre A et puis le livre B,\n" "le livre A aura un numéro de série 1 et le livre B un numéro de série 2." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:258 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" @@ -6702,51 +6726,51 @@ msgstr "" "\n" "Toute conversion future de ces livres utilisera les paramètres par défaut." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 msgid "Remove &stored conversion settings for the selected books" msgstr "" "Supprimer les paramètres de conversion &enregistrés pour les livres " "sélectionnés" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 msgid "&Basic metadata" msgstr "Metadonnées de &base" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423 msgid "&Custom metadata" msgstr "Metadonnées &personnalisées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 msgid "Search &field:" msgstr "&Champs de recherche:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 msgid "&Search for:" msgstr "&Rechercher:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 msgid "&Replace with:" msgstr "Re&mplacer par:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 msgid "Apply function &after replace:" msgstr "Appliquer la fonction &après remplacement:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 msgid "Test &text" msgstr "&Texte de test" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 msgid "Test re&sult" msgstr "Ré&sultat de test" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 msgid "Your test:" msgstr "Votre test:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:271 msgid "&Search and replace (experimental)" msgstr "&Rechercher et remplacer (experimental)" @@ -6805,7 +6829,7 @@ msgstr "Impossible de lire la couverture à partir du format %s" msgid "The cover in the %s format is invalid" msgstr "La couverture au format %s est incompatible" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 msgid "" " The green color indicates that the current author sort matches the current " "author" @@ -6813,7 +6837,7 @@ msgstr "" " La couleur verte indique que la clé de tri par auteur actuelle correspond à " "l'auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354 msgid "" " The red color indicates that the current author sort does not match the " "current author" @@ -6821,116 +6845,116 @@ msgstr "" " La couleur rouge indique que la clé de tri par auteur actuelle ne " "correspond pas à l'auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 msgid "Abort the editing of all remaining books" msgstr "Abandonner l'édition des livres restants" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:505 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 msgid "This ISBN number is valid" msgstr "Le numéro ISBN est correct" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 msgid "This ISBN number is invalid" msgstr "Le numéro ISBN est incorrect" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 msgid "Cannot use tag editor" msgstr "Editeur d'étiquettes indisponible" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:593 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 msgid "The tags editor cannot be used if you have modified the tags" msgstr "" "L'éditeur d'étiquettes ne peut pas être utilisé si vous avez modifié les " "étiquettes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632 msgid "Downloading cover..." msgstr "Télécharge la couverture..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:625 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660 msgid "Cannot fetch cover" msgstr "Erreur à la récupération de l'image de couverture" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:642 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661 msgid "Could not fetch cover.
" msgstr "Erreur à la récupération de l'image de couverture.
" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 msgid "The download timed out." msgstr "Timeout lors du téléchargement." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" "Impossible de trouver la couverture de ce livre. Essayez déjà de spécifier " "le numéro ISBN." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 msgid "" "For the error message from each cover source, click Show details below." msgstr "" "Pour obtenir le message d'erreur pour chaque fournisseur de couvertures, " "cliquer sur Afficher les détails ci-dessous" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669 msgid "Bad cover" msgstr "Mauvaise couverture" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670 msgid "The cover is not a valid picture" msgstr "La couverture n'est pas une image" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703 msgid "There were errors" msgstr "Il y a eu des erreurs" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704 msgid "There were errors downloading social metadata" msgstr "" "Il y a eu des erreurs lors du téléchargement des métadonnées sociales" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:733 msgid "Cannot fetch metadata" msgstr "Impossible de récupérer les métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:734 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" "Vous devez spécifier au moins un ISBN, un titre, des auteurs ou un éditeur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:798 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:820 msgid "Permission denied" msgstr "Permission refusée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:799 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:821 msgid "Could not open %s. Is it being used by another program?" msgstr "" "Impossible d'ouvrir %s. Est-il en cours d'utilisation par un autre programme " "?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "Edit Meta Information" msgstr "Editer les métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Meta information" msgstr "Informations sur les Métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Swap the author and title" msgstr "Inverse l'auteur et le titre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Author S&ort: " msgstr "Clé de tr&i d'auteur: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles.\n" @@ -6938,7 +6962,7 @@ msgid "" "strings. If it is colored red, then the authors and this text do not match." msgstr "" -#: /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:380 msgid "" "Automatically create the author sort entry based on the current author " "entry.\n" @@ -6946,73 +6970,77 @@ msgid "" "green." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "Remove unused series (Series that have no books)" msgstr "" "Supprimer les séries inutilisées (Les séries qui ne possèdent aucun livres)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "IS&BN:" msgstr "I&SBN :" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "Publishe&d:" msgstr "Pu&blié:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 msgid "dd MMM yyyy" msgstr "dd MMM yyyy" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "&Date:" msgstr "&Date:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "&Comments" msgstr "&Commentaires" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "&Fetch metadata from server" msgstr "&Récupérer les métadonnées à partir du serveur" -#: /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:405 msgid "Available Formats" msgstr "Formats disponibles" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Add a new format for this book to the database" msgstr "Ajouter un nouveau format dans la base de données pour ce livre" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Remove the selected formats for this book from the database." msgstr "Retire les formats sélectionnés de ce livre de la base de données." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "Set the cover for the book from the selected format" msgstr "Indiquer la couverture pour le livre à partir du format sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 msgid "Update metadata from the metadata in the selected format" msgstr "" "Mettre à jour les métadonnées à partir des métadonnées du format sélectionné" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "&Browse" msgstr "&Parcourir" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 +msgid "Remove border (if any) from cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 msgid "Reset cover to default" msgstr "Revenir à la couverture par défaut" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 msgid "Download co&ver" msgstr "Télécharger la cou&verture" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 msgid "Generate a default cover based on the title and author" msgstr "Générer une couverture par défaut basée sur le titre et l'auteur" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:421 msgid "&Generate cover" msgstr "&Générer la couverture" @@ -7540,6 +7568,39 @@ msgstr "Envoyer un email de test de %s vers:" msgid "&Test" msgstr "&Test" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:55 +msgid "Display contents of exploded ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:56 +msgid "&Explode ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:57 +msgid "Rebuild ePub from exploded contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:58 +msgid "&Rebuild ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:59 +msgid "Discard changes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +msgid "&Cancel" +msgstr "&Annuler" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61 +msgid "" +"Explode the ePub to display contents in a file browser window. To tweak " +"individual files, right-click, then 'Open with...' your editor of choice. " +"When tweaks are complete, close the file browser window. Rebuild the ePub, " +"updating your calibre library." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127 msgid "No recipe selected" msgstr "Aucune recette sélectionnée" @@ -7971,7 +8032,7 @@ msgid "Show books in the main memory of the device" msgstr "Afficher les livres dans mémoire principale de l'appareil" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:656 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:655 msgid "Card A" msgstr "Carte A" @@ -7980,7 +8041,7 @@ msgid "Show books in storage card A" msgstr "Afficher les livres dans la carte mémoire A" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:658 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:657 msgid "Card B" msgstr "Carte B" @@ -8112,7 +8173,7 @@ msgstr "Afficher la colonne" msgid "Restore default layout" msgstr "Restorer l'affichage par défaut" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:585 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8897,10 +8958,6 @@ msgstr "&Sépare la barre d'outils en deux bares distinctes" msgid "&Apply" msgstr "&Appliquer" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 -msgid "&Cancel" -msgstr "&Annuler" - #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "Restore &defaults" msgstr "Restaurer les valeurs par &défaut" @@ -9208,7 +9265,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:320 msgid "Failed to start content server" msgstr "A échoué lors du démarrage du serveur de contenu" @@ -9639,15 +9696,15 @@ msgstr "Mise en file d'attente des livres pour la conversion par lot" msgid "Queueing " msgstr "Mise en file d'attente " -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:243 msgid "Fetch news from " msgstr "Récupérer des News de " -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:313 msgid "Convert existing" msgstr "Conversion existante" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:310 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:314 msgid "" "The following books have already been converted to %s format. Do you wish to " "reconvert them?" @@ -9655,28 +9712,28 @@ msgstr "" "Les fichiers suivants ont déjà été convertis au format %s. Souhaitez-vous " "les reconvertir ?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 msgid "&Restore" msgstr "&Montrer" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:170 msgid "&Donate to support calibre" msgstr "&Donner pour supporter Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:174 msgid "&Eject connected device" msgstr "&Ejecter l'appareil connecté" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 msgid "Calibre Quick Start Guide" msgstr "Guide De Démarrage Rapide Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:417 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 msgid "Conversion Error" msgstr "Erreur lors de la conversion" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:419 msgid "" "

Could not convert: %s

It is a DRMed book. You must " "first remove the DRM using third party tools." @@ -9685,15 +9742,15 @@ msgstr "" "href=\"%s\">DRM. Vous devez d'abord enlever les DRM avec des outils " "tiers." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:432 msgid "Recipe Disabled" msgstr "Recette désactivée" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:447 msgid "Failed" msgstr "Échoué" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:483 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " @@ -9703,11 +9760,11 @@ msgstr "" "le monde. Si vous le trouvez utile, vous pouvez donner pour soutenir son " "développement. Vos donations aident Calibre à continuer à se développer." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:509 msgid "There are active jobs. Are you sure you want to quit?" msgstr "Il y a des travaux actifs. Voulez-vous vraiment finir ?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:512 msgid "" " is communicating with the device!
\n" " Quitting may cause corruption on the device.
\n" @@ -9718,11 +9775,11 @@ msgstr "" "l'appareil.
\n" " Êtes-vous sûr de vouloir quitter ?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:516 msgid "WARNING: Active jobs" msgstr "ATTENTION: Travaux actifs" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:584 msgid "" "will keep running in the system tray. To close it, choose Quit in the " "context menu of the system tray." @@ -10568,48 +10625,48 @@ msgstr "" msgid "Turn on the &content server" msgstr "Démarrer le serveur de &contenu" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:232 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:234 msgid "today" msgstr "Aujourd'hui" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:235 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:237 msgid "yesterday" msgstr "Hier" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:238 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:240 msgid "thismonth" msgstr "Ce mois-ci" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:241 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:242 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:243 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:244 msgid "daysago" msgstr "il y a quelques jours" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "no" msgstr "Non" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:406 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:416 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:408 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:418 msgid "unchecked" msgstr "Non vérifié" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "checked" msgstr "Vérifié" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:409 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:419 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:411 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:421 msgid "yes" msgstr "Oui" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "blank" msgstr "vierge" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:413 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:415 msgid "empty" msgstr "Vide" @@ -11428,31 +11485,31 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "La note moyenne de %sest %3.1f" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:654 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:653 msgid "Main" msgstr "Principal" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1992 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1998 msgid "

Migrating old database to ebook library in %s

" msgstr "

Migre l'ancienne base vers la bibliothèque dans %s

" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2027 msgid "Copying %s" msgstr "Copie %s" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2038 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2044 msgid "Compacting database" msgstr "Compacte la base" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2131 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2137 msgid "Checking SQL integrity..." msgstr "Vérifie l'intégrité SQL..." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2170 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2176 msgid "Checking for missing files." msgstr "Vérifie si des fichiers sont manquants." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2192 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2198 msgid "Checked id" msgstr "Id vérifié" @@ -11975,63 +12032,63 @@ msgstr "" "Ne pas télécharger la dernière version des recettes intégrées à partir du " "server Calibre." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:46 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:47 msgid "Unknown News Source" msgstr "Source de News inconnue" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:611 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:612 msgid "The \"%s\" recipe needs a username and password." msgstr "" "La recette \"%s\" a besoin d'un nom d'utilisateur et d'un mot de passe." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:710 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:711 msgid "Download finished" msgstr "Téléchargement effectué" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:712 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713 msgid "Failed to download the following articles:" msgstr "Impossible de télécharger les articles suivants;" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:718 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:719 msgid "Failed to download parts of the following articles:" msgstr "" "Impossible de télécharger certaines parties pour les articles suivants:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:721 msgid " from " msgstr " de " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:722 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:723 msgid "\tFailed links:" msgstr "\tLiens qui ont échoués:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:811 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:812 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" "Impossible de récupérer l'article. Le lancer avec -w pour en connaitre la " "raison" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:832 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:833 msgid "Fetching feeds..." msgstr "Récupération des flux..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:837 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:838 msgid "Got feeds from index page" msgstr "Obtient les flux à partir de la page d'index" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:843 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:844 msgid "Trying to download cover..." msgstr "Essaie de télécharger la couverture..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:845 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:846 msgid "Generating masthead..." msgstr "Génération du masthead" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:926 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:927 msgid "Starting download [%d thread(s)]..." msgstr "Commence le téléchargement [processus %d]..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:942 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:943 msgid "Feeds downloaded to %s" msgstr "Flux téléchargés de %s" @@ -12039,31 +12096,31 @@ msgstr "Flux téléchargés de %s" msgid "Could not download cover: %s" msgstr "Impossible de télécharger la couverture: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:964 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:959 msgid "Downloading cover from %s" msgstr "Télécharge la couverture de %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1005 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1004 msgid "Masthead image downloaded" msgstr "L'image du titre a été téléchargée" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1173 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1172 msgid "Untitled Article" msgstr "Article sans titre" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1244 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1243 msgid "Article downloaded: %s" msgstr "Article téléchargé : %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1255 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1254 msgid "Article download failed: %s" msgstr "Impossible de télécharger l'article: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1272 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1271 msgid "Fetching feed" msgstr "Récupération du flux" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1419 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1418 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." @@ -12071,7 +12128,7 @@ msgstr "" "La connexion a échouée, vérifier votre nom d'utilisateur et votre mot de " "passe pour le service Périodique Calibre." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1435 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1433 msgid "" "You do not have permission to download this issue. Either your subscription " "has expired or you have exceeded the maximum allowed downloads for today." diff --git a/src/calibre/translations/hu.po b/src/calibre/translations/hu.po index f7b5c36159..345a618292 100644 --- a/src/calibre/translations/hu.po +++ b/src/calibre/translations/hu.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-09-03 19:17+0000\n" -"PO-Revision-Date: 2010-09-03 19:07+0000\n" -"Last-Translator: Kovid Goyal \n" +"POT-Creation-Date: 2010-09-24 21:33+0000\n" +"PO-Revision-Date: 2010-09-24 19:19+0000\n" +"Last-Translator: Devilinside \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-04 04:39+0000\n" +"X-Launchpad-Export-Date: 2010-09-25 04:40+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -24,11 +24,12 @@ msgstr "Semmit nem csinál" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:395 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:46 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:412 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:522 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:526 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -78,7 +79,9 @@ msgstr "Semmit nem csinál" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 #: /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/oeb/transforms/jacket.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 #: /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 @@ -101,43 +104,43 @@ msgstr "Semmit nem csinál" #: /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:247 -#: /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/ebooks/rtf/input.py:239 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:299 #: /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:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1163 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1162 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1165 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:882 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:877 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1062 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:91 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:187 #: /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:1064 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1139 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1843 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1845 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1972 #: /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 @@ -171,15 +174,17 @@ msgstr "Metaadat író" msgid "Catalog generator" msgstr "Katalógus készítő" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:369 msgid "User Interface Action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:376 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:386 #: /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/dialogs/config/config_ui.py:612 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 +#: /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 "Beállítások" @@ -257,20 +262,165 @@ msgstr "Metaadatok beállítása a %s típusú fájlokban." msgid "Set metadata from %s files" msgstr "Metadatok beállítása a következő fájlokból: %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:681 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 msgid "Look and Feel" -msgstr "" +msgstr "Megjelenés" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:683 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:692 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Interface" msgstr "Kezelőfelület" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 +msgid "Adjust the look and feel of the calibre interface to suit your tastes" +msgstr "Állítsa be a calibre kezelőfelületét saját ízlésének megfelelően" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 msgid "Behavior" msgstr "" +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 +msgid "Change the way calibre behaves" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:176 +msgid "Add your own columns" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +msgid "Add/remove your own columns to the calibre book list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 +msgid "Customize the toolbar" +msgstr "Az eszköztár testreszabása" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 +msgid "" +"Customize the toolbars and context menus, changing which actions are " +"available in each" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 +msgid "Input Options" +msgstr "Bemeneti beállítások" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +msgid "Conversion" +msgstr "Konvertálás" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +msgid "Set conversion options specific to each input format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +msgid "Common Options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +msgid "Set conversion options common to all formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +msgid "Output Options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 +msgid "Set conversion options specific to each output format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +msgid "Adding books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +msgid "Import/Export" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +msgid "Control how calibre reads metadata from files when adding books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +msgid "Saving books to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +msgid "" +"Control how calibre exports files from its database to disk when using Save " +"to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +msgid "Sending books to devices" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +msgid "Control how calibre transfers files to your ebook reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +msgid "Sharing books by email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +msgid "Sharing" +msgstr "Megosztás" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +msgid "" +"Setup sharing of books via email. Can be used for automatic sending of " +"downloaded news to your devices" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 +msgid "Sharing over the net" +msgstr "Hálózati megosztás" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 +msgid "" +"Setup the calibre Content Server which will give you access to your calibre " +"library from anywhere, on any device, over the internet" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +msgid "Plugins" +msgstr "Plugin-ok" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +msgid "Advanced" +msgstr "Haladó" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 +msgid "Add/remove/customize various bits of calibre functionality" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +msgid "Tweaks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846 +msgid "Fine tune how calibre behaves in various contexts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +msgid "Miscellaneous" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 +msgid "Miscellaneous advanced configuration" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102 msgid "Conversion Input" msgstr "Konverzió bemenet" @@ -311,7 +461,7 @@ msgstr "" "ha nincsenek információi a bementi dokumentumról." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:414 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:418 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -322,62 +472,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "A profil a SONY PRS-300-ra vonatkozik" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:449 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:453 msgid "This profile is intended for the SONY PRS-900." msgstr "A profil a SONY PRS-900-ra vonatkozik" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:479 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:483 msgid "This profile is intended for the Microsoft Reader." msgstr "Ez a profil a Microsoft Reader-hez készült" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:490 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 msgid "This profile is intended for the Mobipocket books." msgstr "Ez a Mobipocket (PRC, MOBI) könyvekhez való profil" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:503 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:507 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Ez a Hanlin V3 és klónjainak profilja" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:515 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:519 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "A profil a Hanlin V5-re és klónjaira vonatkozik" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:523 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:527 msgid "This profile is intended for the Cybook G3." msgstr "Ez a Cybook G3 profilja." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:540 msgid "This profile is intended for the Cybook Opus." msgstr "Ez a Cybook Opus profilja." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:547 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:551 msgid "This profile is intended for the Amazon Kindle." msgstr "Ez az Amazon Kindle profilja." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:584 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:589 msgid "This profile is intended for the Irex Illiad." msgstr "Az Irex Illiad-hoz tartozó profil" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:602 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Ez az IReax Digital Reader 1000 profilja." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:611 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:616 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Az IRex Digital Reader 800 profilja" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:625 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 msgid "This profile is intended for the B&N Nook." msgstr "A profil a B&N Nook-ra vonatkozik" @@ -395,25 +545,25 @@ msgstr "" "ha számítógépen, vagy többfajta eszközön olvasható dokumentumot akar " "készíteni." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:262 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Az iPad, vagy az ehhez hasonlóan 768x1024 felbontású eszközök profilja" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:431 msgid "This profile is intended for the Kobo Reader." msgstr "A Kobo Reader profilja" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:440 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "This profile is intended for the SONY PRS-300." msgstr "A profil a SONY PRS-300-ra vonatkozik" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:458 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the 5-inch JetBook." msgstr "Ez az 5-inches JetBook profilja." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:471 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -421,7 +571,7 @@ msgstr "" "Ez a SONY PRS sorozathoz (pl. 500/505/700) való profil fekvő nézetben. " "Többnyire képregényekhez használatos." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:566 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:571 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Ez az Amazon Kindle DX profilja." @@ -445,15 +595,15 @@ msgstr "Letiltott bővítmények" msgid "Enabled plugins" msgstr "Plugin-ok engedélyezése" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:93 msgid "No valid plugin found in " msgstr "Nem találtam érvényes bővítményt itt: " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:508 msgid "Initialization of plugin %s failed with traceback:" msgstr "A %s bővítmény indítása a következő hibaüzenettel meghiusult:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:541 msgid "" " %prog options\n" "\n" @@ -465,17 +615,17 @@ msgstr "" " Igazítsa Calibret saját igényeihez külső pluginok betöltésével.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:547 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "Bővítmény hozzáadása a ZIP fájl elérési útjának megadásával." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:549 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Egy telepített bővítmény eltávolítása név alapján. Nincs hatással a " "beépített bővítményekre." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:551 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -483,15 +633,15 @@ msgstr "" "Bővítmény testreszabása. Adja meg a bővítmény nevét, és a kért beállítást, " "vesszővel elválasztva." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:553 msgid "List all installed plugins" msgstr "A telepített bővítőmodulok listázása" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:555 msgid "Enable the named plugin" msgstr "A bővítmény engedélyezése" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:557 msgid "Disable the named plugin" msgstr "A bővítmény letiltása" @@ -499,7 +649,7 @@ msgstr "A bővítmény letiltása" msgid "Communicate with Android phones." msgstr "Kapcsolódás Android telefonhoz." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:50 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:52 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -507,10 +657,14 @@ msgstr "" "Vesszővel tagolt mappa-lista az e-könyveknek az olvasóra való küldéséhez. Az " "első létező mappába kerülnek a könyvek." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:94 msgid "Communicate with S60 phones." msgstr "Kapcsolódás S60 telefonokhoz" +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:85 +msgid "Apple device" +msgstr "Apple eszköz" + #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 msgid "Communicate with iTunes/iBooks." msgstr "" @@ -526,16 +680,16 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:921 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:957 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2822 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2861 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:922 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:962 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2831 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2871 msgid "%d of %d" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:369 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:962 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2867 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:967 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2877 msgid "finished" msgstr "" @@ -560,19 +714,27 @@ msgid "" "Click 'Show Details' for a list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2491 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2499 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:817 #: /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/field_metadata.py:132 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:198 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:211 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1712 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:134 msgid "News" msgstr "Hírek (RSS)" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2729 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:556 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1675 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1693 +msgid "Catalog" +msgstr "Katalógus" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2738 msgid "Communicate with iTunes." msgstr "" @@ -650,23 +812,23 @@ msgid "" "first one that exists will be used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:22 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "A Hanvon N520 eBook olvasóval kommunikál." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:47 msgid "Communicate with The Book reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:59 msgid "Communicate with the SpringDesign Alex eBook reader." msgstr "Kapcsolódás SpringDesign Alex eBook olvasóhoz" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:78 msgid "Communicate with the Azbooka" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:94 msgid "Communicate with the Elonex EB 511 eBook reader." msgstr "Az Elonex EB 511 eBook olvasóval kommunikál." @@ -712,14 +874,20 @@ msgstr "" msgid "Communicate with the Kindle DX eBook reader." msgstr "Kapcsolódás Kindle DX eBook olvasóhoz" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:22 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:23 msgid "Communicate with the Kobo Reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:53 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:56 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:47 +msgid "" +"The Kobo supports only one collection currently: the \"Im_Reading\" list. " +"Create a tag called \"Im_Reading\" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:188 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -729,33 +897,33 @@ msgstr "" msgid "Getting list of books on device..." msgstr "Az eszközön lévő könyvek listájának összeállítása..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:248 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:280 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 msgid "Removing books from device..." msgstr "Könyvek eltávolítása az eszközről" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:285 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:284 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:291 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "Könyvek eltávolítása az eszköz metaadat listáról..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:290 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:324 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:330 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "Könyvek hozzáadása az eszköz metaadat listához..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 msgid "Not Implemented" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:376 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:393 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -781,6 +949,10 @@ msgstr "" msgid "Communicate with the Pandigital Novel" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +msgid "Communicate with the GM2000" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "Kapcsolódás Nokia 770 internet tablethez" @@ -821,7 +993,7 @@ msgstr "" "Vesszővel tagolt metadaadat mezők gyűjtemények létrehozására az olvasón. " "Lehetőségek: " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:149 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "Névtelen" @@ -842,6 +1014,10 @@ msgstr "" msgid "Communicate with the iPapyrus reader." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:59 +msgid "Communicate with the Sovos reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:255 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" @@ -907,7 +1083,7 @@ msgid "Place files in sub directories if the device supports them" msgstr "Fájlok almappákba rendezése, ha eszköz ezt támogatja" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:43 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:86 msgid "Read metadata from files on device" msgstr "Metaadatok olvasása az eszközön lévő fájlokból" @@ -920,7 +1096,7 @@ msgid "Template to control how books are saved" msgstr "Sablon annak ellenőrzésére, hogyan lettek a könyvek elmentve." #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:89 msgid "Extra customization" msgstr "Kiegészítő testreszabás" @@ -1528,22 +1704,37 @@ msgstr "" "lehet, ezért óvatosan használja." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:367 +msgid "" +"Scale used to determine the length at which a line should be unwrapped if " +"preprocess is enabled. Valid values are a decimal between 0 and 1. The " +"default is 0.40, just below the median line length. This will unwrap typical " +"books with hard line breaks, but should be reduced if the line length is " +"variable." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:376 +msgid "" +"Convert plain quotes, dashes and ellipsis to their typographically correct " +"equivalents. For details, see http://daringfireball.net/projects/smartypants" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:384 msgid "Use a regular expression to try and remove the header." msgstr "Reguláris kifejezés használata a fejléc eltávolításához." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:374 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:391 msgid "The regular expression to use to remove the header." msgstr "A reguláris kifejezés a fejléc eltávolításához." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:397 msgid "Use a regular expression to try and remove the footer." msgstr "Reguláris kifejezés használata a lábléc eltávolításához." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:404 msgid "The regular expression to use to remove the footer." msgstr "A reguláris kifejezés a lábléc eltávolításához." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:394 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:411 msgid "" "Read metadata from the specified OPF file. Metadata read from this file will " "override any metadata in the source file." @@ -1551,7 +1742,7 @@ msgstr "" "Metaadatok olvasása a meghatározott OPF fájlból. Ez felülírja a forrásfájl " "összes metaadatát." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:401 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:418 msgid "" "Transliterate unicode characters to an ASCII representation. Use with care " "because this will replace unicode characters with ASCII. For instance it " @@ -1566,7 +1757,7 @@ msgstr "" "használt közös betűk) az átalakított betű a legtöbb ember által használt (ez " "esetben a kínai) megfelelője lesz." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:416 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:433 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 " @@ -1576,105 +1767,105 @@ msgid "" "instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38 msgid "Set the title." msgstr "Könyvcím megadása" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:432 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 msgid "Set the authors. Multiple authors should be separated by ampersands." msgstr "" "Adja meg a szerzőt. Több szerző esetén pontosvesszővel kell elválasztani " "azokat." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:437 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:454 msgid "The version of the title to be used for sorting. " msgstr "A rendezéshez használandó könyvcím verzió. " -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:441 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:458 msgid "String to be used when sorting by author. " msgstr "A szerző alapján történő rendezéskor használ szöveg. " -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:462 msgid "Set the cover to the specified file or URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:466 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54 msgid "Set the ebook description." msgstr "Ebook leírás megadása" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:470 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56 msgid "Set the ebook publisher." msgstr "Adja meg a kiadót." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:457 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:474 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60 msgid "Set the series this ebook belongs to." msgstr "Sorozat megadása" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:461 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:478 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62 msgid "Set the index of the book in this series." msgstr "Könyv sorszámának megadása a soroztaon belül" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:465 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:482 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64 msgid "Set the rating. Should be a number between 1 and 5." msgstr "Értékelés. 1 és 5 közötti számnak kell lennie." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:469 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:486 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66 msgid "Set the ISBN of the book." msgstr "Könyv ISBN számának megadása" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:473 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:490 #: /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 "" "Könyv cimkéinek megadása. Ez egy vesszővel elválasztott lista legyen." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:477 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:494 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:70 msgid "Set the book producer." msgstr "Könyv producer megadása" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:481 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:498 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:72 msgid "Set the language." msgstr "Nyelv megadása." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:485 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:502 msgid "Set the publication date." msgstr "Állítsd be kiadás dátumát." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:489 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:506 msgid "Set the book timestamp (used by the date column in calibre)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:589 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:606 msgid "Could not find an ebook inside the archive" msgstr "Nem találtam e-könyvet a tömörített fájlban." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:647 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:664 msgid "Values of series index and rating must be numbers. Ignoring" msgstr "" "A sorozat index és az értékelés értékei csak számok lehetnek. Kihagyásuk" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:654 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:671 msgid "Failed to parse date/time" msgstr "Nem sikerült elemezni a dátum/idő-t" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:826 msgid "Converting input to HTML..." msgstr "Konvertálás HTML formátumba..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:836 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:853 msgid "Running transforms on ebook..." msgstr "Átalakítások futtatatása a könyvön..." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:923 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:940 msgid "Creating" msgstr "Létrehozás" @@ -2095,8 +2286,8 @@ msgstr "Képregény" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:882 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "Cím" @@ -2104,8 +2295,8 @@ msgstr "Cím" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:883 msgid "Author(s)" msgstr "Szerző(k)" @@ -2124,31 +2315,33 @@ msgstr "Producer" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 #: /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:318 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1079 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1081 msgid "Comments" msgstr "Megjegyzés" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:154 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1075 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1077 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:145 msgid "Tags" msgstr "Címkék" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1084 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1086 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:93 msgid "Series" msgstr "Sorozatok" @@ -2157,11 +2350,12 @@ msgid "Language" msgstr "Nyelv" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1069 msgid "Timestamp" msgstr "Dátum" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:420 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 msgid "Published" @@ -2432,7 +2626,7 @@ msgid "" "LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1227 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 msgid "Cover" msgstr "Borító" @@ -2482,7 +2676,7 @@ msgstr "Címlap" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "Tartalomjegyzék" @@ -2546,13 +2740,19 @@ msgstr "Fő szöveg" msgid "%s format books are not supported" msgstr "A %s formátumú könyvek sajnos nem támogatottak" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:156 +msgid "Book %s of %s" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:54 msgid "HTML TOC generation options." msgstr "HTML Tartalomjegyzék generálás beállításai." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:113 -msgid "Book Jacket" -msgstr "Book Jacket" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 +msgid "Rating" +msgstr "Értékelés" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/split.py:34 msgid "" @@ -2625,12 +2825,9 @@ msgstr "Ne nyerje ki a képeket a dokumentumból" #: /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." +"Valid values are a decimal between 0 and 1. The default is 0.45, just below " +"the median line length." msgstr "" -"Az az érték, amely azt mutatja, milyen hosszúságnál legyen sortörés. Az " -"érték 0 és 1 közötti érték legyen. Az alapértelmezett érték a 0.5, vagyis " -"közepes sorhossz." #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:30 msgid "Use the new PDF conversion engine." @@ -2987,133 +3184,133 @@ msgstr "" "Mindenképpen darabolja fel a sorokat a maximális sorhossz értéknél, akkor is " "ha nincs szóköz. A minimálisnál kisebb érték is megadható" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:66 msgid "Send file to storage card instead of main memory by default" msgstr "Alapbeállításként a memóriakártyára küldje a belső memória helyett" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:68 msgid "Confirm before deleting" msgstr "Megerősítés törlés előtt" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 msgid "Main window geometry" msgstr "A főablak méretei" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 msgid "Notify when a new version is available" msgstr "Figyelmeztetés új verzió esetén." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 msgid "Use Roman numerals for series number" msgstr "Római számok használata a könyvsorozatok számozásánál" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 msgid "Sort tags list by name, popularity, or rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 msgid "Number of covers to show in the cover browsing mode" msgstr "A borító alapján történő böngészéskor a megjelenített borítók száma" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 msgid "Defaults for conversion to LRF" msgstr "Az LRF-be való konvertálás alapértelmezett értékei" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 msgid "Options for the LRF ebook viewer" msgstr "A beépített LRF olvasóprogram beállításai" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:85 msgid "Formats that are viewed using the internal viewer" msgstr "A beépített olvasóprogram által megjelenített formátumok" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 msgid "Columns to be displayed in the book list" msgstr "A könyvlistában megjelenítendő oszlopok" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Automatically launch content server on application startup" msgstr "A tartalomkiszolgáló automatikus indítása az alkalmazás indulásakor." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Oldest news kept in database" msgstr "A legrégebbi adatbázisban megtartandó hír" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Show system tray icon" msgstr "Ikon megjelenítése a tálcán" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 msgid "Upload downloaded news to device" msgstr "Letöltött hírek küldése az eszközre" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 msgid "Delete books from library after uploading to device" msgstr "Könyvek törlése az adatbázisból az eszközre való feltöltés utén" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" msgstr "A borítók megjelenítése külön ablakban a calibre főablaka helyett." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 msgid "Disable notifications from the system tray icon" msgstr "A tálcaikon ne mutassa a figyelmeztetéseket" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 msgid "Default action to perform when send to device button is clicked" msgstr "" "Az alapértelmezett művelet a 'Küldés eszközre' gombra való kattintáskor" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:120 msgid "Maximum number of waiting worker processes" msgstr "A sorban álló műveletek maximális száma" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:122 msgid "Download social metadata (tags/rating/etc.)" msgstr "Közösségi metaadatok letöltése (címkék, értékelés stb.)" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:124 msgid "Overwrite author and title with new metadata" msgstr "Irja felül a szerzőt és a címet új metaadattal." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" "A maximális párhuzamosan végrehajtandó műveletek számának korlátozása a " "processzorok számára" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 msgid "Show the average rating per item indication in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:479 msgid "Copied" msgstr "Másolva" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 msgid "Copy" msgstr "Másolás" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 msgid "Copy to Clipboard" msgstr "Másolás a vágólapra" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:462 msgid "Choose Files" msgstr "Válasszon a fájlok közül" @@ -3129,11 +3326,11 @@ msgstr "" msgid "A" msgstr "A" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "Add books from a single directory" msgstr "Könyvek hozzáadása egy mappából" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 msgid "" "Add books from directories, including sub-directories (One book per " "directory, assumes every ebook file is the same book in a different format)" @@ -3142,7 +3339,7 @@ msgstr "" "könyv, feltételezve, hogy minden egyes fájl ugyanaz a könyv különböző " "formátumokban)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 msgid "" "Add books from directories, including sub directories (Multiple books per " "directory, assumes every ebook file is a different book)" @@ -3150,112 +3347,113 @@ msgstr "" "Könyvek hozzáadása egy, vagy több mappából, almappából (mappánként több " "könyv, feltételezve, hogy minden egyes fájl egy külön könyv)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:43 msgid "Add Empty book. (Book entry with no formats)" msgstr "" "Üres könyv hozzáadása. (Formátum nélküli könyv-bejegyzés az adatbázisban)" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:45 msgid "Add from ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:85 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:201 msgid "Uploading books to device." msgstr "Könyvek feltöltése az eszközre." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:170 msgid "Books" msgstr "Könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 msgid "EPUB Books" msgstr "EPUB könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 msgid "LRF Books" msgstr "LRF könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 msgid "HTML Books" msgstr "HTML könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 msgid "LIT Books" msgstr "LIT könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "MOBI Books" msgstr "MOBI könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "Topaz books" msgstr "Topaz könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "Text books" msgstr "Text könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "PDF Books" msgstr "PDF könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "Comics" msgstr "Képregény" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 msgid "Archives" msgstr "Archívumok" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "Supported books" msgstr "Támogatott könyvek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 msgid "Failed to read metadata" msgstr "Hiba történt a metaadatok olvasása közben" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 msgid "Failed to read metadata from the following" msgstr "Nem sikerült a metaadatok olvasása a következőből:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 msgid "No book selected" msgstr "Nincs könyv kiválasztva" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 msgid "No book files found" msgstr "" @@ -3268,98 +3466,98 @@ msgid "Add books to your calibre library from the connected device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:498 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:235 -msgid "Use library only" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:236 +msgid "Use library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:237 msgid "User annotations generated from main library only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63 -#: /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/save_to_disk.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "Nincs könyv kiválasztva." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:65 msgid "No books selected to fetch annotations from" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:90 msgid "Merging user annotations into database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:118 msgid "%s
Last Page Read: %d (%d%%)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:124 msgid "%s
Last Page Read: Location %d (%d%%)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:143 msgid "Location %d • %s
%s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:152 msgid "Page %d • %s
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:157 msgid "Location %d • %s
" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:34 msgid "Create catalog of books in your calibre library" msgstr "Katalógus készítése az adatbázisban lévő könyvekről" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 msgid "No books selected to generate catalog for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:53 msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 msgid "No books found" msgstr "Nem talált könyveket." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:59 msgid "" "No books to catalog\n" "Check exclude tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 msgid "Catalog generated." msgstr "Katalógus kész." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:72 msgid "Export Catalog Directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:73 msgid "Select destination for %s.%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:111 msgid "%d books" msgstr "" @@ -3405,38 +3603,48 @@ msgstr "Már létezik" msgid "The folder %s already exists. Delete it first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:186 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:753 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184 +msgid "Rename failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:185 +msgid "" +"Failed to rename the library at %s. The most common cause for this is if one " +"of the files in the library is open in another program." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102 msgid "Are you sure?" msgstr "Biztos benne?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:196 msgid "All files from %s will be permanently deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:216 msgid "No library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:217 msgid "" "No existing calibre library was found at %s. It will be removed from the " "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:245 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:584 msgid "Not allowed" msgstr "Nem engedélyezett" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:250 msgid "You cannot change libraries when a device is connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:255 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -3448,19 +3656,19 @@ msgstr "C" msgid "Convert books" msgstr "Konvertálás" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:28 msgid "Convert individually" msgstr "Egy könyv konvertálása" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:30 msgid "Bulk convert" msgstr "Csoportos konvertálás" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 msgid "Cannot convert" msgstr "Nem lehet konvertálni" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:115 msgid "Starting conversion of %d book(s)" msgstr "%d könyv konvertálása" @@ -3472,34 +3680,34 @@ msgstr "" msgid "Copy selected books to the specified library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:115 msgid "Cannot copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 msgid "No library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 msgid "No library found at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:128 msgid "Copying" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:428 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:141 msgid "Copied %d books to %s" msgstr "" @@ -3511,84 +3719,82 @@ msgstr "Del" msgid "Remove books" msgstr "Könyv törlése" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:24 msgid "Remove selected books" msgstr "A kiválasztott könyvek törlése" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:26 msgid "Remove files of a specific format from selected books.." msgstr "Bizonyos formátumú könyvek törlése a kiválasztottakból..." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:29 msgid "Remove all formats from selected books, except..." msgstr "A kiválasztott könyvekből minden formátumú törlése, kivéve..." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:32 msgid "Remove covers from selected books" msgstr "Borítók törlése a kiválasztott könyvekből" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:35 msgid "Remove matching books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:53 msgid "Cannot delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:66 msgid "Choose formats to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:84 msgid "Choose formats not to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104 msgid "Cannot delete books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:105 msgid "No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 msgid "Main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:436 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:435 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:444 msgid "Storage Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:438 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:446 msgid "Storage Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 msgid "No books to delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:123 msgid "None of the selected books are on the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:195 msgid "Deleting books from device." msgstr "Könyvek törlése az eszközről." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:161 msgid "" "The selected books will be permanently deleted and the files removed " -"from your computer. Are you sure?" +"from your calibre library. Are you sure?" msgstr "" -"A kiválasztott könyvek véglegesen törölve lesznek a számítógépedről. " -"Biztosan törölni akarja?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:180 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -3653,123 +3859,124 @@ msgstr "E" msgid "Edit metadata" msgstr "Metaadatok szerkesztése" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:28 msgid "Merge book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:29 msgid "M" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:31 msgid "Edit metadata individually" msgstr "Metaadatok szerkesztése egyenként" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:34 msgid "Edit metadata in bulk" msgstr "Metaadatok csoportos szerkesztése" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:37 msgid "Download metadata and covers" msgstr "Metaadatok és borítók letöltése" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:40 msgid "Download only metadata" msgstr "Csak a metaadatok letöltése" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:42 msgid "Download only covers" msgstr "Csak a borítók letöltése" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:45 msgid "Download only social metadata" msgstr "Csak a közösségi metaadatok letöltése" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:51 msgid "Merge into first selected book - delete others" msgstr "" "Könyvek összefűzése az első kijelölt könyvbe - a többi törlése az összefűzés " "után" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:54 msgid "Merge into first selected book - keep others" msgstr "" "Könyvek összefűzése az első kijelölt könyvbe - a többi megtartása az " "összefűzés után" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 msgid "Cannot download metadata" msgstr "Nem lehet letölteni a metaadatokat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 msgid "social metadata" msgstr "közösségi metaadatok" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:100 msgid "covers" msgstr "borítók" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:100 msgid "metadata" msgstr "metaadatok" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:105 msgid "Downloading %s for %d book(s)" msgstr "%s letöltése %d könyvhöz" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:126 msgid "Failed to download some metadata" msgstr "Néhány metaadatot nem sikerült letölteni" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:127 msgid "Failed to download metadata for the following:" msgstr "Hiba történt a metaadatok letöltése közben a következőhöz:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:130 msgid "Failed to download metadata:" msgstr "Nem sikerült metaadatokat letölteni:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1005 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:131 +#: /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 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "Hiba" -#: /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:141 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:179 msgid "Cannot edit metadata" msgstr "Metaadat nem szerkeszthető" -#: /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:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:210 msgid "Cannot merge books" msgstr "Nem lehet a könyveket összefűzni" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211 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:215 msgid "" -"All book formats and metadata from the selected books will be added to the " -"first selected book.

The second and subsequently selected " -"books will not be deleted or changed.

Please confirm you want to " -"proceed." +"Book formats and metadata from the selected books will be added to the " +"first selected book. ISBN will not be merged.

The " +"second and subsequently selected books will not be deleted or " +"changed.

Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:227 msgid "" -"All book formats and metadata from the selected books will be merged into " -"the first selected book.

After merger the second and " -"subsequently selected books will be deleted.

All book formats " -"of the first selected book will be kept and any duplicate formats in the " -"second and subsequently selected books will be permanently deleted " -"from your computer.

Are you sure you want to proceed?" +"Book formats and metadata from the selected books will be merged into the " +"first selected book. ISBN will not be merged.

After " +"merger the second and subsequently selected books will be deleted. " +"

All book formats of the first selected book will be kept and any " +"duplicate formats in the second and subsequently selected books will be " +"permanently deleted from your computer.

Are you sure " +"you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:240 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" @@ -3851,53 +4058,53 @@ msgid "S" msgstr "S" #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:46 msgid "Save to disk" msgstr "Mentés lemezre" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:48 msgid "Save to disk in a single directory" msgstr "Mentés lemezre egy mappába" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:69 msgid "Save only %s format to disk" msgstr "Csak a(z) %s formátum mentése a lemezre" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:72 msgid "Save only %s format to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91 msgid "Cannot save to disk" msgstr "Nem lehet lemezre menteni" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:94 msgid "Choose destination directory" msgstr "Válassza ki a célkönyvtárt" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:102 msgid "" "You are trying to save files into the calibre library. This can cause " "corruption of your library. Save to disk is meant to export files from your " "calibre library elsewhere." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:136 msgid "Error while saving" msgstr "Mentési hiba" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:137 msgid "There was an error while saving." msgstr "Hiba történt mentés közben." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:143 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:145 msgid "Could not save some books" msgstr "Néhány könyvet nem sikerült menteni" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:146 msgid "Click the show details button to see which ones." msgstr "Kattintson a 'Részletek megjelenítése' gombra" @@ -3909,11 +4116,11 @@ msgstr "Könyv adatainak megjelenítése" msgid "I" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 msgid "No detailed info available" msgstr "Nincs részletes információ" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:27 msgid "No detailed information is available for books on the device." msgstr "A könyvekhez nincsenek részletes információk az eszközön." @@ -3921,66 +4128,88 @@ msgstr "A könyvekhez nincsenek részletes információk az eszközön." msgid "Similar books..." msgstr "Hasonló könyvek..." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 msgid "Alt+A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 msgid "Books by same author" msgstr "Könyvek ugyanettől a szerzőtől" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 msgid "Books in this series" msgstr "Könyvek ebből a sorozatból" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 msgid "Alt+Shift+S" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Alt+P" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Books by this publisher" msgstr "Könyvek ennek a kiadónak a gondozásában" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:28 msgid "Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:28 msgid "Books with the same tags" msgstr "Könyvek ugyanilyen cimkékkel" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54 +msgid "Tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 +msgid "Make small changes to ePub format books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 +msgid "T" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 +msgid "Cannot tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 +msgid "No ePub available. First convert the book to ePub." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" msgstr "V" #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 msgid "View" msgstr "Olvasás" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:33 msgid "View specific format" msgstr "Meghatározott formátum olvasása" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 msgid "Cannot view" msgstr "Nem lehet a könyvet olvasni" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 msgid "Choose the format to view" msgstr "Válassza ki a kívánt formátumot olvasásra" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 msgid "Multiple Books Selected" msgstr "Több könyv is ki van választva" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:110 msgid "" "You are attempting to open %d books. Opening too many books at once can be " "slow and have a negative effect on the responsiveness of your computer. Once " @@ -3991,11 +4220,11 @@ msgstr "" "lelassíthatja a gépedet. Ha a művelet elindult, már nem lehet leállítani. " "Biztosan folytatja?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "Cannot open folder" msgstr "A mappát nem lehet megnyitni" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:157 msgid "%s has no available formats." msgstr "Nincs elérhető formátum a következőhöz: %s" @@ -4076,7 +4305,7 @@ 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 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:70 msgid "Choose root folder" msgstr "" @@ -4093,7 +4322,7 @@ 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/add_wizard/welcome_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:49 @@ -4109,15 +4338,15 @@ msgstr "" msgid "This may take a few minutes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 msgid "Choose the location to add books from" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 msgid "Select a folder on your hard disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65 msgid "" "

calibre can scan your computer for existing books automatically. These " "books will then be copied into the calibre library. This wizard will " @@ -4129,83 +4358,81 @@ msgid "" "not under the root folder you choose.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 msgid "&Root folder:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:69 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:53 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:648 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:649 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:702 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:103 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 -#: /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/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:269 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:156 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:157 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:191 msgid "..." msgstr "..." -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:72 msgid "Handle multiple files per book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:73 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 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:74 msgid "" "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" @@ -4219,8 +4446,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1065 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 msgid "Path" msgstr "Elérési út" @@ -4230,15 +4457,15 @@ msgstr "Elérési út" #: /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:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:102 msgid "Formats" msgstr "Formátumok" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:891 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1068 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1070 msgid "Collections" msgstr "" @@ -4248,15 +4475,15 @@ msgid "Click to open" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1074 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1080 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:293 msgid "None" msgstr "Nincs" @@ -4303,16 +4530,16 @@ msgstr "kimenet" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:81 #: /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_epub_mobi_ui.py:76 #: /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/debug_ui.py:54 #: /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:31 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:122 #: /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/metadata_ui.py:171 #: /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 @@ -4320,20 +4547,30 @@ msgstr "kimenet" #: /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:60 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 #: /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:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:55 #: /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:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 #: /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/filename_pattern_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 msgid "Form" msgstr "Űrlap" @@ -4414,30 +4651,23 @@ msgstr "CSV/XML Opciók" msgid "E-book options" msgstr "E-könyv opciók" -#: /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 -msgid "Catalog" -msgstr "Katalógus" - -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77 msgid "'Don't include this book' tag:" msgstr "\"Ne vegye hozzá ezt a könyvet\" cimke:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78 msgid "'Mark this book as read' tag:" msgstr "\"Jelölje ezt könyvet: elolvasva\" cimke:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:79 msgid "Additional note tag prefix:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:80 msgid "Regex pattern describing tags to exclude as genres:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:81 msgid "" "Regex tips:\n" "- The default regex - \\[.+\\] - excludes genre tags of the form [tag], " @@ -4446,18 +4676,22 @@ msgid "" "Genre Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:84 msgid "Include 'Titles' Section" msgstr "Tartalmazza a \"Címek\" részt" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 msgid "Include 'Recently Added' Section" msgstr "Tartalmazza a \"Legújabbak\" részt" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Sort numbers as text" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 +msgid "Include 'Series' Section" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28 msgid "Tab template for catalog.ui" msgstr "" @@ -4472,11 +4706,11 @@ msgstr "" "meghatározni, használja az előző konverzióban elmentett értékeket (ha " "léteznek) a Beállításokban meghatározott alapértékek helyett" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 msgid "Bulk Convert" msgstr "Csoportos konvertálás" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Az adott kimeneti formátumnak megfelelő beállítások" @@ -4494,52 +4728,52 @@ msgid "input" msgstr "bemenet" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99 msgid "&Number of Colors:" msgstr "&Színek száma:" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101 msgid "Disable &normalize" msgstr "Normalizálás tiltása" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102 msgid "Keep &aspect ratio" msgstr "Az oldal&arány megtartása" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103 msgid "Disable &Sharpening" msgstr "Képélesítés letiltása" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:109 msgid "Disable &Trimming" msgstr "Lapvágás tiltása" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:108 msgid "&Wide" msgstr "Méretnövelés fekvő nézethez" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104 msgid "&Landscape" msgstr "Fekvő nézetű képek megtartása" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:106 msgid "&Right to left" msgstr "Jobbról balra" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:105 msgid "Don't so&rt" msgstr "Ne rendezze sorba" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:107 msgid "De&speckle" msgstr "Szemcseszűrés" @@ -4548,7 +4782,7 @@ msgid "&Disable comic processing" msgstr "Képregény átalakító műveletek tiltása" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:120 msgid "&Output format:" msgstr "Kimeneti formátum" @@ -4565,7 +4799,7 @@ msgid "Debug the conversion process." msgstr "Hibakeresés kovertáláskor" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:56 msgid "Choose debug folder" msgstr "Hibaüzenetek mappája" @@ -4577,7 +4811,7 @@ msgstr "Érvénytelen hibakereső mappa" msgid "Failed to create debug directory" msgstr "A hibakereső mappát nem sikerült létrehozni" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:55 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 " @@ -4589,7 +4823,7 @@ msgstr "" "megértéséhez és a különböző adatok helyes beállításához, mint például " "Tartalomjegyzék vagy Fejezet felismerés." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:59 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 " @@ -4649,11 +4883,11 @@ msgstr "Kezdő Tartalomjegyzék" msgid "Sectionize Chapters (Use with care!)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104 msgid "Font rescaling wizard" msgstr "Betű-átméretezés varázsló" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:105 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 " @@ -4669,25 +4903,25 @@ msgid "" "for a discussion of how font size rescaling works.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 msgid "&Output document" msgstr "&Kimeneti állomány" -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 msgid "&Base font size:" msgstr "" -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 msgid "Font size &key:" msgstr "Betűméret kulcs:" -#: /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/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 #: /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 @@ -4698,23 +4932,23 @@ msgstr "Betűméret kulcs:" msgid " pt" msgstr " pt" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:112 msgid "Use &default values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 msgid "&Input document" msgstr "&Bemeneti állomány" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:116 msgid "&Font size: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:118 msgid " will map to size: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:119 msgid "0.0 pt" msgstr "0.0 pt" @@ -4738,35 +4972,35 @@ msgstr "Balra igazított" msgid "Justify text" msgstr "Sorkizárt" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:123 msgid "&Disable font size rescaling" msgstr "Betűméret változtatás tiltása" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 msgid "Base &font size:" msgstr "Alap betű méret:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 msgid "Wizard to help you choose an appropriate font size key" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 msgid "Line &height:" msgstr "Sorok közötti távolság:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 msgid "Input character &encoding:" msgstr "B&emeneti karakter kódolás:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 msgid "Remove &spacing between paragraphs" msgstr "Bekezdések közötti térköz eltávolítása" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 msgid "Indent size:" msgstr "Behúzás nagysága:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 msgid "" "

When calibre removes inter paragraph spacing, it automatically sets a " "paragraph indent, to ensure that paragraphs can be easily distinguished. " @@ -4776,34 +5010,38 @@ msgstr "" "beállítja a bekezdés behúzását azok könnyebb olvashatósága érdekében. Ez a " "beállítás határozza meg a behúzás nagyságát." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 msgid " em" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 msgid "Text justification:" msgstr "Szöveg igazítás:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 msgid "&Linearize tables" msgstr "Táblázatok szöveggé alakítása" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 msgid "Extra &CSS" msgstr "Extra CSS" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 msgid "&Transliterate unicode characters to ASCII" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 msgid "Insert &blank line" msgstr "Üres sor beszúrása" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:141 msgid "Keep &ligatures" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:142 +msgid "Smarten &punctuation" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19 msgid "LRF Output" msgstr "LRF kimenet" @@ -4858,7 +5096,7 @@ msgstr "Monospace('rögzített szélességű') betűkészlet" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "Metaadatok" @@ -4871,75 +5109,75 @@ msgstr "" "ezekből." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 msgid "Choose cover for " msgstr "Borító választása a következőhöz: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "Cannot read" msgstr "Olvasási hiba" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 msgid "You do not have permission to read the file: " msgstr "Nincs megfelelő jogosultsága a következő fájl olvasásához: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Error reading file" msgstr "Fájl olvasási hiba" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 msgid "

There was an error reading from file:
" msgstr "

Hiba történt a következő fájl olvasása közben:
" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 msgid " is not a valid picture" msgstr " nem érvényes képformátum." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "Book Cover" msgstr "Könyvborító" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 msgid "Use cover from &source file" msgstr "A forrásfájlban tárolt borító használata" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 msgid "Change &cover image:" msgstr "Borító kép cseréje:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 msgid "Browse for an image to use as the cover of this book." msgstr "Képfájl kiválasztása és beállítása borítóként." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "&Title: " msgstr "&Cím: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "Change the title of this book" msgstr "Könyv címének megadása" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /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:365 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 msgid "&Author(s): " msgstr "Szerző(k) " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 msgid "Author So&rt:" msgstr "Rendezési forma:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" @@ -4947,20 +5185,20 @@ msgstr "" "A könyv szerzőjének megváltoztatása. Több szerző esetén vesszővel kell " "azokat elválasztani" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid "&Publisher: " msgstr "&Kiadó: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "Ta&gs: " msgstr "Címkék: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

They can be any words or phrases, separated by commas." @@ -4968,23 +5206,23 @@ msgstr "" "A könyv címkéi. Nagyon hasznos keresésnél.

Lehet szó vagy kifejezés " "vesszővel elválasztva." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 msgid "&Series:" msgstr "&Sorozat:" -#: /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:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 msgid "List of known series. You can add new series." msgstr "Ismert sotozatok listája. Hozzáadhat újakat is." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Book " msgstr "Könyv " @@ -4992,7 +5230,7 @@ msgstr "Könyv " msgid "MOBI Output" msgstr "MOBI kimenet" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:43 msgid "Default" msgstr "Alapértelmezett" @@ -5143,7 +5381,7 @@ msgid "Regex:" msgstr "Reguláris kifejezés:" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122 msgid "Test" msgstr "Teszt" @@ -5155,18 +5393,18 @@ msgstr "Konvertálás" msgid "Options specific to the input format." msgstr "A bemeneti formátumnak megfelelő beállítások" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:112 -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:53 msgid "Dialog" msgstr "Párbeszédablak" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:118 msgid "&Input format:" msgstr "Bemeneti formátum:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:119 msgid "Use &saved conversion settings for individual books" msgstr "" @@ -5183,67 +5421,71 @@ msgid "" "Fine tune the detection of chapter headings and other document structure." msgstr "Fejezetek és más dokumentum elemek felismerésének finomhangolása" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:37 msgid "Detect chapters at (XPath expression):" msgstr "Fejezetek felismerése (XPath kifejezés):" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:38 msgid "Insert page breaks before (XPath expression):" msgstr "Oldaltörés beszúrása a következő elé (XPath kifejezés):" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:40 msgid "Header regular expression:" msgstr "Fejléc reguláris kifejezés:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:43 msgid "Footer regular expression:" msgstr "Lábléc reguláris kifejezés:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87 msgid "Invalid regular expression" msgstr "Érvénytelen reguláris kifejezés" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 msgid "Invalid regular expression: %s" msgstr "Érvénytelen reguláris kifejezés: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:39 msgid "Invalid XPath" msgstr "Érvénytelen XPath kifejezés" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:40 msgid "The XPath expression %s is invalid." msgstr "A következő XPath kifejezés érvénytelen: %s." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:81 msgid "Chapter &mark:" msgstr "Fejezet jelölő:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:82 msgid "Remove first &image" msgstr "Első kép eltávolítása" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:83 msgid "Insert &metadata as page at start of book" msgstr "Metaadatok beszúrása a könyv elejére külön oldalként" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:64 -msgid "&Preprocess input file to possibly improve structure detection" -msgstr "" -"A bementi fájl előfeldolgozása az esetlegesen jobb struktúra felismeréshez" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:84 msgid "Remove F&ooter" msgstr "Lábléc eltávolítása" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:85 msgid "Remove H&eader" msgstr "Fejléc eltávolítása" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:86 +msgid "Line &un-wrap factor during preprocess:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:87 +msgid "&Preprocess input file to possibly improve structure detection" +msgstr "" +"A bementi fájl előfeldolgozása az esetlegesen jobb struktúra felismeréshez" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:16 msgid "" "Table of\n" @@ -5329,18 +5571,18 @@ msgstr "&Maximális sorhossz:" msgid "Force maximum line length" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:51 -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:55 msgid "TextLabel" msgstr "TextLabel" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:57 msgid "Use a wizard to help construct the XPath expression" msgstr "Varázsló használata az XPath kifejezés létrehozásához" @@ -5441,16 +5683,12 @@ msgid "Undefined" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /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 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:241 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:119 msgid "Yes" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /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 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:243 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:121 msgid "No" @@ -5473,7 +5711,7 @@ msgid " index:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:257 msgid "Automatically number books in this series" msgstr "" @@ -5489,97 +5727,97 @@ msgstr "" msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:48 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:136 msgid "No details available." msgstr "Részletek nem elérhetőek." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:165 msgid "Device no longer connected." msgstr "Az eszköz már nem csatlakozik." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:283 msgid "Get device information" msgstr "Eszköz-információk lekérdezése" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:294 msgid "Get list of books on device" msgstr "Az eszközön lévő könyvek listájának letöltése" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:304 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:313 msgid "Send metadata to device" msgstr "Metaadatok küldése az eszközre" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:318 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:342 msgid "Upload %d books to device" msgstr "%d könyv feltöltése az eszközre" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:357 msgid "Delete books from device" msgstr "Könyvek törlése az eszközről" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Download books from device" msgstr "Könyvek letöltése az eszközről" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:384 msgid "View book on device" msgstr "Könyv megnyitása ez eszközön" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:418 msgid "Set default send to device action" msgstr "Alapértelmezett eszközre küldési művelet beállítása" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:424 msgid "Send to main memory" msgstr "Küldés a belső memóriába" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:426 msgid "Send to storage card A" msgstr "Küldés az 'A' memóriakártyára" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:428 msgid "Send to storage card B" msgstr "Küldés a 'B' memóriakártyára" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:442 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:453 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:490 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:608 msgid "Error communicating with device" msgstr "Hiba az eszközkapcsolatban" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:629 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:676 msgid "Error talking to device" msgstr "Hiba a kapcsolatban" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:677 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -5587,11 +5825,11 @@ msgstr "" "Hiba az eszközkapcsolatban. Válassza le majd csatlakoztassa újra az eszközt " "és/vagy indítssa újra az eszközt, esetleg a programot." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 msgid "Device: " msgstr "Eszköz: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:722 msgid " detected." msgstr " felismerve" @@ -5630,7 +5868,7 @@ msgid "Attached, you will find the e-book" msgstr "Az ebook csatolva" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "" @@ -5644,10 +5882,10 @@ msgstr "Email küldése:" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1025 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1087 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1206 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1214 msgid "No suitable formats" msgstr "Nincs megfelelő formátum" @@ -5676,39 +5914,39 @@ msgstr "Hiba a következő könyvek email-ben való elküldése közben:" msgid "Sent by email:" msgstr "Emailbe elküldve:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:984 msgid "News:" msgstr "Hírek:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:996 msgid "Sent news to" msgstr "Hírek elküldve:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1027 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Az eszközre való feltöltés előtt automatikusan konvertáljam a kijelölt " "könyveket?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1057 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1056 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending news to device." msgstr "Hírek küldése az eszközre" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1173 msgid "Sending books to device." msgstr "Könyvek küldése az eszközre." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1216 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 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." @@ -5717,38 +5955,38 @@ msgstr "" "formátumú változatuk. Konvertálja át a nem megfelelőeket valamelyik, az " "eszközöd által támogatott formátumra." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1277 msgid "No space on device" msgstr "Nincs elég hely az eszközön" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" "

Nem lehet feltölteni könyveket az eszközre, nincs elég szabad hely " -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 msgid "Select available formats and their order for this device" msgstr "" "Válassza ki az elérhető formátumokat és azok sorrendjét ehhez az eszközhöz" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:87 msgid "Use sub directories" msgstr "Almappák használata" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:88 msgid "Use author sort for author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:90 msgid "Save &template:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:48 msgid "Add books by ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:49 msgid "" "

Enter a list of ISBNs in the box to the left, one per line. calibre will " "automatically create entries for books based on the ISBN and download " @@ -5756,19 +5994,19 @@ msgid "" "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 msgid "&Paste from clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 msgid "Fit &cover within view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 msgid "&Previous" msgstr "&Előző" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 msgid "&Next" msgstr "&Következő" @@ -5777,7 +6015,7 @@ msgid "My Books" msgstr "Könyveim" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:301 msgid "Generate catalog" msgstr "" @@ -5802,7 +6040,7 @@ msgstr "Katalógus automatiku&s küldése az eszközre" msgid "Catalog options" msgstr "Katalógus beállításai" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:45 msgid "Choose Format" msgstr "Formátum kiválasztása" @@ -5850,27 +6088,27 @@ msgstr "" msgid "%s is not an existing folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 msgid "Choose your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 msgid "Your calibre library is currently located at {0}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:73 msgid "New &Location:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:74 msgid "Use &existing library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:75 msgid "&Create an empty library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:76 msgid "&Move current library to new location" msgstr "" @@ -5882,15 +6120,15 @@ msgstr "Képregények (CBR/CBZ fájlok) alapértelmezett beállításai" msgid "Set options for converting %s" msgstr "A %s konvertálásának beállításai" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 msgid "&Title:" msgstr "&Cím:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98 msgid "&Author(s):" msgstr "Szerző(k)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100 msgid "&Profile:" msgstr "&Profil:" @@ -5898,1153 +6136,11 @@ msgstr "&Profil:" msgid "Edit Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173 -msgid "%(plugin_type)s %(plugins)s" -msgstr "%(plugin_type)s %(plugins)s" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 -msgid "plugins" -msgstr "pluginok" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183 -msgid "" -"\n" -"Customization: " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 -msgid "General" -msgstr "Általános" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 -msgid "Conversion" -msgstr "Konvertálás" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201 -msgid "" -"Email\n" -"Delivery" -msgstr "" -"Küldés\n" -"emailben" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 -msgid "Add/Save" -msgstr "Hozzáadás/Mentés" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:203 -msgid "Advanced" -msgstr "Haladó" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:204 -msgid "" -"Content\n" -"Server" -msgstr "" -"Tartalom\n" -"kiszolgáló" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:205 -msgid "Plugins" -msgstr "Plugin-ok" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 -msgid "Auto send" -msgstr "Auto küld" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 -msgid "Email" -msgstr "Email" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:234 -msgid "Formats to email. The first matching format will be sent." -msgstr "" -"Emailben elkündendő formátum. Az első létező formátum kerül elküldésre." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:235 -msgid "" -"If checked, downloaded news will be automatically mailed
to this email " -"address (provided it is in one of the listed formats)." -msgstr "" -"Ha be van jelölve, akkor a letöltött hírek automatikusan
el lesznek " -"küldve emailben erre a címre (ha létezik a 'Formátumok' oszlopban beírtaknak " -"megfelelő)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:309 -msgid "new email address" -msgstr "új email cím" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 -msgid "Wide" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:493 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 -msgid "Narrow" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 -msgid "Medium" -msgstr "Közepes" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 -msgid "Small" -msgstr "Kicsi" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:510 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 -msgid "Large" -msgstr "Nagy" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 -msgid "Always" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 -msgid "Automatic" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:517 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 -msgid "Never" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:530 -msgid "Toolbars/Context menus" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:544 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:156 -msgid "Done" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:545 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:157 -msgid "Confirmation dialogs have all been reset" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:550 -msgid "System port selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:551 -msgid "" -"The value %d you have chosen for the content server port is a system " -"port. Your operating system may not allow the server to run on this " -"port. To be safe choose a port number larger than 1024." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:571 -msgid "Failed to install command line tools." -msgstr "A parancssori eszközök telepítése nem sikerült." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:574 -msgid "Command line tools installed" -msgstr "Parancssori eszközök installálva" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:575 -msgid "Command line tools installed in" -msgstr "Parancssori eszközök installálva:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:576 -msgid "" -"If you move calibre.app, you have to re-install the command line tools." -msgstr "" -"Ha áthelyezi a calibre.app-ot, akkor a parancssori eszközöket újra kell " -"installálnia." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 -msgid "No valid plugin path" -msgstr "Nincs érvényes plugin elérési útvonal" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:628 -msgid "%s is not a valid plugin path" -msgstr "Nem érvényes plugin elérési út: %s" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:631 -msgid "Choose plugin" -msgstr "Plugin kiválasztása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:643 -msgid "Plugin cannot be disabled" -msgstr "Ezt a plugint nem lehet letiltani" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:644 -msgid "The plugin: %s cannot be disabled" -msgstr "A következő plugint nem lehet letiltani: %s" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 -msgid "Plugin not customizable" -msgstr "A pluginnak nincsenek beállításai" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:654 -msgid "Plugin: %s does not need customization" -msgstr "A %s pluginnak nincsenek beállításai" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:662 -msgid "Customize" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:700 -msgid "Cannot remove builtin plugin" -msgstr "A beépített pluginok nem távolíthatóak el" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:701 -msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." -msgstr " nem törölhető. Ez egy beépített plugin. Tiltsd le inkább." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:716 -msgid "Invalid tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:717 -msgid "" -"The tweaks you entered are invalid, try resetting the tweaks to default and " -"changing them one by one until you find the invalid setting." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:747 -msgid "You must select a column to delete it" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:752 -msgid "The selected column is not a custom column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:754 -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:821 -msgid "Error log:" -msgstr "Hibanapló:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:828 -msgid "Access log:" -msgstr "Hozzáférési naplófájl:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:856 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 -msgid "Failed to start content server" -msgstr "A tartalomkiszolgáló indítása nem sikerült" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:881 -msgid "Invalid size" -msgstr "Érvénytelen méret" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:882 -msgid "The size %s is invalid. must be of the form widthxheight" -msgstr "" -"A következő méret érvénytelen: %s. A méretnek szélességxmagasság formátumban " -"kell lennie." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:951 -msgid "Must restart" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:952 -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:986 -msgid "Checking database integrity" -msgstr "Adatbázis ellenőrzése" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1006 -msgid "Failed to check database integrity" -msgstr "Az adatbázis ellenőrzése nem sikerült" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1011 -msgid "Some inconsistencies found" -msgstr "Néhány hibát találtam" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1012 -msgid "" -"The following books had formats listed in the database that are not actually " -"available. The entries for the formats have been removed. You should check " -"them manually. This can happen if you manipulate the files in the library " -"folder directly." -msgstr "" -"A következő könyveknek van olyan formátuma az adatbázisban, amelyek " -"valójában nem léteznek. Le kell ellenőrznie manuálisan. Ez akkor fordulhat " -"elő, ha közvetlenül törölte a fájlrendszerből ezeket." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 -msgid "TabWidget" -msgstr "TabWidget" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 -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 "" -"Itt azt tudja beállítani, hogy a calibre hogyan olvassa ki a metaadatokat a " -"fájlokból. A calibre a fájlból, és a fájlnévből is tud metaadatokat olvasni." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 -msgid "Read metadata only from &file name" -msgstr "Metaadatok olvasása csak a fájlnévből" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 -msgid "" -"Swap the firstname and lastname of the author. This affects only metadata " -"read from file names." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 -msgid "&Swap author firstname and lastname" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 -msgid "" -"If an existing book with a similar title and author is found that does not " -"have the format being added, the format is added\n" -"to the existing book, instead of creating a new entry. If the existing book " -"already has the format, then it is silently ignored.\n" -"\n" -"Title match ignores leading indefinite articles (\"the\", \"a\", \"an\"), " -"punctuation, case, etc. Author match is exact." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:142 -msgid "" -"If books with similar titles and authors found, &merge the new files " -"automatically" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:143 -msgid "&Configure metadata from file name" -msgstr "Beállítások a metaadatok kiolvasására a fáljnévből" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:144 -msgid "&Adding books" -msgstr "Könyvek hozzáadása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:145 -msgid "" -"Here you can control how calibre will save your books when you click the " -"Save to Disk button:" -msgstr "" -"Itt azt tudja beállítani, hogy mit csináljon a calibre, amikor a 'Mentés " -"lemezre' gombra kattint:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:146 -msgid "Save &cover separately" -msgstr "Borító mentése külön fájlba" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:147 -msgid "Update &metadata in saved copies" -msgstr "Metaadatok frissítése a mentett másolatokban" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:148 -msgid "Save metadata in &OPF file" -msgstr "Metaadatok mentése &OPF fájlba" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:149 -msgid "Convert non-English characters to &English equivalents" -msgstr "Nem angol karakterek konvertálása angol karakterekké" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:150 -msgid "Format &dates as:" -msgstr "Dátumok formátuma:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:151 -msgid "File &formats to save:" -msgstr "Mentendő könyvformátumok:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:152 -msgid "Replace space with &underscores" -msgstr "Szóköz cseréje alsóvonallal" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:153 -msgid "Change paths to &lowercase" -msgstr "Elérési út kisbetűssé alakítása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:154 -msgid "&Saving books" -msgstr "Könyvek mentése" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:155 -msgid "Metadata &management:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:156 -msgid "Manual management" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:157 -msgid "Only on send" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:158 -msgid "Automatic management" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:159 -msgid "" -"

  • Manual Management: Calibre updates the metadata and adds " -"collections only when a book is sent. With this option, calibre will never " -"remove a collection.
  • \n" -"
  • Only on send: Calibre updates metadata and adds/removes " -"collections for a book only when it is sent to the device.
  • \n" -"
  • Automatic management: Calibre automatically keeps metadata on the " -"device in sync with the calibre library, on every connect
  • " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:162 -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/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:163 -msgid "Sending to &device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 -msgid "Show notification when &new version is available" -msgstr "Figyelmeztetés, ha az új verzió elérhető" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:138 -msgid "Download &social metadata (tags/ratings/etc.) by default" -msgstr "" -"Közösségi metaadatok letöltése (címkék, értékelés stb.) alapértelmezettként" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:137 -msgid "&Overwrite author and title by default when fetching metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:142 -msgid "Default network &timeout:" -msgstr "Alapértelmezett hálózati időtúllépés:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:143 -msgid "" -"Set the default timeout for network fetches (i.e. anytime we go out to the " -"internet to get information)" -msgstr "" -"Alapértelmezett hálózati időtúllépés a letöltéshez (bármilyen internetet " -"igénylő művelethez)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:144 -msgid " seconds" -msgstr " másodperc" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:100 -msgid "Choose &language (requires restart):" -msgstr "Nyelv kiválasztása (újraindítás szükséges):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:145 -msgid "Normal" -msgstr "Normál" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:146 -msgid "High" -msgstr "Magas" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:147 -msgid "Low" -msgstr "Alacsony" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:148 -msgid "Job &priority:" -msgstr "Műveletek prioritása:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:149 -msgid "Preferred &output format:" -msgstr "Kimeneti formátum:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:153 -msgid "Tags to apply when adding a book:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:152 -msgid "" -"A comma-separated list of tags that will be applied to books added to the " -"library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:154 -msgid "Reset all disabled &confirmation dialogs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:155 -msgid "Preferred &input format order:" -msgstr "Bemeneti formátumok preferált sorrendje:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:98 -msgid "User Interface &layout (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:99 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "" -"Megjelenített borítók száma böngészéskor (borító böngészés üzemmódban, " -"újraindítást igényel)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:150 -msgid "Restriction to apply when the current library is opened:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:151 -msgid "" -"Apply this restriction on calibre startup if the current library is being " -"used. Also applied when switching to this library. Note that this setting is " -"per library. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:102 -msgid "Disable all animations. Useful if you have a slow/old computer." -msgstr "Minden animáció letiltása. Hasznos funkció lassú/régi gépek esetén." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:103 -msgid "Disable &animations" -msgstr "Animációk tiltása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 -msgid "&Toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 -msgid "&Icon size:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 -msgid "Show &text under icons:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 -msgid "&Delete news from library when it is automatically sent to reader" -msgstr "Hírek törlése az adatbázisból automatikus eszközre küldés után" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 -msgid "Select visible &columns in library view" -msgstr "Látható oszlopok kiválasztása az adatbázis nézetben" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:79 -msgid "Remove a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 -msgid "Add a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 -msgid "Edit settings of a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:650 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:158 -msgid "Use internal &viewer for:" -msgstr "A beépített nézőke használata a következőkhöz:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:651 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 -msgid "Search as you type" -msgstr "Keresés gépelés közben" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:652 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 -msgid "Use &Roman numerals for series" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:104 -msgid "Enable system &tray icon (needs restart)" -msgstr "Ikon megjelenítése a tálcán (újraindítás szükséges)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:101 -msgid "Show &average ratings in the tags browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "Letöltött hírek automatikus küldése a csatlakoztatott eszközre" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 -msgid "Show &splash screen at startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 -msgid "Show cover &browser in a separate window (needs restart)" -msgstr "" -"A borító alapján történő keresés külön ablakba (újraindítás szükséges)" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 -msgid "Show ¬ifications in system tray" -msgstr "Figyelmeztetések megjelenítése a tálcaikonon" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 -msgid "&Miscellaneous" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:660 -msgid "Add an email address to which to send books" -msgstr "Email cím hozzáadása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:661 -msgid "&Add email" -msgstr "Email hozzáadása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 -msgid "Make &default" -msgstr "Legyen alapértelmezett" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:663 -msgid "&Remove email" -msgstr "Email eltávolítása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:664 -msgid "" -"calibre can send your books to you (or your reader) by email. Emails will be " -"automatically sent for downloaded news to all email addresses that have Auto-" -"send checked." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:665 -msgid "&Maximum number of waiting worker processes (needs restart):" -msgstr "A sorban álló &műveletek maximális száma (újraindítás szükséges):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:666 -msgid "Limit the max. simultaneous jobs to the available CPU &cores" -msgstr "" -"A maximális párhuzamosan végrehajtandó műveletek számának korlátozása a " -"processzor magok számára" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:667 -msgid "Debug &device detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 -msgid "&Check database integrity" -msgstr "Adatbázis ellenőrzése" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 -msgid "Open calibre &configuration directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 -msgid "&Install command line tools" -msgstr "Parancssori eszközök installálása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 -msgid "" -"Values for the tweaks are shown below. Edit them to change the behavior of " -"calibre" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 -msgid "All available tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 -msgid "&Current tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 -msgid "&Restore to defaults" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 -msgid "&Tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 -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 "" -"A calibre tartalmaz egy beépített hálózati szervert, mely segítségével " -"bárhonnan elérhető lesz gyűjteménye. A beállítások változtatása csak a " -"szerver újraindítása után lép életbe." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 -msgid "Server &port:" -msgstr "Szerver port:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 -#: /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 "&Felhasználónév:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 -#: /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 "&Jelszó:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 -msgid "" -"If you leave the password blank, anyone will be able to access your book " -"collection using the web interface." -msgstr "Ha nem ad meg jelszót, akkor bárki hozzáférhet az adatbázisához." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 -msgid "" -"The maximum size (widthxheight) for displayed covers. Larger covers are " -"resized. " -msgstr "" -"A megjelenített borító maximális mérete (szélességxmagasság). Nagyobb méretű " -"borítók át lesznek méretezve. " - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:683 -msgid "Max. &cover size:" -msgstr "Max. borító méret:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 -#: /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 "Jelszó mutatása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 -msgid "Max. &OPDS items per query:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:686 -msgid "Max. OPDS &ungrouped items:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 -msgid "Restriction (saved search) to apply:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 -msgid "" -"This restriction (based on a saved search) will restrict the books the " -"content server makes available to those matching the search. This setting is " -"per library (i.e. you can have a different restriction per library)." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 -msgid "&Start Server" -msgstr "Szerver indítása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 -msgid "St&op Server" -msgstr "Szerver leállítása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 -msgid "&Test Server" -msgstr "Szerver teszt" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:692 -msgid "Run server &automatically on startup" -msgstr "Szerver automatikus indítása a program indulásakor" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:693 -msgid "View &server logs" -msgstr "Szerverüzenetek megtekintése" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:694 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 -msgid "" -"

    Remember to leave calibre running as the server only runs as long as " -"calibre is running.\n" -"

    Stanza should see your calibre collection automatically. If not, try " -"adding the URL http://myhostname:8080 as a new catalog in the Stanza reader " -"on your iPhone. Here myhostname should be the fully qualified hostname or " -"the IP address of the computer calibre is running on." -msgstr "" -"

    Ne feledje, hogy a szerver csak akkor fut, ha a calibre is fut.\n" -"

    Elméletileg a Stanza automatikusan látni fogja adatbázisát. Ha mégsem, " -"akkor adja a 'http://myhostname:8080' URL-t új katalógusként az iPhone " -"Stanza olvasóprogramjában. A 'myhostname' helyére a calibre-t futtató " -"számítógép teljes neve, vagy IP címe kerüljön." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:696 -msgid "" -"Here you can customize the behavior of Calibre by controlling what plugins " -"it uses." -msgstr "" -"Itt beállíthatja a calibre működését, azzal, hogy milyen pluginokat " -"használjon." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:697 -msgid "Enable/&Disable plugin" -msgstr "Plugin engedélyezése/tiltása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:698 -msgid "&Customize plugin" -msgstr "Plugin testreszabása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:699 -msgid "&Remove plugin" -msgstr "Plugin eltávolítása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:700 -msgid "Add new plugin" -msgstr "Új plugin hozzáadása" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:701 -msgid "Plugin &file:" -msgstr "Plugin &fájl:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:703 -msgid "&Add" -msgstr "&Hozzáadás" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:125 -msgid "Create Tag-based Column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:126 -msgid "Lookup name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:127 -msgid "Column heading" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:128 -msgid "Column type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:129 -msgid "Use brackets" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:130 -msgid "Values can be edited" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:135 -msgid "Text" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:136 -msgid "Number" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 -msgid "Date" -msgstr "Dátum" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:138 -msgid "Tag on book" -msgstr "" - -#: /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/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:140 -msgid "Create and edit tag-based columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:19 -msgid "Text, column shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:22 -msgid "Comma separated text, like tags, shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:25 -msgid "Long text, like comments, not shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:28 -msgid "Text column for keeping series-like information" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:33 -msgid "Floating point numbers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:35 -msgid "Integers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:37 -msgid "Ratings, shown with stars" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:40 -msgid "Yes/No" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 -msgid "No column selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:70 -msgid "No column has been selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:74 -msgid "Selected column is not a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:105 -msgid "No lookup name was provided" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:107 -msgid "" -"The lookup name must contain only lower case letters, digits and " -"underscores, and start with a letter" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:109 -msgid "" -"Lookup names cannot end with _index, because these names are reserved for " -"the index of a series column." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:118 -msgid "No column heading was provided" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:124 -msgid "The lookup name %s is already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:134 -msgid "The heading %s is already used" -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/calibre/src/calibre/gui2/dialogs/config/device_debug.py:22 -msgid "Copy to &clipboard" -msgstr "Másolás a vágólapra" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:24 -msgid "Debug device detection" -msgstr "Eszközkapcsolódás ellenőrzése" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:44 -msgid "Invalid template" -msgstr "Érvénytelen minta" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:45 -msgid "The template %s is invalid:" -msgstr "A következő minta érvénytelen: %s" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:42 -msgid "Save &template" -msgstr "Minta mentése:" - -#: /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 " -"indicate sub-folders. Available metadata variables are described below. If a " -"particular book does not have some metadata, the variable will be replaced " -"by the empty string." -msgstr "" -"A lenti mintát pontosítva be tudja állítani a lemezre történő mentés mappa " -"és fájlneveit. A '/' karakter jeleni az almappákat. A használható metaadat-" -"változókat a listamezőben láthatja. Ha az adott könyv nem tartalmazza a " -"megadott metaadatot, akkor az egy üres karakterrel lesz helyettesítve." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:44 -msgid "Available variables:" -msgstr "Engedélyezett változók:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/social.py:34 -msgid "Downloading social metadata, please wait..." -msgstr "Közösségi metaadatok letöltése, kérem várjon..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:35 -msgid "Switch between library and device views" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:38 -msgid "Separator" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:51 -msgid "Choose library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:201 -msgid "The main toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:202 -msgid "The main toolbar when a device is connected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:203 -msgid "The context menu for the books in the calibre library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:205 -msgid "The context menu for the books on the device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:243 -msgid "Cannot add" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:244 -msgid "Cannot add the actions %s to this location" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:261 -msgid "Cannot remove" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:262 -msgid "Cannot remove the actions %s from this location" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97 -msgid "Customize the actions in:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98 -msgid "A&vailable actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99 -msgid "&Current actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100 -msgid "Move selected action up" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102 -msgid "Move selected action down" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 -msgid "Ctrl+S" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:105 -msgid "Add selected actions to toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:107 -msgid "Remove selected actions from toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:109 -msgid "Restore to &default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:55 msgid "&Show this warning again" msgstr "Mindig mutassam ezt a figyelmeztetést" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:47 msgid "ERROR" msgstr "HIBA" @@ -7059,7 +6155,15 @@ msgid "Location" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1064 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:884 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 +msgid "Date" +msgstr "Dátum" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1066 msgid "Format" msgstr "Formátum" @@ -7133,11 +6237,11 @@ msgstr "" "Nem található metaadat, próbálja meg finomítani a könyvcímet, szerzőt vagy " "az ISBN-t." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 msgid "Fetch metadata" msgstr "Metaadatok letöltése" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 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 " @@ -7150,77 +6254,120 @@ msgstr "" "href=\"http://www.isbndb.com\">felhasználói fiókkal és be kell írnia a " "kapott kulcsot az alábbi mezőbe." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 msgid "&Access Key:" msgstr "Felhasználói kulcs:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:93 msgid "Fetch" msgstr "Letöltés" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:94 msgid "Matches" msgstr "Találatok" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:95 msgid "" "Select the book that most closely matches your copy from the list below" msgstr "Válassza ki azt, amelyik a leginkább illik a könyvéhez" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:96 msgid "Download &social metadata (tags/rating/etc.) for the selected book" msgstr "" "Közösségi metaadatok (címkék, értékelés stb.) letöltése a kiválasztott " "könyvhöz" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:97 msgid "Overwrite author and title with author and title of selected book" msgstr "" "A szerző és a cím felülírása a listából kiválasztott könyv szerzőjével és " "címével" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:42 msgid "Details of job" msgstr "A művelet részletei" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:49 msgid "Active Jobs" msgstr "Aktív műveletek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:50 msgid "&Stop selected job" msgstr "A kiválasztott művelet megszakítása" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:51 msgid "Show job &details" msgstr "Műveletek részleteinek megjelenítése" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:52 msgid "Stop &all non device jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +msgid "Lower Case" +msgstr "Kisbetűk" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +msgid "Upper Case" +msgstr "Nagybetűk" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +msgid "Title Case" +msgstr "Minden Szó Nagybetűvel Kezdődik" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:119 msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:166 +msgid "Book %d:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:182 +msgid "" +"Search and replace in text fields using regular expressions. The search text " +"is an arbitrary python-compatible regular expression. The replacement text " +"can contain backreferences to parenthesized expressions in the pattern. The " +"search is not anchored, and can match and replace multiple times on the same " +"string. See this " +"reference for more information, and in particular the 'sub' function." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:192 +msgid "" +"Note: you can destroy your library using this feature. Changes are " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:386 +msgid "Search/replace invalid" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:387 +msgid "Search pattern is invalid: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:419 msgid "Applying changes to %d books. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:229 msgid "Edit Meta information" msgstr "Metaadatok szerkesztése" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:231 msgid "A&utomatically set author sort" msgstr "Rendezési forma automatikus beállítása" -#: /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:232 msgid "Author s&ort: " msgstr "Rendezési forma: " -#: /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:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:233 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -7228,63 +6375,63 @@ msgstr "" "A szerző rendezési formájának megadása. Például Charles Dickens-t célszerű " "Dickens, Charles-ként rendezni." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383 msgid "&Rating:" msgstr "Értékelés:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 -#: /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:371 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 msgid "Rating of this book. 0-5 stars" msgstr "A könyv értékelése. 0-5 csillag." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:237 msgid "No change" msgstr "" -#: /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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 msgid " stars" msgstr " csillag" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:240 msgid "Add ta&gs: " msgstr "Címkék hozzáadása: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 -#: /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:377 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 msgid "Open Tag Editor" msgstr "Címke-szerkesztő megnyitása" -#: /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:244 msgid "&Remove tags:" msgstr "Címkék eltávolítása:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:245 msgid "Comma separated list of tags to remove from the books. " msgstr "A könyvből eltávolítandó címkék vesszővel elválasztott listája " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 -msgid "Remove all" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:246 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:247 +msgid "Remove all" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:251 msgid "Remove &format:" msgstr "Formátum eltávolítása:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:252 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:253 msgid "" "Selected books will be automatically numbered,\n" "in the order you selected them.\n" @@ -7292,264 +6439,342 @@ msgid "" "Book A will have series number 1 and Book B series number 2." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:258 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:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:261 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:193 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:264 +msgid "Search &field:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:265 +msgid "&Search for:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:266 +msgid "&Replace with:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:267 +msgid "Apply function &after replace:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:268 +msgid "Test &text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:269 +msgid "Test re&sult" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:270 +msgid "Your test:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:271 +msgid "&Search and replace (experimental)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:133 msgid "Not a valid picture" msgstr "Nem érvényes képfájl" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:150 msgid "Specify title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:151 msgid "You must specify a title and author before generating a cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:169 msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:200 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:201 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:223 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:229 msgid "No format selected" msgstr "Nincs formátum kiválasztva" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:240 msgid "Could not read metadata" msgstr "Nem lehet olvasni a metaadatokat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "Could not read metadata from %s format" msgstr "Nem lehet kiolvasni a metaadtokat a %s formátumból." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:284 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:295 msgid "Could not read cover" msgstr "Nem lehet olvasni a borítót" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:290 msgid "Could not read cover from %s format" msgstr "Nem lehet kiolvasni a borítót a %s formátumból" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:296 msgid "The cover in the %s format is invalid" msgstr "A %s formátumban lévő borító érvénytelen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 +msgid "" +" The green color indicates that the current author sort matches the current " +"author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354 +msgid "" +" The red color indicates that the current author sort does not match the " +"current author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 msgid "This ISBN number is valid" msgstr "Az ISBN szám érvényes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 msgid "Cannot use tag editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 msgid "The tags editor cannot be used if you have modified the tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:574 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632 msgid "Downloading cover..." msgstr "Borító letöltése..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:586 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:591 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660 msgid "Cannot fetch cover" msgstr "Nem lehet letölteni a borítót" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:598 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:603 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661 msgid "Could not fetch cover.
    " msgstr "Nem lehet letölteni a borítót.
    " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 msgid "The download timed out." msgstr "Időtúllépés letöltés közben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" "Nem található borító ehhez a könyvhöz. Próbálja meg először az ISBN-t " "meghatározni." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:604 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 msgid "" "For the error message from each cover source, click Show details below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669 msgid "Bad cover" msgstr "Hibás borító" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670 msgid "The cover is not a valid picture" msgstr "A borító nem érvényes képfájl" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703 msgid "There were errors" msgstr "Hibák történtek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704 msgid "There were errors downloading social metadata" msgstr "Hiba történt a közösségi metaadatok letöltése közben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:733 msgid "Cannot fetch metadata" msgstr "Metadatok nem letölthetőek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:734 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" "Legalább az egyik adatot meg kell adnia a következők közül: ISBN, könyv " "címe, szerző vagy kiadó" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:759 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:820 msgid "Permission denied" msgstr "Hozzáférés megtagadva" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:821 msgid "Could not open %s. Is it being used by another program?" msgstr "Nem lehet megnyitni: %s. Esetleg másik program használja?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 msgid "Edit Meta Information" msgstr "Metaadatok szerkesztése" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Meta information" msgstr "Metaadat infromációk" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Swap the author and title" msgstr "A szerző és a könyvcím megcserélése" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "Author S&ort: " msgstr "Rendezési forma: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "" -"Automatically create the author sort entry based on the current author entry" +"Specify how the author(s) of this book should be sorted. For example Charles " +"Dickens should be sorted as Dickens, Charles.\n" +"If the box is colored green, then text matches the individual author's sort " +"strings. If it is colored red, then the authors and this text do not match." msgstr "" -"A rendezési forma automatikus létrehozása az aktuális szerzői adatok alapján" -#: /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:380 +msgid "" +"Automatically create the author sort entry based on the current author " +"entry.\n" +"Using this button to create author sort will change author sort from red to " +"green." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "Remove unused series (Series that have no books)" msgstr "" "Nem használt sorozatok törlése (Olyan sorozatok, melyekhez nem tartoznak " "könyvek)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 msgid "IS&BN:" msgstr "IS&BN:" -#: /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:398 msgid "Publishe&d:" msgstr "Kiadva:" -#: /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:401 msgid "dd MMM yyyy" msgstr "nn HHH éééé" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "&Date:" msgstr "&Dátum:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "&Comments" msgstr "Megjegyzések" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "&Fetch metadata from server" msgstr "Metadatok lekérdezése szerverről" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 msgid "Available Formats" msgstr "Elérhető formátumok" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Add a new format for this book to the database" msgstr "Új formátum hozzáadása az adatbázishoz" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 msgid "Remove the selected formats for this book from the database." msgstr "A kiválasztott formátumok törlése az adatbázisból." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:410 msgid "Set the cover for the book from the selected format" msgstr "Borító beállítása a kiválasztott formátumú könyből" -#: /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:412 msgid "Update metadata from the metadata in the selected format" msgstr "Metaadatok frissítése a kiválasztott formátum metaadatai alapján" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "&Browse" msgstr "" -#: /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:416 +msgid "Remove border (if any) from cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 msgid "Reset cover to default" msgstr "Alapértelmezett borító visszaállítása" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 -msgid "Download &cover" -msgstr "Borító letöltése" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 +msgid "Download co&ver" +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 msgid "Generate a default cover based on the title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:421 msgid "&Generate cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:61 msgid "Password needed" msgstr "Jelszó szükséges" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 +msgid "&Username:" +msgstr "&Felhasználónév:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 +msgid "&Password:" +msgstr "&Jelszó:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 +msgid "&Show password" +msgstr "Jelszó mutatása" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:59 msgid "Aborting..." msgstr "Megszakítás..." @@ -7563,31 +6788,31 @@ 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 msgid "Saved Search Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 msgid "Saved Search: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 msgid "Select a saved search to edit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 msgid "Delete this selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:93 msgid "Enter a new saved search name." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:94 msgid "Add the new saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:96 msgid "Change the contents of the saved search" msgstr "" @@ -7616,7 +6841,7 @@ msgid "Last downloaded" msgstr "Utoljára letöltve" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:220 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 msgid "Schedule news download" msgstr "Ütemezett hírletöltés" @@ -7636,69 +6861,69 @@ msgstr "" msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:278 msgid "Recipes" msgstr "Hírösszeállítások" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 msgid "Download all scheduled recipes at once" msgstr "Minden ütemezett hírösszeállítás letöltése" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 msgid "Download &all scheduled" msgstr "Minden ütemezett letöltése" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 msgid "&Schedule for download:" msgstr "Ütemezés:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 msgid "Every " msgstr "Minden " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 msgid "day" msgstr "nap" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 msgid "Monday" msgstr "Hétfő" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 msgid "Tuesday" msgstr "Kedd" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 msgid "Wednesday" msgstr "Szerda" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 msgid "Thursday" msgstr "Csütörtök" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 msgid "Friday" msgstr "Péntek" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 msgid "Saturday" msgstr "Szombat" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 msgid "Sunday" msgstr "Vasárnap" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 msgid "at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 msgid "" "Interval at which to download this recipe. A value of zero means that the " "recipe will be downloaded every hour." @@ -7706,48 +6931,48 @@ msgstr "" "Milyen időközönként töltse le a hírösszeállítást. A '0,0' azt jelenti, hogy " "óránként." -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr " nap" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 msgid "&Account" msgstr "Fiókbeállítás" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "For the scheduling to work, you must leave calibre running." msgstr "Az ütemezett letöltéshez a calibre-nek futnia kell" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "&Download now" msgstr "Letöltés most" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "" "Delete downloaded news older than the specified number of days. Set to zero " "to disable." msgstr "" "A megadott napoknál régebbi hírek törlése. Állítsa 0-ra, ha ne töröljön." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "Delete downloaded news older than " msgstr "A következőnél régebbi hírek törlése: " @@ -7769,57 +6994,57 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 msgid "Advanced Search" msgstr "Részletes keresés" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 msgid "Find entries that have..." msgstr "Keresés azokra, melyek tartalmazzák..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 msgid "&All these words:" msgstr "Ezen szavak mindegyikét:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 msgid "This exact &phrase:" msgstr "Pontosan ezt a kifejezést:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 msgid "&One or more of these words:" msgstr "Egy vagy több szót ezek közül:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 msgid "But dont show entries that have..." msgstr "...de nem tartalmazzák" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 msgid "Any of these &unwanted words:" msgstr "Egyik szót sem ezek közül:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 msgid "What kind of match to use:" msgstr "Az egyezés típusa:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 msgid "Contains: the word or phrase matches anywhere in the metadata" msgstr "A szó vagy kifejezés bárhol megtalálható a metaadatban." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 msgid "Equals: the word or phrase must match an entire metadata field" msgstr "" "A szó vagy kifejezés teljes egészében megegyezik egy metaadat mezővel" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 msgid "" "Regular expression: the expression must match anywhere in the metadata" msgstr "Reguláris kifejezés bárhol a metadatban" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:129 msgid " " msgstr " " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 msgid "" "See the User Manual for more help" @@ -7830,12 +7055,12 @@ msgid "Choose formats" msgstr "Formátum kiválasztása" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:80 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:82 msgid "Authors" msgstr "Szerzők" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:113 msgid "Publishers" msgstr "Kiadók" @@ -7848,51 +7073,51 @@ 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 msgid "User Categories Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:159 msgid "A&vailable items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 msgid "Apply tags to current tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 msgid "A&pplied items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163 msgid "Unapply (remove) tag from current tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 msgid "Category name: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:166 msgid "Select a category to edit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 msgid "Delete this selected tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:169 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:170 msgid "Add the new category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:172 msgid "Category filter: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:173 msgid "Select the content kind of the new category" msgstr "" @@ -7909,15 +7134,15 @@ msgstr "" "A következő címkék egy vagy több könyvnél szerepelnek. Biztos, hogy törli " "őket?" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 msgid "Tag Editor" msgstr "Címkeszerkesztő" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 msgid "A&vailable tags" msgstr "Létező címkék" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." @@ -7925,23 +7150,23 @@ msgstr "" "Cimkék törlése az adatbázisból. Ez eltávolítja a kérdéses cinkéket a " "könyvekből, majd törli őket az adatbázisból." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 msgid "Apply tag to current book" msgstr "Címke alkalmazása az aktuális könyvön" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 msgid "A&pplied tags" msgstr "Alkalmazott címkék" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 msgid "Unapply (remove) tag from current book" msgstr "Könyvcímke eltávolítása" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:137 msgid "&Add tag:" msgstr "Címke hozzáadása:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:138 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." @@ -7949,7 +7174,7 @@ msgstr "" "Ha a kívánt címke nem szerepel a listán, itt hozzáadhatja. Vesszővel " "elválasztva több címkét is megadhat." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:139 msgid "Add tag to available tags and apply it to current book" msgstr "Címke hozzáadása az elérhető címkékhez és alkalmazás a könyvön" @@ -7958,12 +7183,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:501 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:502 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -7987,37 +7212,75 @@ msgstr "" msgid "Are you certain you want to delete the following items?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 msgid "Category Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Items in use" msgstr "" -#: /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:79 msgid "" "Delete item from database. This will unapply the item from all books and " "then remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:81 msgid "Rename the item in every book where it is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:106 +msgid "Ctrl+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:56 msgid "Test email settings" msgstr "Email beállítások tesztelése" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:57 msgid "Send test mail from %s to:" msgstr "Teszt email küldése %s-ról a következőre:" -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:120 msgid "&Test" msgstr "&Teszt" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:55 +msgid "Display contents of exploded ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:56 +msgid "&Explode ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:57 +msgid "Rebuild ePub from exploded contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:58 +msgid "&Rebuild ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:59 +msgid "Discard changes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +msgid "&Cancel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61 +msgid "" +"Explode the ePub to display contents in a file browser window. To tweak " +"individual files, right-click, then 'Open with...' your editor of choice. " +"When tweaks are complete, close the file browser window. Rebuild the ePub, " +"updating your calibre library." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127 msgid "No recipe selected" msgstr "Nincs hírösszeállítás kiválasztva" @@ -8032,7 +7295,7 @@ msgstr "Hírösszeállítás " #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:260 msgid "Switch to Advanced mode" msgstr "Váltás Haladó módba" @@ -8097,35 +7360,35 @@ msgstr "A következő hírösszeállítás testreszabása:" msgid "Choose a recipe file" msgstr "Hírösszeállítás-fájl kiválasztása" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 msgid "Add custom news source" msgstr "Felhasználói hírforrás hozzáadása" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 msgid "Available user recipes" msgstr "Elérhető felhasználói hírösszeállítások" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:255 msgid "Add/Update &recipe" msgstr "Hírösszeállítás hozzáadása/módosítása" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 msgid "&Remove recipe" msgstr "Hírösszeállítás eltávolítása" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:257 msgid "&Share recipe" msgstr "Hírösszeállítás megosztása" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:258 msgid "Customize &builtin recipe" msgstr "Beépített hírösszeállítás testreszabása" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:259 msgid "&Load recipe from file" msgstr "Hírösszeállítás betöltése fájlból" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:261 msgid "" " - - - +

    + + + +
    ''') From d1ba8c78d4b0e46f738b7f15f97b450488508c28 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 3 Oct 2010 18:56:15 -0600 Subject: [PATCH 324/412] Updated Revista Muy Interesante --- resources/recipes/revista_muy.recipe | 60 +++++++++++++++++++++------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/resources/recipes/revista_muy.recipe b/resources/recipes/revista_muy.recipe index ae3d47466c..e452a6f053 100644 --- a/resources/recipes/revista_muy.recipe +++ b/resources/recipes/revista_muy.recipe @@ -1,3 +1,4 @@ +from calibre.web.feeds.news import re from calibre.web.feeds.recipes import BasicNewsRecipe from BeautifulSoup import Tag @@ -10,26 +11,31 @@ class RevistaMuyInteresante(BasicNewsRecipe): language = 'es' no_stylesheets = True - remove_attributes = ['style', 'font'] + remove_javascript = True + + extra_css = ' .txt_articulo{ font-family: sans-serif; font-size: medium; text-align: justify } .contentheading{font-family: serif; font-size: large; font-weight: bold; color: #000000; text-align: center}' - #then we add our own style(s) like this: - extra_css = ''' - .contentheading{font-weight: bold} - p {font-size: 4px;font-family: Times New Roman;} - ''' def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + for img_tag in soup.findAll('img'): - parent_tag = img_tag.parent - if parent_tag.name == 'td': - if not parent_tag.get('class') == 'txt_articulo': break - imagen = img_tag - new_tag = Tag(soup,'p') - img_tag.replaceWith(new_tag) - div = soup.find(attrs={'class':'article_category'}) - div.insert(0,imagen) + imagen = img_tag + new_tag = Tag(soup,'p') + img_tag.replaceWith(new_tag) + div = soup.find(attrs={'class':'article_category'}) + div.insert(0,imagen) + break return soup + + preprocess_regexps = [ + (re.compile(r'.*?', re.DOTALL|re.IGNORECASE), lambda match: '' + match.group().replace('','').strip().replace('','').strip() + ''), + + ] + + keep_only_tags = [dict(name='div', attrs={'class':['article']}),dict(name='td', attrs={'class':['txt_articulo']})] remove_tags = [ @@ -37,6 +43,7 @@ class RevistaMuyInteresante(BasicNewsRecipe): ,dict(name='div', attrs={'id':['comment']}) ,dict(name='td', attrs={'class':['buttonheading']}) ,dict(name='div', attrs={'class':['tags_articles']}) + ,dict(name='table', attrs={'class':['pagenav']}) ] remove_tags_after = dict(name='div', attrs={'class':'tags_articles'}) @@ -71,8 +78,33 @@ class RevistaMuyInteresante(BasicNewsRecipe): for title, url in [ ('Historia', 'http://www.muyinteresante.es/historia-articulos'), + ('Ciencia', + 'http://www.muyinteresante.es/ciencia-articulos'), + ('Naturaleza', + 'http://www.muyinteresante.es/naturaleza-articulos'), + ('Tecnología', + 'http://www.muyinteresante.es/tecnologia-articulos'), + ('Salud', + 'http://www.muyinteresante.es/salud-articulos'), + ('Más Muy', + 'http://www.muyinteresante.es/muy'), + ('Innova - Automoción', + 'http://www.muyinteresante.es/articulos-innovacion-autos'), + ('Innova - Salud', + 'http://www.muyinteresante.es/articulos-innovacion-salud'), + ('Innova - Medio Ambiente', + 'http://www.muyinteresante.es/articulos-innovacion-medio-ambiente'), + ('Innova - Alimentación', + 'http://www.muyinteresante.es/articulos-innovacion-alimentacion'), + ('Innova - Sociedad', + 'http://www.muyinteresante.es/articulos-innovacion-sociedad'), + ('Innova - Tecnología', + 'http://www.muyinteresante.es/articulos-innovacion-tecnologia'), + ('Innova - Ocio', + 'http://www.muyinteresante.es/articulos-innovacion-ocio'), ]: articles = self.nz_parse_section(url) if articles: feeds.append((title, articles)) return feeds + From c4e3bdd4cc63aae48ad60f3353c54dfc8491ee82 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 3 Oct 2010 19:58:47 -0600 Subject: [PATCH 325/412] Fix #7039 (Search for author doesn't work if the name contains double quotes) --- src/calibre/utils/pyparsing.py | 659 ++++++++++++++--------- src/calibre/utils/search_query_parser.py | 23 +- 2 files changed, 406 insertions(+), 276 deletions(-) diff --git a/src/calibre/utils/pyparsing.py b/src/calibre/utils/pyparsing.py index 9d12066e7f..bc5571ea5f 100644 --- a/src/calibre/utils/pyparsing.py +++ b/src/calibre/utils/pyparsing.py @@ -1,6 +1,6 @@ # module pyparsing.py # -# Copyright (c) 2003-2008 Paul T. McGuire +# Copyright (c) 2003-2010 Paul T. McGuire # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -32,7 +32,7 @@ vs. the traditional lex/yacc approach, or the use of regular expressions. With don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python. -Here is a program to parse "Hello, World!" (or any greeting of the form ", !"):: +Here is a program to parse "Hello, World!" (or any greeting of the form C{", !"}):: from pyparsing import Word, alphas @@ -49,7 +49,7 @@ The program outputs the following:: The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators. -The parsed results returned from parseString() can be accessed as a nested list, a dictionary, or an +The parsed results returned from C{parseString()} can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: @@ -58,8 +58,8 @@ The pyparsing module handles some of the problems that are typically vexing when - embedded comments """ -__version__ = "1.5.1" -__versionTime__ = "2 October 2008 00:44" +__version__ = "1.5.5" +__versionTime__ = "12 Aug 2010 03:56" __author__ = "Paul McGuire " import string @@ -85,31 +85,36 @@ __all__ = [ 'htmlComment', 'javaStyleComment', 'keepOriginalText', 'line', 'lineEnd', 'lineStart', 'lineno', 'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', 'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', -'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', 'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', 'indentedBlock', 'originalTextFor', ] - """ Detect if we are running version 3.X and make appropriate changes Robert A. Clark """ -if sys.version_info[0] > 2: - _PY3K = True +_PY3K = sys.version_info[0] > 2 +if _PY3K: _MAX_INT = sys.maxsize basestring = str + unichr = chr + _ustr = str + _str2dict = set + alphas = string.ascii_lowercase + string.ascii_uppercase else: - _PY3K = False _MAX_INT = sys.maxint + range = xrange -if not _PY3K: def _ustr(obj): """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It then < returns the unicode object | encodes it with the default encoding | ... >. """ + if isinstance(obj,unicode): + return obj + try: # If this works, then _ustr(obj) has the same behaviour as str(obj), so # it won't break any existing code. @@ -128,13 +133,20 @@ if not _PY3K: # Replace unprintables with question marks? #return unicode(obj).encode(sys.getdefaultencoding(), 'replace') # ... -else: - _ustr = str - unichr = chr + + def _str2dict(strg): + return dict( [(c,0) for c in strg] ) + + alphas = string.lowercase + string.uppercase -def _str2dict(strg): - return dict( [(c,0) for c in strg] ) - #~ return set( [c for c in strg] ) +# build list of single arg builtins, tolerant of Python version, that can be used as parse actions +singleArgBuiltins = [] +import __builtin__ +for fname in "sum len enumerate sorted reversed list tuple set any all".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue def _xml_escape(data): """Escape &, <, >, ", ', etc. in a string of data.""" @@ -149,19 +161,14 @@ def _xml_escape(data): class _Constants(object): pass -if not _PY3K: - alphas = string.lowercase + string.uppercase -else: - alphas = string.ascii_lowercase + string.ascii_uppercase nums = string.digits hexnums = nums + "ABCDEFabcdef" alphanums = alphas + nums -_bslash = chr(92) +_bslash = chr(92) printables = "".join( [ c for c in string.printable if c not in string.whitespace ] ) class ParseBaseException(Exception): """base exception class for all parsing runtime exceptions""" - __slots__ = ( "loc","msg","pstr","parserElement" ) # Performance tuning: we construct a *lot* of these, so keep this # constructor as small and fast as possible def __init__( self, pstr, loc=0, msg=None, elem=None ): @@ -223,8 +230,8 @@ class ParseFatalException(ParseBaseException): pass class ParseSyntaxException(ParseFatalException): - """just like ParseFatalException, but thrown internally when an - ErrorStop indicates that parsing is to stop immediately because + """just like C{ParseFatalException}, but thrown internally when an + C{ErrorStop} ('-' operator) indicates that parsing is to stop immediately because an unbacktrackable syntax error has been found""" def __init__(self, pe): super(ParseSyntaxException, self).__init__( @@ -244,7 +251,7 @@ class ParseSyntaxException(ParseFatalException): #~ self.reparseLoc = restartLoc class RecursiveGrammarException(Exception): - """exception thrown by validate() if the grammar could be improperly recursive""" + """exception thrown by C{validate()} if the grammar could be improperly recursive""" def __init__( self, parseElementList ): self.parseElementTrace = parseElementList @@ -263,11 +270,11 @@ class _ParseResultsWithOffset(object): class ParseResults(object): """Structured parse results, to provide multiple means of access to the parsed data: - - as a list (len(results)) - - by list index (results[0], results[1], etc.) - - by attribute (results.) + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.}) """ - __slots__ = ( "__toklist", "__tokdict", "__doinit", "__name", "__parent", "__accumNames", "__weakref__" ) + #~ __slots__ = ( "__toklist", "__tokdict", "__doinit", "__name", "__parent", "__accumNames", "__weakref__" ) def __new__(cls, toklist, name=None, asList=True, modal=True ): if isinstance(toklist, cls): return toklist @@ -277,7 +284,7 @@ class ParseResults(object): # Performance tuning: we construct a *lot* of these, so keep this # constructor as small and fast as possible - def __init__( self, toklist, name=None, asList=True, modal=True ): + def __init__( self, toklist, name=None, asList=True, modal=True, isinstance=isinstance ): if self.__doinit: self.__doinit = False self.__name = None @@ -289,7 +296,7 @@ class ParseResults(object): self.__toklist = [toklist] self.__tokdict = dict() - if name: + if name is not None and name: if not modal: self.__accumNames[name] = 0 if isinstance(name,int): @@ -307,7 +314,7 @@ class ParseResults(object): else: try: self[name] = toklist[0] - except (KeyError,TypeError): + except (KeyError,TypeError,IndexError): self[name] = toklist def __getitem__( self, i ): @@ -319,7 +326,7 @@ class ParseResults(object): else: return ParseResults([ v[0] for v in self.__tokdict[i] ]) - def __setitem__( self, k, v ): + def __setitem__( self, k, v, isinstance=isinstance ): if isinstance(v,_ParseResultsWithOffset): self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] sub = v[0] @@ -361,7 +368,7 @@ class ParseResults(object): def __bool__(self): return len( self.__toklist ) > 0 __nonzero__ = __bool__ def __iter__( self ): return iter( self.__toklist ) - def __reversed__( self ): return iter( reversed(self.__toklist) ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) def keys( self ): """Returns all named result keys.""" return self.__tokdict.keys() @@ -375,14 +382,15 @@ class ParseResults(object): def get(self, key, defaultValue=None): """Returns named result matching the given key, or if there is no - such name, then returns the given defaultValue or None if no - defaultValue is specified.""" + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified.""" if key in self: return self[key] else: return defaultValue def insert( self, index, insStr ): + """Inserts new element at location index in the list of parsed tokens.""" self.__toklist.insert(index, insStr) # fixup indices in token dictionary for name in self.__tokdict: @@ -399,7 +407,7 @@ class ParseResults(object): return [ v[-1][0] for v in self.__tokdict.values() ] def __getattr__( self, name ): - if name not in self.__slots__: + if True: #name not in self.__slots__: if name in self.__tokdict: if name not in self.__accumNames: return self.__tokdict[name][-1][0] @@ -425,12 +433,15 @@ class ParseResults(object): self[k] = v if isinstance(v[0],ParseResults): v[0].__parent = wkref(self) - + self.__toklist += other.__toklist self.__accumNames.update( other.__accumNames ) - del other return self + def __radd__(self, other): + if isinstance(other,int) and other == 0: + return self.copy() + def __repr__( self ): return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) @@ -472,7 +483,7 @@ class ParseResults(object): return dict( self.items() ) def copy( self ): - """Returns a new copy of a ParseResults object.""" + """Returns a new copy of a C{ParseResults} object.""" ret = ParseResults( self.__toklist ) ret.__tokdict = self.__tokdict.copy() ret.__parent = self.__parent @@ -565,8 +576,8 @@ class ParseResults(object): return None def dump(self,indent='',depth=0): - """Diagnostic method for listing out the contents of a ParseResults. - Accepts an optional indent argument so that this string can be embedded + """Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded in a nested display of other data.""" out = [] out.append( indent+_ustr(self.asList()) ) @@ -578,14 +589,11 @@ class ParseResults(object): out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) if isinstance(v,ParseResults): if v.keys(): - #~ out.append('\n') out.append( v.dump(indent,depth+1) ) - #~ out.append('\n') else: out.append(_ustr(v)) else: out.append(_ustr(v)) - #~ out.append('\n') return "".join(out) # add support for pickle protocol @@ -641,7 +649,7 @@ def line( loc, strg ): """ lastCR = strg.rfind("\n", 0, loc) nextCR = strg.find("\n", loc) - if nextCR > 0: + if nextCR >= 0: return strg[lastCR+1:nextCR] else: return strg[lastCR+1:] @@ -662,6 +670,7 @@ def nullDebugAction(*args): class ParserElement(object): """Abstract base level parser element class.""" DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False def setDefaultWhitespaceChars( chars ): """Overrides the default whitespace chars @@ -693,7 +702,7 @@ class ParserElement(object): self.callDuringTry = False def copy( self ): - """Make a copy of this ParserElement. Useful for defining different parse actions + """Make a copy of this C{ParserElement}. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element.""" cpy = copy.copy( self ) cpy.parseAction = self.parseAction[:] @@ -713,9 +722,13 @@ class ParserElement(object): def setResultsName( self, name, listAllMatches=False ): """Define name for referencing matching tokens as a nested attribute of the returned parse results. - NOTE: this returns a *copy* of the original ParserElement object; + NOTE: this returns a *copy* of the original C{ParserElement} object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. """ newself = self.copy() newself.resultsName = name @@ -724,7 +737,7 @@ class ParserElement(object): def setBreak(self,breakFlag = True): """Method to invoke the Python pdb debugger when this element is - about to be parsed. Set breakFlag to True to enable, False to + about to be parsed. Set C{breakFlag} to True to enable, False to disable. """ if breakFlag: @@ -742,62 +755,66 @@ class ParserElement(object): def _normalizeParseActionArgs( f ): """Internal method used to decorate parse actions that take fewer than 3 arguments, - so that all parse actions can be called as f(s,l,t).""" + so that all parse actions can be called as C{f(s,l,t)}.""" STAR_ARGS = 4 - try: - restore = None - if isinstance(f,type): - restore = f - f = f.__init__ - if not _PY3K: - codeObj = f.func_code - else: - codeObj = f.code - if codeObj.co_flags & STAR_ARGS: - return f - numargs = codeObj.co_argcount - if not _PY3K: - if hasattr(f,"im_self"): - numargs -= 1 - else: - if hasattr(f,"__self__"): - numargs -= 1 - if restore: - f = restore - except AttributeError: - try: - if not _PY3K: - call_im_func_code = f.__call__.im_func.func_code - else: - call_im_func_code = f.__code__ - - # not a function, must be a callable object, get info from the - # im_func binding of its bound __call__ method - if call_im_func_code.co_flags & STAR_ARGS: - return f - numargs = call_im_func_code.co_argcount - if not _PY3K: - if hasattr(f.__call__,"im_self"): - numargs -= 1 - else: - if hasattr(f.__call__,"__self__"): - numargs -= 0 - except AttributeError: - if not _PY3K: - call_func_code = f.__call__.func_code - else: - call_func_code = f.__call__.__code__ - # not a bound method, get info directly from __call__ method - if call_func_code.co_flags & STAR_ARGS: - return f - numargs = call_func_code.co_argcount - if not _PY3K: - if hasattr(f.__call__,"im_self"): - numargs -= 1 - else: - if hasattr(f.__call__,"__self__"): - numargs -= 1 + # special handling for single-argument builtins + if (f in singleArgBuiltins): + numargs = 1 + else: + try: + restore = None + if isinstance(f,type): + restore = f + f = f.__init__ + if not _PY3K: + codeObj = f.func_code + else: + codeObj = f.code + if codeObj.co_flags & STAR_ARGS: + return f + numargs = codeObj.co_argcount + if not _PY3K: + if hasattr(f,"im_self"): + numargs -= 1 + else: + if hasattr(f,"__self__"): + numargs -= 1 + if restore: + f = restore + except AttributeError: + try: + if not _PY3K: + call_im_func_code = f.__call__.im_func.func_code + else: + call_im_func_code = f.__code__ + + # not a function, must be a callable object, get info from the + # im_func binding of its bound __call__ method + if call_im_func_code.co_flags & STAR_ARGS: + return f + numargs = call_im_func_code.co_argcount + if not _PY3K: + if hasattr(f.__call__,"im_self"): + numargs -= 1 + else: + if hasattr(f.__call__,"__self__"): + numargs -= 0 + except AttributeError: + if not _PY3K: + call_func_code = f.__call__.func_code + else: + call_func_code = f.__call__.__code__ + # not a bound method, get info directly from __call__ method + if call_func_code.co_flags & STAR_ARGS: + return f + numargs = call_func_code.co_argcount + if not _PY3K: + if hasattr(f.__call__,"im_self"): + numargs -= 1 + else: + if hasattr(f.__call__,"__self__"): + numargs -= 1 #~ print ("adding function %s with %d args" % (f.func_name,numargs)) @@ -836,8 +853,8 @@ class ParserElement(object): def setParseAction( self, *fns, **kwargs ): """Define action to perform when successfully matching parse element definition. - Parse action fn is a callable method with 0-3 arguments, called as fn(s,loc,toks), - fn(loc,toks), fn(toks), or just fn(), where: + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - s = the original string being parsed (see note below) - loc = the location of the matching substring - toks = a list of the matched tokens, packaged as a ParseResults object @@ -864,12 +881,12 @@ class ParserElement(object): def setFailAction( self, fn ): """Define action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments - fn(s,loc,expr,err) where: + C{fn(s,loc,expr,err)} where: - s = string being parsed - loc = location where expression match was attempted and failed - expr = the parse expression that failed - err = the exception thrown - The function returns no value. It may throw ParseFatalException + The function returns no value. It may throw C{ParseFatalException} if it is desired to stop parsing immediately.""" self.failAction = fn return self @@ -917,17 +934,21 @@ class ParserElement(object): preloc = self.preParse( instring, loc ) else: preloc = loc - tokensStart = loc + tokensStart = preloc try: try: loc,tokens = self.parseImpl( instring, preloc, doActions ) except IndexError: raise ParseException( instring, len(instring), self.errmsg, self ) - except ParseBaseException, err: + except ParseBaseException: #~ print ("Exception raised:", err) + err = None if self.debugActions[2]: + err = sys.exc_info()[1] self.debugActions[2]( instring, tokensStart, self, err ) if self.failAction: + if err is None: + err = sys.exc_info()[1] self.failAction( instring, tokensStart, self, err ) raise else: @@ -935,7 +956,7 @@ class ParserElement(object): preloc = self.preParse( instring, loc ) else: preloc = loc - tokensStart = loc + tokensStart = preloc if self.mayIndexError or loc >= len(instring): try: loc,tokens = self.parseImpl( instring, preloc, doActions ) @@ -957,9 +978,10 @@ class ParserElement(object): self.resultsName, asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), modal=self.modalResults ) - except ParseBaseException, err: + except ParseBaseException: #~ print "Exception raised in user parse action:", err if (self.debugActions[2] ): + err = sys.exc_info()[1] self.debugActions[2]( instring, tokensStart, self, err ) raise else: @@ -998,7 +1020,8 @@ class ParserElement(object): value = self._parseNoCache( instring, loc, doActions, callPreParse ) ParserElement._exprArgCache[ lookup ] = (value[0],value[1].copy()) return value - except ParseBaseException, pe: + except ParseBaseException: + pe = sys.exc_info()[1] ParserElement._exprArgCache[ lookup ] = pe raise @@ -1021,10 +1044,10 @@ class ParserElement(object): This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your - program must call the class method ParserElement.enablePackrat(). If - your program uses psyco to "compile as you go", you must call - enablePackrat before calling psyco.full(). If you do not do this, - Python will crash. For best results, call enablePackrat() immediately + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately after importing pyparsing. """ if not ParserElement._packratEnabled: @@ -1038,21 +1061,21 @@ class ParserElement(object): expression has been built. If you want the grammar to require that the entire input string be - successfully parsed, then set parseAll to True (equivalent to ending - the grammar with StringEnd()). + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{StringEnd()}). - Note: parseString implicitly calls expandtabs() on the input string, + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, in order to report proper column numbers in parse actions. If the input string contains tabs and - the grammar uses parse actions that use the loc argument to index into the + the grammar uses parse actions that use the C{loc} argument to index into the string being parsed, you can ensure you have a consistent view of the input string by: - - calling parseWithTabs on your grammar before calling parseString + - calling C{parseWithTabs} on your grammar before calling C{parseString} (see L{I{parseWithTabs}}) - - define your parse action using the full (s,loc,toks) signature, and - reference the input string using the parse action's s argument + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument - explictly expand the tabs in your input string before calling - parseString + C{parseString} """ ParserElement.resetCache() if not self.streamlined: @@ -1062,16 +1085,26 @@ class ParserElement(object): e.streamline() if not self.keepTabs: instring = instring.expandtabs() - loc, tokens = self._parse( instring, 0 ) - if parseAll: - loc = self.preParse( instring, loc ) - StringEnd()._parse( instring, loc ) - return tokens + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + #loc = self.preParse( instring, loc ) + se = StringEnd() + se._parse( instring, loc ) + except ParseBaseException: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + exc = sys.exc_info()[1] + raise exc + else: + return tokens def scanString( self, instring, maxMatches=_MAX_INT ): """Scan the input string for expression matches. Each match will return the matching tokens, start location, and end location. May be called with optional - maxMatches argument, to clip scanning after 'n' matches are found. + C{maxMatches} argument, to clip scanning after 'n' matches are found. Note that the start and end locations are reported relative to the string being parsed. See L{I{parseString}} for more information on parsing @@ -1089,48 +1122,75 @@ class ParserElement(object): parseFn = self._parse ParserElement.resetCache() matches = 0 - while loc <= instrlen and matches < maxMatches: - try: - preloc = preparseFn( instring, loc ) - nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) - except ParseException: - loc = preloc+1 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException: + if ParserElement.verbose_stacktrace: + raise else: - matches += 1 - yield tokens, preloc, nextLoc - loc = nextLoc + # catch and re-raise exception from here, clears out pyparsing internal stack trace + exc = sys.exc_info()[1] + raise exc def transformString( self, instring ): - """Extension to scanString, to modify matching text with modified tokens that may - be returned from a parse action. To use transformString, define a grammar and + """Extension to C{scanString}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and attach a parse action to it that modifies the returned token list. - Invoking transformString() on a target string will then scan for matches, + Invoking C{transformString()} on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse - action. transformString() returns the resulting transformed string.""" + action. C{transformString()} returns the resulting transformed string.""" out = [] lastE = 0 # force preservation of s, to minimize unwanted transformation of string, and to # keep string locs straight between transformString and scanString self.keepTabs = True - for t,s,e in self.scanString( instring ): - out.append( instring[lastE:s] ) - if t: - if isinstance(t,ParseResults): - out += t.asList() - elif isinstance(t,list): - out += t - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - return "".join(map(_ustr,out)) + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + exc = sys.exc_info()[1] + raise exc def searchString( self, instring, maxMatches=_MAX_INT ): - """Another extension to scanString, simplifying the access to the tokens found + """Another extension to C{scanString}, simplifying the access to the tokens found to match the given parse expression. May be called with optional - maxMatches argument, to clip searching after 'n' matches are found. + C{maxMatches} argument, to clip searching after 'n' matches are found. """ - return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + exc = sys.exc_info()[1] + raise exc def __add__(self, other ): """Implementation of + operator - returns And""" @@ -1143,7 +1203,7 @@ class ParserElement(object): return And( [ self, other ] ) def __radd__(self, other ): - """Implementation of + operator when left operand is not a ParserElement""" + """Implementation of + operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): @@ -1153,7 +1213,7 @@ class ParserElement(object): return other + self def __sub__(self, other): - """Implementation of - operator, returns And with error stop""" + """Implementation of - operator, returns C{And} with error stop""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): @@ -1163,7 +1223,7 @@ class ParserElement(object): return And( [ self, And._ErrorStop(), other ] ) def __rsub__(self, other ): - """Implementation of - operator when left operand is not a ParserElement""" + """Implementation of - operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): @@ -1173,6 +1233,25 @@ class ParserElement(object): return other - self def __mul__(self,other): + """Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + ZeroOrMore(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{ZeroOrMore(expr)} + - C{expr*(1,None)} is equivalent to C{OneOrMore(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + + """ if isinstance(other,int): minElements, optElements = other,0 elif isinstance(other,tuple): @@ -1225,7 +1304,7 @@ class ParserElement(object): return self.__mul__(other) def __or__(self, other ): - """Implementation of | operator - returns MatchFirst""" + """Implementation of | operator - returns C{MatchFirst}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): @@ -1235,7 +1314,7 @@ class ParserElement(object): return MatchFirst( [ self, other ] ) def __ror__(self, other ): - """Implementation of | operator when left operand is not a ParserElement""" + """Implementation of | operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): @@ -1245,7 +1324,7 @@ class ParserElement(object): return other | self def __xor__(self, other ): - """Implementation of ^ operator - returns Or""" + """Implementation of ^ operator - returns C{Or}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): @@ -1255,7 +1334,7 @@ class ParserElement(object): return Or( [ self, other ] ) def __rxor__(self, other ): - """Implementation of ^ operator when left operand is not a ParserElement""" + """Implementation of ^ operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): @@ -1265,7 +1344,7 @@ class ParserElement(object): return other ^ self def __and__(self, other ): - """Implementation of & operator - returns Each""" + """Implementation of & operator - returns C{Each}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): @@ -1275,7 +1354,7 @@ class ParserElement(object): return Each( [ self, other ] ) def __rand__(self, other ): - """Implementation of & operator when left operand is not a ParserElement""" + """Implementation of & operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): @@ -1285,11 +1364,11 @@ class ParserElement(object): return other & self def __invert__( self ): - """Implementation of ~ operator - returns NotAny""" + """Implementation of ~ operator - returns C{NotAny}""" return NotAny( self ) def __call__(self, name): - """Shortcut for setResultsName, with listAllMatches=default:: + """Shortcut for C{setResultsName}, with C{listAllMatches=default}:: userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") could be written as:: userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") @@ -1297,14 +1376,14 @@ class ParserElement(object): return self.setResultsName(name) def suppress( self ): - """Suppresses the output of this ParserElement; useful to keep punctuation from + """Suppresses the output of this C{ParserElement}; useful to keep punctuation from cluttering up returned output. """ return Suppress( self ) def leaveWhitespace( self ): """Disables the skipping of whitespace before matching the characters in the - ParserElement's defined pattern. This is normally only used internally by + C{ParserElement}'s defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars. """ self.skipWhitespace = False @@ -1320,7 +1399,7 @@ class ParserElement(object): def parseWithTabs( self ): """Overrides default behavior to expand s to spaces before parsing the input string. - Must be called before parseString when the input grammar contains elements that + Must be called before C{parseString} when the input grammar contains elements that match characters.""" self.keepTabs = True return self @@ -1332,9 +1411,9 @@ class ParserElement(object): """ if isinstance( other, Suppress ): if other not in self.ignoreExprs: - self.ignoreExprs.append( other ) + self.ignoreExprs.append( other.copy() ) else: - self.ignoreExprs.append( Suppress( other ) ) + self.ignoreExprs.append( Suppress( other.copy() ) ) return self def setDebugActions( self, startAction, successAction, exceptionAction ): @@ -1347,7 +1426,7 @@ class ParserElement(object): def setDebug( self, flag=True ): """Enable display of debugging messages while doing pattern matching. - Set flag to True to enable, False to disable.""" + Set C{flag} to True to enable, False to disable.""" if flag: self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) else: @@ -1383,7 +1462,12 @@ class ParserElement(object): f = open(file_or_filename, "rb") file_contents = f.read() f.close() - return self.parseString(file_contents, parseAll) + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + exc = sys.exc_info()[1] + raise exc def getException(self): return ParseException("",0,self.errmsg,self) @@ -1396,9 +1480,11 @@ class ParserElement(object): raise AttributeError("no such attribute " + aname) def __eq__(self,other): - if isinstance(other, basestring): + if isinstance(other, ParserElement): + return self is other or self.__dict__ == other.__dict__ + elif isinstance(other, basestring): try: - (self + StringEnd()).parseString(_ustr(other)) + self.parseString(_ustr(other), parseAll=True) return True except ParseBaseException: return False @@ -1419,7 +1505,7 @@ class ParserElement(object): class Token(ParserElement): - """Abstract ParserElement subclass, for defining atomic matching patterns.""" + """Abstract C{ParserElement} subclass, for defining atomic matching patterns.""" def __init__( self ): super(Token,self).__init__( savelist=False ) #self.myException = ParseException("",0,"",self) @@ -1492,12 +1578,12 @@ _L = Literal class Keyword(Token): """Token to exactly match a specified string as a keyword, that is, it must be - immediately followed by a non-keyword character. Compare with Literal:: + immediately followed by a non-keyword character. Compare with C{Literal}:: Literal("if") will match the leading 'if' in 'ifAndOnlyIf'. Keyword("if") will not; it will only match the leading 'if in 'if x=1', or 'if(y==2)' Accepts two optional constructor arguments in addition to the keyword string: - identChars is a string of characters that would be valid identifier characters, - defaulting to all alphanumerics + "_" and "$"; caseless allows case-insensitive + C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$"; C{caseless} allows case-insensitive matching, default is False. """ DEFAULT_KEYWORD_CHARS = alphanums+"_$" @@ -1592,8 +1678,8 @@ class Word(Token): Defined with string containing all allowed initial characters, an optional string containing allowed body characters (if omitted, defaults to the initial character set), and an optional minimum, - maximum, and/or exact length. The default value for min is 1 (a - minimum value < 1 is not valid); the default values for max and exact + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. """ def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False ): @@ -1719,24 +1805,35 @@ class Regex(Token): """Token for matching strings that match a given regular expression. Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. """ + compiledREtype = type(re.compile("[A-Z]")) def __init__( self, pattern, flags=0): """The parameters pattern and flags are passed to the re.compile() function as-is. See the Python re module for an explanation of the acceptable patterns and flags.""" super(Regex,self).__init__() - if len(pattern) == 0: - warnings.warn("null string passed to Regex; use Empty() instead", - SyntaxWarning, stacklevel=2) + if isinstance(pattern, basestring): + if len(pattern) == 0: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise - self.pattern = pattern - self.flags = flags - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % pattern, - SyntaxWarning, stacklevel=2) - raise + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") self.name = _ustr(self) self.errmsg = "Expected " + self.name @@ -1891,8 +1988,8 @@ class QuotedString(Token): class CharsNotIn(Token): """Token for matching words composed of characters *not* in a given set. Defined with string containing all disallowed characters, and an optional - minimum, maximum, and/or exact length. The default value for min is 1 (a - minimum value < 1 is not valid); the default values for max and exact + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. """ def __init__( self, notChars, min=1, max=0, exact=0 ): @@ -1963,8 +2060,8 @@ class White(Token): """Special matching class for matching whitespace. Normally, whitespace is ignored by pyparsing grammars. This class is included when some whitespace structures are significant. Define with a string containing the whitespace characters to be - matched; default is " \\t\\n". Also takes optional min, max, and exact arguments, - as defined for the Word class.""" + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{Word} class.""" whiteStrs = { " " : "", "\t": "", @@ -2143,8 +2240,8 @@ class StringEnd(_PositionToken): class WordStart(_PositionToken): """Matches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of wordChars - (default=printables). To emulate the \b behavior of regular expressions, - use WordStart(alphanums). WordStart will also match at the beginning of + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of the string being parsed, or at the beginning of a line. """ def __init__(self, wordChars = printables): @@ -2165,8 +2262,8 @@ class WordStart(_PositionToken): class WordEnd(_PositionToken): """Matches if the current position is at the end of a Word, and is not followed by any character in a given set of wordChars - (default=printables). To emulate the \b behavior of regular expressions, - use WordEnd(alphanums). WordEnd will also match at the end of + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of the string being parsed, or at the end of a line. """ def __init__(self, wordChars = printables): @@ -2197,7 +2294,10 @@ class ParseExpression(ParserElement): elif isinstance( exprs, basestring ): self.exprs = [ Literal( exprs ) ] else: - self.exprs = [ exprs ] + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] self.callPreparse = False def __getitem__( self, i ): @@ -2282,7 +2382,7 @@ class ParseExpression(ParserElement): self.checkRecursion( [] ) class And(ParseExpression): - """Requires all given ParseExpressions to be found in the given order. + """Requires all given C{ParseExpressions} to be found in the given order. Expressions may be separated by whitespace. May be constructed using the '+' operator. """ @@ -2317,9 +2417,10 @@ class And(ParseExpression): loc, exprtokens = e._parse( instring, loc, doActions ) except ParseSyntaxException: raise - except ParseBaseException, pe: + except ParseBaseException: + pe = sys.exc_info()[1] raise ParseSyntaxException(pe) - except IndexError, ie: + except IndexError: raise ParseSyntaxException( ParseException(instring, len(instring), self.errmsg, self) ) else: loc, exprtokens = e._parse( instring, loc, doActions ) @@ -2350,7 +2451,7 @@ class And(ParseExpression): class Or(ParseExpression): - """Requires that at least one ParseExpression is found. + """Requires that at least one C{ParseExpression} is found. If two expressions match, the expression that matches the longest string will be used. May be constructed using the '^' operator. """ @@ -2369,7 +2470,8 @@ class Or(ParseExpression): for e in self.exprs: try: loc2 = e.tryParse( instring, loc ) - except ParseException, err: + except ParseException: + err = sys.exc_info()[1] if err.loc > maxExcLoc: maxException = err maxExcLoc = err.loc @@ -2411,7 +2513,7 @@ class Or(ParseExpression): class MatchFirst(ParseExpression): - """Requires that at least one ParseExpression is found. + """Requires that at least one C{ParseExpression} is found. If two expressions match, the first one listed is the one that will match. May be constructed using the '|' operator. """ @@ -2470,7 +2572,7 @@ class MatchFirst(ParseExpression): class Each(ParseExpression): - """Requires all given ParseExpressions to be found, but in any order. + """Requires all given C{ParseExpressions} to be found, but in any order. Expressions may be separated by whitespace. May be constructed using the '&' operator. """ @@ -2486,7 +2588,9 @@ class Each(ParseExpression): def parseImpl( self, instring, loc, doActions=True ): if self.initExprGroups: - self.optionals = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and e not in opt1 ] + self.optionals = opt1 + opt2 self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] @@ -2520,7 +2624,7 @@ class Each(ParseExpression): raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) # add any unmatched Optionals, in case they have default values defined - matchOrder += [ e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt ] + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] resultlist = [] for e in matchOrder: @@ -2556,7 +2660,7 @@ class Each(ParseExpression): class ParseElementEnhance(ParserElement): - """Abstract subclass of ParserElement, for combining and post-processing parsed tokens.""" + """Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.""" def __init__( self, expr, savelist=False ): super(ParseElementEnhance,self).__init__(savelist) if isinstance( expr, basestring ): @@ -2628,10 +2732,10 @@ class ParseElementEnhance(ParserElement): class FollowedBy(ParseElementEnhance): - """Lookahead matching of the given parse expression. FollowedBy + """Lookahead matching of the given parse expression. C{FollowedBy} does *not* advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current - position. FollowedBy always returns a null token list.""" + position. C{FollowedBy} always returns a null token list.""" def __init__( self, expr ): super(FollowedBy,self).__init__(expr) self.mayReturnEmpty = True @@ -2642,10 +2746,10 @@ class FollowedBy(ParseElementEnhance): class NotAny(ParseElementEnhance): - """Lookahead to disallow matching with the given parse expression. NotAny + """Lookahead to disallow matching with the given parse expression. C{NotAny} does *not* advance the parsing position within the input string, it only verifies that the specified parse expression does *not* match at the current - position. Also, NotAny does *not* skip over leading whitespace. NotAny + position. Also, C{NotAny} does *not* skip over leading whitespace. C{NotAny} always returns a null token list. May be constructed using the '~' operator.""" def __init__( self, expr ): super(NotAny,self).__init__(expr) @@ -2795,15 +2899,14 @@ class Optional(ParseElementEnhance): class SkipTo(ParseElementEnhance): """Token for skipping over all undefined text until the matched expression is found. - If include is set to true, the matched expression is also consumed. The ignore + If C{include} is set to true, the matched expression is also parsed (the skipped text + and matched expression are returned as a 2-element list). The C{ignore} argument is used to define grammars (typically quoted strings and comments) that might contain false matches. """ def __init__( self, other, include=False, ignore=None, failOn=None ): super( SkipTo, self ).__init__( other ) - if ignore is not None: - self.expr = self.expr.copy() - self.expr.ignore(ignore) + self.ignoreExpr = ignore self.mayReturnEmpty = True self.mayIndexError = False self.includeMatch = include @@ -2823,10 +2926,21 @@ class SkipTo(ParseElementEnhance): while loc <= instrlen: try: if self.failOn: - failParse = True - self.failOn.tryParse(instring, loc) + try: + self.failOn.tryParse(instring, loc) + except ParseBaseException: + pass + else: + failParse = True + raise ParseException(instring, loc, "Found expression " + str(self.failOn)) failParse = False - loc = expr._skipIgnorables( instring, loc ) + if self.ignoreExpr is not None: + while 1: + try: + loc = self.ignoreExpr.tryParse(instring,loc) + # print "found ignoreExpr, advance to", loc + except ParseBaseException: + break expr._parse( instring, loc, doActions=False, callPreParse=False ) skipText = instring[startLoc:loc] if self.includeMatch: @@ -2852,15 +2966,15 @@ class SkipTo(ParseElementEnhance): class Forward(ParseElementEnhance): """Forward declaration of an expression to be defined later - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the Forward variable using the '<<' operator. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. - Note: take care when assigning to Forward not to overlook precedence of operators. + Note: take care when assigning to C{Forward} not to overlook precedence of operators. Specifically, '|' has a lower precedence than '<<', so that:: fwdExpr << a | b | c will actually be evaluated as:: (fwdExpr << a) | b | c thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the Forward:: + explicitly group the values inserted into the C{Forward}:: fwdExpr << (a | b | c) """ def __init__( self, other=None ): @@ -2945,7 +3059,7 @@ class Upcase(TokenConverter): class Combine(TokenConverter): """Converter to concatenate all matching tokens to a single string. By default, the matching patterns must also be contiguous in the input string; - this can be disabled by specifying 'adjacent=False' in the constructor. + this can be disabled by specifying C{'adjacent=False'} in the constructor. """ def __init__( self, expr, joinString="", adjacent=True ): super(Combine,self).__init__( expr ) @@ -2955,6 +3069,7 @@ class Combine(TokenConverter): self.adjacent = adjacent self.skipWhitespace = True self.joinString = joinString + self.callPreparse = True def ignore( self, other ): if self.adjacent: @@ -3050,7 +3165,8 @@ def traceParseAction(f): sys.stderr.write( ">>entering %s(line: '%s', %d, %s)\n" % (thisFunc,line(l,s),l,t) ) try: ret = f(*paArgs) - except Exception, exc: + except Exception: + exc = sys.exc_info()[1] sys.stderr.write( "<") else: @@ -3375,7 +3494,8 @@ def _makeTags(tagStr, xml): openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % tagStr) closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("" % tagStr) - + openTag.tag = resname + closeTag.tag = resname return openTag, closeTag def makeHTMLTags(tagStr): @@ -3497,7 +3617,7 @@ sglQuotedString = Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*'") quotedString = Regex(r'''(?:"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*")|(?:'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*')''').setName("quotedString using single or double quotes") unicodeString = Combine(_L('u') + quotedString.copy()) -def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString): +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): """Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). @@ -3528,11 +3648,11 @@ def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString): CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: - content = (empty+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS ).setParseAction(lambda t:t[0].strip())) else: if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + + content = (Combine(OneOrMore(~ignoreExpr + ~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) @@ -3593,7 +3713,7 @@ def indentedBlock(blockStatementExpr, indentStack, indent=True): UNDENT = Empty().setParseAction(checkUnindent) if indent: smExpr = Group( Optional(NL) + - FollowedBy(blockStatementExpr) + + #~ FollowedBy(blockStatementExpr) + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) else: smExpr = Group( Optional(NL) + @@ -3605,7 +3725,7 @@ alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:")) -commonHTMLEntity = Combine(_L("&") + oneOf("gt lt amp nbsp quot").setResultsName("entity") +";") +commonHTMLEntity = Combine(_L("&") + oneOf("gt lt amp nbsp quot").setResultsName("entity") +";").streamline() _htmlEntityMap = dict(zip("gt lt amp nbsp quot".split(),'><& "')) replaceHTMLEntity = lambda t : t.entity in _htmlEntityMap and _htmlEntityMap[t.entity] or None @@ -3623,7 +3743,7 @@ _noncomma = "".join( [ c for c in printables if c != "," ] ) _commasepitem = Combine(OneOrMore(Word(_noncomma) + Optional( Word(" \t") + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") -commaSeparatedList = delimitedList( Optional( quotedString | _commasepitem, default="") ).setName("commaSeparatedList") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") if __name__ == "__main__": @@ -3637,7 +3757,8 @@ if __name__ == "__main__": print ("tokens.columns = " + str(tokens.columns)) print ("tokens.tables = " + str(tokens.tables)) print (tokens.asXML("SQL",True)) - except ParseBaseException,err: + except ParseBaseException: + err = sys.exc_info()[1] print (teststring + "->") print (err.line) print (" "*(err.column-1) + "^") diff --git a/src/calibre/utils/search_query_parser.py b/src/calibre/utils/search_query_parser.py index e368c04e2a..85a64956a8 100644 --- a/src/calibre/utils/search_query_parser.py +++ b/src/calibre/utils/search_query_parser.py @@ -18,8 +18,9 @@ If this module is run, it will perform a series of unit tests. import sys, string, operator -from calibre.utils.pyparsing import CaselessKeyword, Group, Forward, CharsNotIn, Suppress, \ - OneOrMore, MatchFirst, CaselessLiteral, Optional, NoMatch, ParseException +from calibre.utils.pyparsing import CaselessKeyword, Group, Forward, \ + CharsNotIn, Suppress, OneOrMore, MatchFirst, CaselessLiteral, \ + Optional, NoMatch, ParseException, QuotedString from calibre.constants import preferred_encoding @@ -127,18 +128,21 @@ class SearchQueryParser(object): location |= l location = Optional(location, default='all') word_query = CharsNotIn(string.whitespace + '()') - quoted_query = Suppress('"')+CharsNotIn('"')+Suppress('"') + #quoted_query = Suppress('"')+CharsNotIn('"')+Suppress('"') + quoted_query = QuotedString('"', escChar='\\') query = quoted_query | word_query Token = Group(location + query).setResultsName('token') if test: print 'Testing Token parser:' + Token.validate() failed = SearchQueryParser.run_tests(Token, 'token', ( ('tag:asd', ['tag', 'asd']), - ('ddsä', ['all', 'ddsä']), - ('"one two"', ['all', 'one two']), - ('title:"one two"', ['title', 'one two']), + (u'ddsä', ['all', u'ddsä']), + ('"one \\"two"', ['all', 'one "two']), + ('title:"one \\"1.5\\" two"', ['title', 'one "1.5" two']), + ('title:abc"def', ['title', 'abc"def']), ) ) @@ -167,7 +171,7 @@ class SearchQueryParser(object): ).setResultsName("or") | And) if test: - Or.validate() + #Or.validate() self._tests_failed = bool(failed) self._parser = Or @@ -240,6 +244,8 @@ class SearchQueryParser(object): ''' return set([]) +# Testing {{{ + class Tester(SearchQueryParser): texts = { @@ -599,3 +605,6 @@ def main(args=sys.argv): if __name__ == '__main__': sys.exit(main()) + +# }}} + From 61b32834f645c68902257c48fffccf32d2931c6c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 3 Oct 2010 21:17:03 -0600 Subject: [PATCH 326/412] Fix #7058 (.CHM conversion fails) --- src/calibre/ebooks/chm/reader.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/chm/reader.py b/src/calibre/ebooks/chm/reader.py index 831c16bf6a..6b2ef2d211 100644 --- a/src/calibre/ebooks/chm/reader.py +++ b/src/calibre/ebooks/chm/reader.py @@ -151,7 +151,8 @@ class CHMReader(CHMFile): continue raise self._extracted = True - files = os.listdir(output_dir) + files = [x for x in os.listdir(output_dir) if + os.path.isfile(os.path.join(output_dir, x))] if self.hhc_path not in files: for f in files: if f.lower() == self.hhc_path.lower(): From 735b22b934452af8f194ab171cc2515c3b2f4228 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 3 Oct 2010 21:18:26 -0600 Subject: [PATCH 327/412] Fix #7057 (DR1000s plugin + djvu) --- src/calibre/devices/irexdr/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/irexdr/driver.py b/src/calibre/devices/irexdr/driver.py index bd2a91740b..32e98f9353 100644 --- a/src/calibre/devices/irexdr/driver.py +++ b/src/calibre/devices/irexdr/driver.py @@ -20,7 +20,7 @@ class IREXDR1000(USBMS): # Ordered list of supported formats # Be sure these have an entry in calibre.devices.mime - FORMATS = ['epub', 'mobi', 'prc', 'html', 'pdf', 'txt'] + FORMATS = ['epub', 'mobi', 'prc', 'html', 'pdf', 'djvu', 'txt'] VENDOR_ID = [0x1e6b] PRODUCT_ID = [0x001] From 814c8de0c3018d31aca8e50d946a6844dc6333a1 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Mon, 4 Oct 2010 04:56:26 +0000 Subject: [PATCH 328/412] Launchpad automatic translations update. --- src/calibre/translations/ar.po | 624 +-- src/calibre/translations/ca.po | 831 ++-- src/calibre/translations/da.po | 908 ++-- src/calibre/translations/de.po | 635 +-- src/calibre/translations/eu.po | 934 +++-- src/calibre/translations/fi.po | 6369 ++++++++++++++++------------- src/calibre/translations/fr.po | 637 +-- src/calibre/translations/gl.po | 635 +-- src/calibre/translations/ja.po | 624 +-- src/calibre/translations/ko.po | 628 +-- src/calibre/translations/pt.po | 635 +-- src/calibre/translations/pt_BR.po | 643 +-- src/calibre/translations/sr.po | 635 +-- src/calibre/translations/sv.po | 758 ++-- src/calibre/translations/vi.po | 632 +-- 15 files changed, 8747 insertions(+), 7381 deletions(-) diff --git a/src/calibre/translations/ar.po b/src/calibre/translations/ar.po index 0631d24c2d..0254b93987 100644 --- a/src/calibre/translations/ar.po +++ b/src/calibre/translations/ar.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-10-01 21:28+0000\n" -"PO-Revision-Date: 2010-10-01 20:26+0000\n" +"POT-Creation-Date: 2010-10-03 21:03+0000\n" +"PO-Revision-Date: 2010-10-03 22:02+0000\n" "Last-Translator: Hsn \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-10-02 04:59+0000\n" +"X-Launchpad-Export-Date: 2010-10-04 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:526 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:525 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:398 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -44,13 +44,13 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:223 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:29 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:231 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:30 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:346 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:351 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:354 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /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:49 @@ -59,8 +59,8 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1017 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1129 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 @@ -78,11 +78,11 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 #: /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:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:136 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:138 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:909 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:914 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:980 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 @@ -110,29 +110,29 @@ msgstr "لا يفعل شيءً" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:277 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:280 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1187 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1196 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1199 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:912 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:913 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:187 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 @@ -264,171 +264,171 @@ msgstr "ضبط دليل المعلومات في الملفات %s" msgid "Set metadata from %s files" msgstr "ضبط دليل المعلومات من ملفات %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 msgid "Look and Feel" msgstr "المظهر" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:692 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:704 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:715 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 msgid "Interface" msgstr "الواجهة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 msgid "Behavior" msgstr "سلوك" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708 msgid "Change the way calibre behaves" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:177 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:180 msgid "Add your own columns" msgstr "اضف عامودك الخاص" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 msgid "Add/remove your own columns to the calibre book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Customize the toolbar" msgstr "خصِّص شريط الأدوات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 msgid "Input Options" msgstr "خيارات الإدخال" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:738 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:749 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 msgid "Conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 msgid "Set conversion options specific to each input format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 msgid "Common Options" msgstr "خيارات متداولة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 msgid "Set conversion options common to all formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Output Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Adding books" msgstr "إضافة كتب" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:783 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:795 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:807 msgid "Import/Export" msgstr "إستيراد/تصدير" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Control how calibre reads metadata from files when adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 msgid "Saving books to disk" msgstr "حفظ الكتب على القرص" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Sending books to devices" msgstr "ارسال الكتب الى الاجهزة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 msgid "Control how calibre transfers files to your ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 msgid "Change metadata fields before saving/sending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 msgid "Sharing books by email" msgstr "مشاركة الكتب عبر البريد الالكتروني" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:818 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 msgid "Sharing" msgstr "مشاركة" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Sharing over the net" msgstr "المشاركة على الشبكة العنكبوتية" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 msgid "Plugins" msgstr "الملحقات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:866 msgid "Advanced" msgstr "متقدّم" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 msgid "Miscellaneous" msgstr "متفرقات" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 msgid "Miscellaneous advanced configuration" msgstr "" @@ -929,7 +929,7 @@ msgid "Adding books to device metadata listing..." msgstr "إضافة كتب لقائمة البيانات الوصفية للجهاز ..." #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 msgid "Not Implemented" msgstr "غير مطبق" @@ -960,6 +960,10 @@ msgid "Communicate with the Pandigital Novel" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +msgid "Communicate with the VelocityMicro" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:132 msgid "Communicate with the GM2000" msgstr "" @@ -2139,54 +2143,54 @@ msgid "" "autodetect if they are actually cbz/cbr files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:112 msgid "TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "No" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "Yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:550 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:289 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "العنوان" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 msgid "Author(s)" msgstr "المؤلف أو المؤلفون" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:552 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:555 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "الناشر" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "المنتج" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:557 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:212 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:213 @@ -2194,42 +2198,42 @@ msgstr "المنتج" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:332 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 msgid "Comments" msgstr "التعليقات" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:154 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1122 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:146 msgid "Tags" msgstr "الوسوم" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:558 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:337 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:94 msgid "Series" msgstr "السلسلة" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:562 msgid "Language" msgstr "اللغة" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 msgid "Timestamp" msgstr "ختم التوقيت" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:563 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:566 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 @@ -2237,7 +2241,7 @@ msgstr "ختم التوقيت" msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:565 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:568 msgid "Rights" msgstr "" @@ -2466,7 +2470,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1303 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1397 msgid "Cover" msgstr "الغلاف" @@ -2497,7 +2501,7 @@ msgstr "" msgid "Tag marking book to be filed with Personal Docs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108 msgid "All articles" msgstr "" @@ -2505,70 +2509,70 @@ msgstr "" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Title Page" msgstr "صقحة العنوان" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 #: /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:199 msgid "Table of Contents" msgstr "المحتويات" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 msgid "Index" msgstr "الفهرس" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Glossary" msgstr "المسرد" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Acknowledgements" msgstr "شكر وتقدير" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Bibliography" msgstr "ببليوغرافيا" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Copyright" msgstr "حقوق المؤلف" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Dedication" msgstr "الإهداء" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Foreword" msgstr "افتتاحية" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "List of Illustrations" msgstr "قائمة الرسوم" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Tables" msgstr "قائمة الجداول" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Notes" msgstr "الملاحظات" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Preface" msgstr "افتتاحية" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Main Text" msgstr "النصّ الرئيسي" @@ -2933,130 +2937,130 @@ msgid "" "allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Confirm before deleting" msgstr "تأكيد قبل الحذف" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Notify when a new version is available" msgstr "Notify when a new version is available" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Sort tags list by name, popularity, or rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Number of covers to show in the cover browsing mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Defaults for conversion to LRF" msgstr "الإفتراضي للتحويل إلى LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:83 msgid "Options for the LRF ebook viewer" msgstr "الخيارات لمستعرض كتب LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Formats that are viewed using the internal viewer" msgstr "تهيئات التي تعرض عن طريق المستعرض الداخلي" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Show system tray icon" msgstr "إظهار أيقونة صينية النظام" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Upload downloaded news to device" msgstr "رفع أخبار تم تنزيلها إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "Delete books from library after uploading to device" msgstr "حذف كتب من المكتبة بعد رفعها إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Overwrite author and title with new metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Show the average rating per item indication in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:487 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466 msgid "Choose Files" msgstr "" @@ -3175,12 +3179,12 @@ msgstr "" msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 @@ -3188,12 +3192,12 @@ msgstr "" msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:254 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "No book files found" msgstr "" @@ -3206,7 +3210,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Fetch annotations (experimental)" msgstr "" @@ -3392,7 +3396,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:267 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:272 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:685 msgid "Not allowed" msgstr "" @@ -3458,7 +3462,7 @@ msgid "Could not copy books: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:702 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:675 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" @@ -3521,14 +3525,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "" @@ -3979,7 +3983,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "" @@ -4174,7 +4178,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1105 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 msgid "Path" msgstr "المسار" @@ -4191,8 +4195,8 @@ msgid "Formats" msgstr "التهيئات" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1108 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 msgid "Collections" msgstr "" @@ -4205,8 +4209,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1125 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 @@ -4291,7 +4295,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 @@ -4810,45 +4814,45 @@ msgstr "" msgid "&Monospaced font family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:44 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "ميتاداتا" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:46 msgid "" "Set the metadata. The output file will contain as much of this metadata as " "possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 msgid "Choose cover for " msgstr "إختار الغلاف لـ " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:175 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "Cannot read" msgstr "لا يمكن القراءة" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:191 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Error reading file" msgstr "خطأ في قراءة الملف" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 msgid "

    There was an error reading from file:
    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:192 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 msgid " is not a valid picture" msgstr " ليست صورة صالحة" @@ -5449,228 +5453,228 @@ msgstr "احصل على قائمة الكتب على الجهاز" msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:321 msgid "Send metadata to device" msgstr "ارسل الميتاداتا إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:326 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "رفع %d كتاب إلى الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "حذف كتب من الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "تنزيل الكتب من الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "عرض كتاب على الجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:485 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:522 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:639 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:132 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "خطأ" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:640 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:652 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:661 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:708 msgid "Error talking to device" msgstr "خطأ في الاتصال بالجهاز" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:700 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:709 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:752 msgid "Device: " msgstr "الجهاز: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:754 msgid " detected." msgstr " تم كشفه." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:842 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:852 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:855 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:859 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:856 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:901 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:905 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:906 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:957 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1112 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1231 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1239 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1059 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1248 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:950 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:967 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1009 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1010 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1019 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1030 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1051 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1113 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1232 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1122 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1241 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1145 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1313 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1304 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1314 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 msgid "Invalid template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 msgid "The template %s is invalid:" msgstr "" @@ -5900,7 +5904,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:280 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 @@ -5908,7 +5912,7 @@ msgid "Date" msgstr "تاريخ" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1104 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1111 msgid "Format" msgstr "التهيئة" @@ -7360,7 +7364,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:281 msgid "" "For help with writing advanced news recipes, please visit User Recipes" +"href=\"http://calibre-ebook.com/user_manual/news.html\">User Recipes" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:282 @@ -7566,42 +7570,42 @@ msgstr "" msgid "Eject this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:209 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 msgid "Show books in calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 msgid "Device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 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/gui2/layout.py:67 #: /home/kovid/work/calibre/src/calibre/library/database2.py:839 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 msgid "Show books in storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 #: /home/kovid/work/calibre/src/calibre/library/database2.py:841 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:70 msgid "Show books in storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:110 msgid "available" msgstr "" @@ -7659,73 +7663,73 @@ msgid "Size (MB)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 msgid "Book %s of %s." msgstr "كتاب %s لـ%s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:697 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1222 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1229 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:916 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1209 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1212 msgid "Double click to edit me

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:118 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:123 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:127 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:142 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:161 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:173 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:686 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8590,21 +8594,29 @@ msgstr "" msgid "Check the library folders for potential problems" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:43 +msgid "Device currently connected: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:46 +msgid "Device currently connected: None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:207 msgid "" "That format and device already has a plugboard or conflicts with another " "plugboard." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:240 msgid "Invalid destination" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:241 msgid "The destination field cannot be blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 msgid "" "Here you can change the metadata calibre uses to update a book when saving " "to disk or sending to device.\n" @@ -8624,39 +8636,39 @@ msgid "" "would be to specify the language." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:121 msgid "Format (choose first)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:122 msgid "Device (choose second)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:123 msgid "Add new plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:124 msgid "Edit existing plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:125 msgid "Existing plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:126 msgid "Source template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:127 msgid "Destination field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:128 msgid "Save plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:129 msgid "Delete plugboard" msgstr "" @@ -10116,7 +10128,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/caches.py:539 #: /home/kovid/work/calibre/src/calibre/library/caches.py:549 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "no" msgstr "" @@ -10127,7 +10139,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/caches.py:542 #: /home/kovid/work/calibre/src/calibre/library/caches.py:552 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "yes" msgstr "" @@ -10770,7 +10782,7 @@ msgid "" " files in each directory of the calibre library. This is\n" " useful if your metadata.db file has been corrupted.\n" "\n" -" WARNING: This completely regenrates your datbase. You will\n" +" WARNING: This completely regenerates your datbase. You will\n" " lose stored per-book conversion settings and custom recipes.\n" " " msgstr "" @@ -10841,87 +10853,87 @@ msgstr "" msgid "creating custom column " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:31 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 msgid "The title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 msgid "The authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:34 msgid "" "The author sort string. To use only the first letter of the name use " "{author_sort[0]}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:35 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 msgid "The tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 msgid "The series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:38 msgid "" "The series number. To get leading zeros use {series_index:0>3s} or " "{series_index:>3s} for leading spaces" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:40 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 msgid "The rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 msgid "The ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 msgid "The publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 msgid "The date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 msgid "The published date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:46 msgid "The calibre internal id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:55 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:56 msgid "Options to control saving to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:61 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:62 msgid "" "Normally, calibre will update the metadata in the saved files from what is " "in the calibre library. Makes saving to disk slower." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:64 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:65 msgid "" "Normally, calibre will write the metadata into a separate OPF file along " "with the actual e-book files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:67 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:68 msgid "" "Normally, calibre will save the cover in a separate file along with the " "actual e-book file(s)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:70 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:71 msgid "" "Comma separated list of formats to save for each book. By default all " "available formats are saved." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:73 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:74 msgid "" "The template to control the filename and directory structure of the saved " "files. Default is \"%s\" which will save books into a per-author " @@ -10929,7 +10941,7 @@ msgid "" "are: {%s}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:78 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:79 msgid "" "The template to control the filename and directory structure of files sent " "to the device. Default is \"%s\" which will save books into a per-author " @@ -10937,7 +10949,7 @@ msgid "" "are: {%s}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:85 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:86 msgid "" "Normally, calibre will convert all non English characters into English " "equivalents for the file names. WARNING: If you turn this off, you may " @@ -10945,22 +10957,22 @@ msgid "" "saving to supports unicode." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:91 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:94 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:92 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:95 msgid "" "The format in which to display dates. %d - day, %b - month, %Y - year. " "Default is: %b, %Y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:97 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:98 msgid "Convert paths to lowercase." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:99 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:100 msgid "Replace whitespace with underscores." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:319 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:330 msgid "Requested formats not available" msgstr "" diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index 78d9f1e3f3..deb0c793c6 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-01 21:28+0000\n" -"PO-Revision-Date: 2010-10-01 21:14+0000\n" -"Last-Translator: jeffreyabbot \n" +"POT-Creation-Date: 2010-10-03 21:03+0000\n" +"PO-Revision-Date: 2010-10-03 19:41+0000\n" +"Last-Translator: FerranRius \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-02 04:59+0000\n" +"X-Launchpad-Export-Date: 2010-10-04 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -34,7 +34,7 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:526 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:525 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:398 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -47,13 +47,13 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:223 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:29 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:231 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:30 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:346 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:351 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:354 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /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:49 @@ -62,8 +62,8 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1017 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1129 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 @@ -81,11 +81,11 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 #: /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:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:136 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:138 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:909 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:914 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:980 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 @@ -113,29 +113,29 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:277 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:280 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1187 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1196 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1199 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:912 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:913 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:187 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 @@ -268,45 +268,45 @@ msgstr "Estableix la metainformació als fitxers %s" msgid "Set metadata from %s files" msgstr "Estableix metainformació des dels fitxers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 msgid "Look and Feel" msgstr "Aspecte i comportament" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:692 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:704 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:715 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 msgid "Interface" msgstr "Interfície" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Ajusta l'aspecte i el comportament de la interfície de calibre per tal que " "s'adapti al teu gust" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 msgid "Behavior" msgstr "Comportament" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708 msgid "Change the way calibre behaves" msgstr "Canvia el comportament de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:177 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:180 msgid "Add your own columns" msgstr "Afegeix les teves columnes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 msgid "Add/remove your own columns to the calibre book list" msgstr "Afegeix/elimina les teves columnes a la llista de llibres de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Customize the toolbar" msgstr "Personalitza la barra d'eines" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -314,60 +314,60 @@ msgstr "" "Personalitza les barres d'eines i els menús de context, canviant quines " "accions estan disponibles" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 msgid "Input Options" msgstr "Opcions d'entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:738 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:749 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 msgid "Conversion" msgstr "Conversió" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 msgid "Set conversion options specific to each input format" msgstr "" "Ajusta les opcions de conversió específiques per a cada format d'entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 msgid "Common Options" msgstr "Opcions comunes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 msgid "Set conversion options common to all formats" msgstr "Ajusta les opcions de conversió comunes a tots els formats" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Output Options" msgstr "Opcions de sortida" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each output format" msgstr "" "Ajusta les opcions de conversió específiques de cada format de sortida" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Adding books" msgstr "Afegint llibres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:783 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:795 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:807 msgid "Import/Export" msgstr "Importa/exporta" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Controla com calibre llegeix les metadades dels arxius quan s'afegeixen " "llibres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 msgid "Saving books to disk" msgstr "Desant els llibres al disc" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -375,32 +375,32 @@ msgstr "" "Controla com calibre exporta arxius de la seva base de dades al disc quan " "s'utilitza Desa al disc" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Sending books to devices" msgstr "Enviant llibres als dispositius" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 msgid "Control how calibre transfers files to your ebook reader" msgstr "Controla com calibre envia arxius al teu lector d'ebooks" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 msgid "Metadata plugboards" -msgstr "" +msgstr "Metadades dels taulers de connexions" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 msgid "Change metadata fields before saving/sending" -msgstr "" +msgstr "Canvia els camps de les metadades abans de desar/enviar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 msgid "Sharing books by email" msgstr "Compartint llibres via correu electrònic" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:818 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 msgid "Sharing" msgstr "Compartint" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -408,11 +408,11 @@ msgstr "" "Configura compartir llibres via correu electrònic. Es pot utilitzar per " "enviar notícies descarregades als teus dispositius" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Sharing over the net" msgstr "Compartint en xarxa" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -420,35 +420,35 @@ msgstr "" "Configura el Servidor de Continguts que et donarà accés a la teva llibreria " "des de qualsevol lloc i dispositiu, a través d'internet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:866 msgid "Advanced" msgstr "Avançat" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" "Afegeix/eliminina/personalitza diversos bits de la funcionalitat de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Tweaks" msgstr "Ajustos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Configuració detallada del comportament de calibre en diversos contextos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 msgid "Miscellaneous" msgstr "Miscel·lània" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 msgid "Miscellaneous advanced configuration" msgstr "Configuració avançada" @@ -931,7 +931,7 @@ msgstr "Comunicació amb lector MiBuk Wolder" #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:116 msgid "Communicate with the JetBook Mini reader." -msgstr "" +msgstr "Comunica amb el lector JetBook Mini." #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." @@ -985,7 +985,7 @@ msgid "Adding books to device metadata listing..." msgstr "S'estan afegint llibres al llistat de metadades del dispositiu..." #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 msgid "Not Implemented" msgstr "No implementat" @@ -1019,6 +1019,10 @@ msgid "Communicate with the Pandigital Novel" msgstr "Comunicar-se amb el Pandigital Novel" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +msgid "Communicate with the VelocityMicro" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:132 msgid "Communicate with the GM2000" msgstr "Comunicació amb el GM2000" @@ -2442,54 +2446,54 @@ msgstr "" "Extreure els formats de llibre digital comuns de fitxers (zip / rar). També " "intenta detectar automàticament si es tracta de fitxers cbz/cbr." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:112 msgid "TEMPLATE ERROR" -msgstr "" +msgstr "ERROR A LA PLANTILLA" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "No" msgstr "No" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "Yes" msgstr "Sí" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:550 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:289 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "Tí­tol" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 msgid "Author(s)" msgstr "Autor(s)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:552 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:555 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "Editorial" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Productor" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:557 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:212 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:213 @@ -2497,42 +2501,42 @@ msgstr "Productor" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:332 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 msgid "Comments" msgstr "Comentaris" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:154 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1122 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:146 msgid "Tags" msgstr "Etiquetes" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:558 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:337 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:94 msgid "Series" msgstr "Sèries" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:562 msgid "Language" msgstr "Llengua" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 msgid "Timestamp" msgstr "Marca de temps" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:563 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:566 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 @@ -2540,7 +2544,7 @@ msgstr "Marca de temps" msgid "Published" msgstr "Publicat" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:565 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:568 msgid "Rights" msgstr "Drets" @@ -2697,11 +2701,12 @@ msgstr "Error al servidor LibraryThing.com. Provi-ho de nou més tard." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:226 msgid "Download covers from Douban.com" -msgstr "" +msgstr "Descarrega portades de Douban.com" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:235 msgid "Douban.com API timed out. Try again later." msgstr "" +"El temps d'espera d l'API Douban.com s'ha esgotat. Intenteu-ho més tard." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 msgid "Downloads metadata from Douban.com" @@ -2813,7 +2818,7 @@ msgstr "" "identificat mitjançant ISBN des de LibrqaryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1303 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1397 msgid "Cover" msgstr "Portada" @@ -2848,7 +2853,7 @@ msgstr "Desactiva la compressió del contigut de l'arxiu" msgid "Tag marking book to be filed with Personal Docs" msgstr "Etiquetar el llibre marcat per a ser arxivat com documents personals" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108 msgid "All articles" msgstr "Tots els articles" @@ -2856,70 +2861,70 @@ msgstr "Tots els articles" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Aquest és un llibre Amazon Topaz. No es pot processar" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Title Page" msgstr "Pàgina del títol" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 #: /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:199 msgid "Table of Contents" msgstr "Índex" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 msgid "Index" msgstr "Índex" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Glossary" msgstr "Glossari" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Acknowledgements" msgstr "Reconeixements" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Bibliography" msgstr "Bibliografia" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Colophon" msgstr "Colofó" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Copyright" msgstr "Drets d'autor" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Dedication" msgstr "Dedicatòria" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Epigraph" msgstr "Epígraf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Foreword" msgstr "Prefaci" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "List of Illustrations" msgstr "Índex d'il·lustracions" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Tables" msgstr "Índex de taules" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Notes" msgstr "Anotacions" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Preface" msgstr "Pròleg" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Main Text" msgstr "Text principal" @@ -3390,138 +3395,138 @@ msgstr "" "Forçar la divisió de línies en la longitud màxima quan no hi ha cap espai. " "També permet que la longitud de línia màxima sigui menor que el valor mínim." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Send file to storage card instead of main memory by default" msgstr "" "Envia l'arxiu a la targeta de memòria enlloc de a la memòria principal per " "defecte." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Confirm before deleting" msgstr "Confirmeu abans d'esborrar" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Main window geometry" msgstr "Geometria de la finestra principal" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Notify when a new version is available" msgstr "Avisa'm quan hi hagi una nova versió disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Use Roman numerals for series number" msgstr "Utilitza números romans per a sèries de números" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Sort tags list by name, popularity, or rating" msgstr "Ordena la llista d'etiquetes per nom, popularitat o per rànquing" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Number of covers to show in the cover browsing mode" msgstr "" "Número de portades que es mostraran en el mode de navegació per portades" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Defaults for conversion to LRF" msgstr "Valors per defecte per a la conversió a LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:83 msgid "Options for the LRF ebook viewer" msgstr "Opcions per al lector LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Formats that are viewed using the internal viewer" msgstr "Formats que es veuen utilitzant el visor intern" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Columns to be displayed in the book list" msgstr "Columnes que es veuran en la llista de llibres" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Automatically launch content server on application startup" msgstr "" "Arrenca el contingut del servidor automàticamen en iniciar l'aplicació" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Oldest news kept in database" msgstr "Les notícies antigues es conserven en la base de dades" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Show system tray icon" msgstr "Mostra la icona a la safata del sistema" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Upload downloaded news to device" msgstr "Carrega les notícies descarregades al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "Delete books from library after uploading to device" msgstr "" "Elimina els llibres de la biblioteca després de carregar-los al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" msgstr "Mostra la portada en una finestra pròpia enlloc de la principal" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Disable notifications from the system tray icon" msgstr "Inhabilita els missatges des de la icona de la safata del sistema" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 msgid "Default action to perform when send to device button is clicked" msgstr "" "Acció per defecte per a quan el faci clic al botó d'enviar al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Maximum number of waiting worker processes" msgstr "Número màxim de processos en espera" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Download social metadata (tags/rating/etc.)" msgstr "Descarrega metadades socials (etiquetes/valoració/etc)" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Overwrite author and title with new metadata" msgstr "Sobreescriu l'autor i el títol amb les noves metadades" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "Limita el màxim de tasques simultànies al número de CPUs" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "tag browser categories not to display" msgstr "categories del navegador d'etiquetes que no s'han de mostrar" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "The layout of the user interface" msgstr "Disposició de la interfície de l'usuari" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Show the average rating per item indication in the tag browser" msgstr "" "Mostra la mitjana de les qualificacions per a cada element de l'explorador " "d'etiquetes" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 msgid "Disable UI animations" msgstr "Desactiva les animacions" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:487 msgid "Copied" msgstr "Copiat" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy" msgstr "Copia" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy to Clipboard" msgstr "Copia al porta-retalls" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466 msgid "Choose Files" msgstr "Escull fitxers" @@ -3646,12 +3651,12 @@ msgstr "No s'ha pogut llegir les metadades" msgid "Failed to read metadata from the following" msgstr "No s'ha pogut llegir les metadades del següent" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "Add to library" msgstr "Afegeix a la biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 @@ -3659,12 +3664,12 @@ msgstr "Afegeix a la biblioteca" msgid "No book selected" msgstr "Cap llibre seleccionat" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:254 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "Aquests llibres són virtuals i no es poden afegir a la biblioteca:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "No book files found" msgstr "No s'han trobat llibres" @@ -3677,7 +3682,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "Afegeix llibres a la biblioteca des d'un dispositiu connectat" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Fetch annotations (experimental)" msgstr "Recull les anotacions (experimental)" @@ -3798,7 +3803,7 @@ msgstr "Esborra la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:120 msgid "Library backup status..." -msgstr "" +msgstr "Estat de la còpia de seguretat de la biblioteca..." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:176 msgid "Rename" @@ -3847,15 +3852,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:223 msgid "none" -msgstr "" +msgstr "cap" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:224 msgid "Backup status" -msgstr "" +msgstr "Estat de la còpia de seguretat" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:225 msgid "Book metadata files remaining to be written: %s" -msgstr "" +msgstr "Fitxers de metadades que estan pendents de desar: %s" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:234 msgid "No library found" @@ -3872,7 +3877,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:267 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:272 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:685 msgid "Not allowed" msgstr "No està permès" @@ -3939,7 +3944,7 @@ msgid "Could not copy books: " msgstr "No s'ha pogut copiar els llibres: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:702 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:675 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" @@ -4005,14 +4010,14 @@ msgid "Main memory" msgstr "Memòria principal" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "Tarja de memòria A" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "Tarja de memòria B" @@ -4485,7 +4490,7 @@ msgid "The specified directory could not be processed." msgstr "La carpeta que s'ha especificat no es pot processar." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "Cap llibre" @@ -4699,7 +4704,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1105 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 msgid "Path" msgstr "Camí" @@ -4716,8 +4721,8 @@ msgid "Formats" msgstr "Formats" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1108 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 msgid "Collections" msgstr "Col·leccions" @@ -4730,8 +4735,8 @@ msgstr "Clica per obrir" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1125 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 @@ -4816,7 +4821,7 @@ msgstr "sortida" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 @@ -5376,13 +5381,13 @@ msgstr "Grup de tipus de lletra sans-se&rif:" msgid "&Monospaced font family:" msgstr "Grup de tipus de lletra &monoespaiada" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:44 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "Metadades" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:46 msgid "" "Set the metadata. The output file will contain as much of this metadata as " "possible." @@ -5390,33 +5395,33 @@ msgstr "" "Estableix les metadades. El fitxer de sortida contindrà tot el que es pugui " "d'aquestes metadades." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 msgid "Choose cover for " msgstr "Tria portada per a " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:175 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "Cannot read" msgstr "No pot llegir-se" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 msgid "You do not have permission to read the file: " msgstr "No tens permissos per a llegir l'arxiu: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:191 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Error reading file" msgstr "Error llegint l'arxiu" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 msgid "

    There was an error reading from file:
    " msgstr "

    Error llegint de l'arxiu:
    " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:192 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 msgid " is not a valid picture" msgstr " no és una imatge vàlida" @@ -5849,7 +5854,7 @@ msgstr "Sortida TXT" #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:46 msgid "&Line ending style:" -msgstr "" +msgstr "&Estil de final de línia:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:48 msgid "&Maximum line length:" @@ -5920,11 +5925,11 @@ msgstr "h6" #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:79 msgid "hr" -msgstr "" +msgstr "hr" #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:80 msgid "span" -msgstr "" +msgstr "interval" #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:81 msgid "Having the &attribute:" @@ -5947,6 +5952,13 @@ msgid "" "tag.

    To learn more advanced usage of XPath see the XPath Tutorial." msgstr "" +"

    Per exemple, per fer coincidir totes les etiquetes h2 que tinguin " +"class=\"chapter\", poseu h2 a l'etiqueta, class a l'atribut i " +"chapter a valor.

    Un atribut en blanc correspon a qualsevol " +"atribut i un valor en blanc a qualsevol valor. L'etiqueta * correspon a " +"qualsevol etiqueta.

    Si voleu saber més usos avançats d'XPath vegeu XPath " +"Tutorial.

    " #: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:118 msgid "Browse by covers" @@ -5968,7 +5980,7 @@ msgstr "No s'ha pogut carregar l'explorador de portades" #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:239 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:243 msgid "Undefined" -msgstr "" +msgstr "Sense definir" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:122 msgid "star(s)" @@ -5988,16 +6000,16 @@ msgstr " índex:" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:460 msgid "Remove series" -msgstr "" +msgstr "Elimina la sèrie" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:463 msgid "Automatically number books" -msgstr "" +msgstr "Numera els llibres automàticament" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:466 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 msgid "Force numbers to start with " -msgstr "" +msgstr "Força començar la numeració amb " #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:529 msgid "Remove all tags" @@ -6032,83 +6044,83 @@ msgstr "Obtenir llista de llibres en el dispositiu" msgid "Get annotations from device" msgstr "Obtenir anotacions del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:321 msgid "Send metadata to device" msgstr "Enviar metadades al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:326 msgid "Send collections to device" msgstr "Enviar col·leccions al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "Pujar %d llibres al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "Esborrar llibres del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "Descarregar llibres del dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "Veure llibre en el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "Assignar acció d'enviar al dispositiu per defecte" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "Envia a la memòria interna" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "Enviar a la targeta de memòria A" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "Enviar a la targeta de memòria B" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "Memòria principal" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:485 msgid "Send and delete from library" msgstr "Enviar i esborrar de la biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 msgid "Send specific format" msgstr "Enviar format específic" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:522 msgid "Eject device" msgstr "Desconnectar dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:639 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:132 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "Error" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:640 msgid "Error communicating with device" msgstr "Error en la comunicació amb el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:652 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:661 msgid "Select folder to open as device" msgstr "Seleccionar carpeta per obrir com a dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:708 msgid "Error talking to device" msgstr "Error comunicant amb el dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:700 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:709 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -6116,171 +6128,180 @@ msgstr "" "Hi ha hagut un error de comunicació amb el dispositiu. Lleve, torne a " "connectar el dispositiu i torne a iniciar el programa" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:752 msgid "Device: " msgstr "Dispositiu: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:754 msgid " detected." msgstr " detectat" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "seleccionat per enviar" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:842 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "Escull format per enviar al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "No hi ha cap dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:852 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "No s'ha pogut enviar: no hi ha cap dispositiu enviat" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:855 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:859 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "Sense targeta" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:856 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "No s'ha pogut enviar: el dispositiu no té targeta de memòria" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:901 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "Llibre electrònic:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "Trobaràs, adjunt, el llibre electrònic" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:905 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "per" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:906 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "en el format %s" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "Enviant correu electrònic a" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:957 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1112 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1231 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1239 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1059 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1248 msgid "No suitable formats" msgstr "No hi ha formats adequats" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:950 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "" +"S'ha de convertir automàticament els llibres següents abans d'enviar-los per " +"correu electrònic?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:967 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "No s'han pogut enviar els llibres següents perquè no s'han trobat formats " "adequats:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email books" msgstr "Error en enviar llibres per email" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 msgid "Failed to email the following books:" msgstr "Error en enviar els següents llibres per email:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 msgid "Sent by email:" -msgstr "" +msgstr "S'ha enviat per correu electrònic:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1009 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 msgid "News:" msgstr "Notícies:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1010 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1019 msgid "Attached is the" -msgstr "" +msgstr "S'adjunta el" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1030 msgid "Sent news to" -msgstr "" +msgstr "S'ha enviat notícies a" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1051 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1113 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1232 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1122 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1241 msgid "Auto convert the following books before uploading to the device?" msgstr "" +"Abans de pujar-los al dispositiu s'ha de convertir automàticament els " +"següents llibres?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 msgid "Sending catalogs to device." -msgstr "" +msgstr "S'estan enviant els catàlegs al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1145 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "Sending news to device." -msgstr "" +msgstr "S'estan enviant les notícies al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending books to device." -msgstr "" +msgstr "S'estan enviant els llibres al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 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 "" +"No s'ha pogut pujar els llibres següents al dispositiu, ja que no s'ha " +"trobat un format adequat. Convertiu primer el(s) llibre(s) a un format " +"compatible amb el vostre dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1313 msgid "No space on device" msgstr "Sense espai al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1304 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1314 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "

    No puc desar llibres al dispositiu perquè no hi ha espai restant " #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 msgid "Invalid template" -msgstr "" +msgstr "Plantilla no vàlida" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 msgid "The template %s is invalid:" -msgstr "" +msgstr "La plantilla %s no és vàlida:" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 msgid "Select available formats and their order for this device" msgstr "" +"Seleccioneu els formats disponibles i el seu ordre de preferència per a " +"aquest dispositiu." #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:87 msgid "Use sub directories" -msgstr "" +msgstr "Fes servir subcarpetes" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:88 msgid "Use author sort for author" -msgstr "" +msgstr "Fes servir l'ordre d'autor per autor" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:90 msgid "Save &template:" -msgstr "" +msgstr "Desa la &plantilla:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:48 msgid "Add books by ISBN" -msgstr "" +msgstr "Afegeix llibres per ISBN" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:49 msgid "" @@ -6289,86 +6310,91 @@ msgid "" "metadata and covers for them.

    Any invalid ISBNs in the list will be " "ignored." msgstr "" +"

    Introduïu una llista d'ISBN al quadre de l'esquerra, un per línia. El " +"calibre crearà automàticament entrades per als llibres fent servir l'ISBN i " +"en descarregarà les metadades i les portades.

    Els ISBN no vàlids " +"s'ignoraràn.

    " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 msgid "&Paste from clipboard" -msgstr "" +msgstr "&Enganxa des del porta-retalls" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 msgid "Fit &cover within view" -msgstr "" +msgstr "&Ajusta la portada al que és visible" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 msgid "&Previous" -msgstr "" +msgstr "&Anterior" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 msgid "&Next" -msgstr "" +msgstr "&Següent" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:38 msgid "My Books" -msgstr "" +msgstr "Els meus llibres" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:304 msgid "Generate catalog" -msgstr "" +msgstr "Genera el catàleg" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:70 msgid "Generate catalog for {0} books" -msgstr "" +msgstr "Genera el catàleg per a {0} llibres" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:71 msgid "Catalog &format:" -msgstr "" +msgstr "&Format del catàleg:" #: /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 "" +"&Títol del catàleg (es sobreescriurà qualsevol catàleg amb el mateix títol):" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:73 msgid "&Send catalog to device automatically" -msgstr "" +msgstr "&Envia automàticament el catàleg al dispositiu" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:74 msgid "Catalog options" -msgstr "" +msgstr "Opcions del catàleg" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:21 msgid "Check Library" -msgstr "" +msgstr "Comprova la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:29 msgid "Run the check" -msgstr "" +msgstr "Executa la comprobació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:205 msgid "Copy to clipboard" -msgstr "" +msgstr "Copia-ho al porta-retalls" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:48 msgid "Names to ignore:" -msgstr "" +msgstr "Noms que s'ignoraran:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:54 msgid "Extensions to ignore" -msgstr "" +msgstr "Extensions que s'ignoraran" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 msgid "Additional Information" -msgstr "" +msgstr "Informació addicional" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 msgid "Path from library" -msgstr "" +msgstr "Camí de la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 msgid "Name" -msgstr "" +msgstr "Nom" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:45 msgid "Choose Format" @@ -6376,88 +6402,90 @@ msgstr "Trieu format" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:38 msgid "Choose location for calibre library" -msgstr "" +msgstr "Tria la localització de la biblioteca del calibre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:45 msgid "Same as current" -msgstr "" +msgstr "Igual que l'actual" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:46 msgid "The location %s contains the current calibre library" -msgstr "" +msgstr "La localització %s conté la biblioteca del calibre actual" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:51 msgid "No existing library found" -msgstr "" +msgstr "No s'ha trobat cap biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:52 msgid "There is no existing calibre library at %s" -msgstr "" +msgstr "No hi ha cap biblioteca del calibre a %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:56 msgid "Not empty" -msgstr "" +msgstr "No està buit" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:57 msgid "The folder %s is not empty. Please choose an empty folder" -msgstr "" +msgstr "La carpeta %s no està buida. Trieu una altra carpeta si us plau." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:80 msgid "No location" -msgstr "" +msgstr "Sense ubicació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:80 msgid "No location selected" -msgstr "" +msgstr "No s'ha seleccionat cap ubicació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:628 msgid "Bad location" -msgstr "" +msgstr "La ubicació és incorrecta" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:85 msgid "%s is not an existing folder" -msgstr "" +msgstr "La carpeta % no existeix" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 msgid "Choose your calibre library" -msgstr "" +msgstr "Trieu la vostra biblioteca del calibre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 msgid "Your calibre library is currently located at {0}" -msgstr "" +msgstr "La vostra biblioteca del calibre està actualment situada a {0}" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:73 msgid "New &Location:" -msgstr "" +msgstr "Nova &ubicació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:74 msgid "Use &existing library at the new location" -msgstr "" +msgstr "Fes servir la biblioteca &existent a la nova ubicació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:75 msgid "&Create an empty library at the new location" -msgstr "" +msgstr "&Crea una biblioteca buida a la nova ubicació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:76 msgid "&Move current library to new location" -msgstr "" +msgstr "&Mou la biblioteca actual a la nova ubicació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:33 msgid "Set defaults for conversion of comics (CBR/CBZ files)" msgstr "" +"Defineix les opcions per defecte per a la conversió de còmics (fitxers " +"CBR/CBZ)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:48 msgid "Set options for converting %s" -msgstr "" +msgstr "Defineix les opcions per convertir %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 msgid "&Title:" -msgstr "" +msgstr "&Títol:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98 msgid "&Author(s):" -msgstr "" +msgstr "&Autor(s)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100 msgid "&Profile:" @@ -6465,11 +6493,11 @@ msgstr "&Perfil:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog_ui.py:41 msgid "Edit Comments" -msgstr "" +msgstr "Edita els comentaris" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:55 msgid "&Show this warning again" -msgstr "" +msgstr "&Mostra aquest avís la propera vegada" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:47 msgid "ERROR" @@ -6480,14 +6508,16 @@ msgid "" "All checked books will be permanently deleted from your device. " "Please verify the list." msgstr "" +"Tots els llibres que s'ha seleccionat s'esborraran permanentment del " +"vostre dispositiu. Comproveu la llista si us plau." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 msgid "Location" -msgstr "" +msgstr "Ubicació" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:280 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 @@ -6495,39 +6525,39 @@ msgid "Date" msgstr "Data" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1104 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1111 msgid "Format" msgstr "Format" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device_ui.py:50 msgid "Delete from device" -msgstr "" +msgstr "Suprimeix del dispositiu" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:34 msgid "Author sort" -msgstr "" +msgstr "Ordre per autor" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 msgid "Invalid author name" -msgstr "" +msgstr "El nom de l'autor no és vàlid" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 msgid "Author names cannot contain & characters." -msgstr "" +msgstr "Els noms d'autor no poden contenir caràcters &." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:66 msgid "Manage authors" -msgstr "" +msgstr "Administra els autors" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:67 msgid "Sort by author" -msgstr "" +msgstr "Ordena per autor" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:68 msgid "Sort by author sort" -msgstr "" +msgstr "Ordena per ordre d'autor" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:69 msgid "" @@ -6535,47 +6565,52 @@ msgid "" "author. Exactly how this value is automatically generated can be controlled " "via Preferences->Advanced->Tweaks" msgstr "" +"Restableix tots els valors d'ordre per autor a un valor generat " +"automàticament a partir de l'autor. Es pot controlar la manera exacta com es " +"genera automàticament aquest valor a Preferències->Avançat->Ajustos" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:70 msgid "Recalculate all author sort values" -msgstr "" +msgstr "Torna a calcular tots els valors d'ordre d'autor" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 msgid "Author Sort" -msgstr "" +msgstr "Ordre d'autor" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 msgid "ISBN" -msgstr "" +msgstr "ISBN" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:162 msgid "Finding metadata..." -msgstr "" +msgstr "S'esta cercant les metadades..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:176 msgid "Could not find metadata" -msgstr "" +msgstr "No s'ha trobat metadades" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:177 msgid "The metadata download seems to have stalled. Try again later." msgstr "" +"La descàrrega de metadades s'ha encallat. Torneu a intentar-ho més tard." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:186 msgid "Warning" -msgstr "" +msgstr "Avís" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:187 msgid "Could not fetch metadata from:" -msgstr "" +msgstr "No s'ha pogut aconseguir les metadades de:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:191 msgid "No metadata found" -msgstr "" +msgstr "No s'ha trobat metadades" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:192 msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" +"No s'ha trobat metadades, intenteu ajustar el títol i l'autor o l'ISBN." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 msgid "Fetch metadata" @@ -6588,10 +6623,14 @@ msgid "" "free account and enter your access key " "below." msgstr "" +"

    El calibre pot cercar metadades per als vostres llibres a dos llocs: " +"Google Books i isbndb.com.

    Per fer servir isbndb.com us heu " +"de registrar amb un compte gratuït i " +"introduir la vostra clau d'accés a continuació." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 msgid "&Access Key:" -msgstr "" +msgstr "Clau d'&accés:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:93 msgid "Fetch" @@ -7945,7 +7984,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:281 msgid "" "For help with writing advanced news recipes, please visit User Recipes" +"href=\"http://calibre-ebook.com/user_manual/news.html\">User Recipes" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:282 @@ -8151,42 +8190,42 @@ msgstr "" msgid "Eject this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:209 msgid "Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 msgid "Show books in calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 msgid "Device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 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/gui2/layout.py:67 #: /home/kovid/work/calibre/src/calibre/library/database2.py:839 msgid "Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 msgid "Show books in storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 #: /home/kovid/work/calibre/src/calibre/library/database2.py:841 msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:70 msgid "Show books in storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:110 msgid "available" msgstr "" @@ -8244,73 +8283,73 @@ msgid "Size (MB)" msgstr "Grandària (MB)" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 msgid "Book %s of %s." msgstr "Llibre %s de %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:697 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1222 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1229 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:916 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1209 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1212 msgid "Double click to edit me

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:118 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:123 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:127 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:142 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:161 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:173 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:686 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -9175,21 +9214,29 @@ msgstr "" msgid "Check the library folders for potential problems" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:43 +msgid "Device currently connected: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:46 +msgid "Device currently connected: None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:207 msgid "" "That format and device already has a plugboard or conflicts with another " "plugboard." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:240 msgid "Invalid destination" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:241 msgid "The destination field cannot be blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 msgid "" "Here you can change the metadata calibre uses to update a book when saving " "to disk or sending to device.\n" @@ -9209,39 +9256,39 @@ msgid "" "would be to specify the language." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:121 msgid "Format (choose first)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:122 msgid "Device (choose second)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:123 msgid "Add new plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:124 msgid "Edit existing plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:125 msgid "Existing plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:126 msgid "Source template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:127 msgid "Destination field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:128 msgid "Save plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:129 msgid "Delete plugboard" msgstr "" @@ -10701,7 +10748,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/caches.py:539 #: /home/kovid/work/calibre/src/calibre/library/caches.py:549 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "no" msgstr "no" @@ -10712,7 +10759,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/caches.py:542 #: /home/kovid/work/calibre/src/calibre/library/caches.py:552 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "yes" msgstr "sí" @@ -11352,7 +11399,7 @@ msgid "" " files in each directory of the calibre library. This is\n" " useful if your metadata.db file has been corrupted.\n" "\n" -" WARNING: This completely regenrates your datbase. You will\n" +" WARNING: This completely regenerates your datbase. You will\n" " lose stored per-book conversion settings and custom recipes.\n" " " msgstr "" @@ -11423,87 +11470,87 @@ msgstr "" msgid "creating custom column " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:31 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 msgid "The title" msgstr "El títol" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 msgid "The authors" msgstr "Els autors" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:34 msgid "" "The author sort string. To use only the first letter of the name use " "{author_sort[0]}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:35 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 msgid "The tags" msgstr "Les etiquetes" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 msgid "The series" msgstr "Les sèries" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:38 msgid "" "The series number. To get leading zeros use {series_index:0>3s} or " "{series_index:>3s} for leading spaces" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:40 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 msgid "The rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 msgid "The ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 msgid "The publisher" msgstr "L'editorial" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 msgid "The date" msgstr "La data" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 msgid "The published date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:46 msgid "The calibre internal id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:55 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:56 msgid "Options to control saving to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:61 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:62 msgid "" "Normally, calibre will update the metadata in the saved files from what is " "in the calibre library. Makes saving to disk slower." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:64 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:65 msgid "" "Normally, calibre will write the metadata into a separate OPF file along " "with the actual e-book files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:67 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:68 msgid "" "Normally, calibre will save the cover in a separate file along with the " "actual e-book file(s)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:70 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:71 msgid "" "Comma separated list of formats to save for each book. By default all " "available formats are saved." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:73 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:74 msgid "" "The template to control the filename and directory structure of the saved " "files. Default is \"%s\" which will save books into a per-author " @@ -11511,7 +11558,7 @@ msgid "" "are: {%s}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:78 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:79 msgid "" "The template to control the filename and directory structure of files sent " "to the device. Default is \"%s\" which will save books into a per-author " @@ -11519,7 +11566,7 @@ msgid "" "are: {%s}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:85 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:86 msgid "" "Normally, calibre will convert all non English characters into English " "equivalents for the file names. WARNING: If you turn this off, you may " @@ -11527,22 +11574,22 @@ msgid "" "saving to supports unicode." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:91 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:94 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:92 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:95 msgid "" "The format in which to display dates. %d - day, %b - month, %Y - year. " "Default is: %b, %Y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:97 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:98 msgid "Convert paths to lowercase." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:99 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:100 msgid "Replace whitespace with underscores." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:319 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:330 msgid "Requested formats not available" msgstr "" diff --git a/src/calibre/translations/da.po b/src/calibre/translations/da.po index 2d07894c57..2b0dc79e19 100644 --- a/src/calibre/translations/da.po +++ b/src/calibre/translations/da.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-10-01 21:28+0000\n" -"PO-Revision-Date: 2010-10-01 21:27+0000\n" -"Last-Translator: Kovid Goyal \n" +"POT-Creation-Date: 2010-10-03 21:03+0000\n" +"PO-Revision-Date: 2010-10-03 07:59+0000\n" +"Last-Translator: Glenn \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-02 04:59+0000\n" +"X-Launchpad-Export-Date: 2010-10-04 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Gør absolut ingenting" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:526 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:525 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:398 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -44,13 +44,13 @@ msgstr "Gør absolut ingenting" #: /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:223 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:29 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:231 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:30 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:346 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:351 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:354 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /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:49 @@ -59,8 +59,8 @@ msgstr "Gør absolut ingenting" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1017 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1129 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 @@ -78,11 +78,11 @@ msgstr "Gør absolut ingenting" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 #: /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:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:136 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:138 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:909 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:914 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:980 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 @@ -110,29 +110,29 @@ msgstr "Gør absolut ingenting" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:277 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:280 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1187 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1196 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1199 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:912 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:913 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:187 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 @@ -265,43 +265,43 @@ msgstr "Gemmer metadata i %s filerne" msgid "Set metadata from %s files" msgstr "Sæt metadata fra %s filer" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 msgid "Look and Feel" msgstr "Fremtoning" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:692 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:704 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:715 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 msgid "Interface" msgstr "Brugergrænseflade" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Tilpas calibres grænseflades fremtoning til din smag" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 msgid "Behavior" msgstr "Opførsel" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708 msgid "Change the way calibre behaves" msgstr "Ændr måden calibre opfører sig på" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:177 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:180 msgid "Add your own columns" msgstr "Tilføj dine egne søjler" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 msgid "Add/remove your own columns to the calibre book list" msgstr "Tilføj/fjern dine egne søjler til calibre boglisten" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Customize the toolbar" msgstr "Tilpas værktøjslinjen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -309,56 +309,56 @@ msgstr "" "Tilpas værktøjslinjen og kontekstmenuen, ændre hvilke aktioner som er " "tilgængelige i hver" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 msgid "Input Options" msgstr "Input tilvalg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:738 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:749 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 msgid "Conversion" msgstr "Konvertering" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 msgid "Set conversion options specific to each input format" msgstr "Vælg konverteringsvalgmuligheder specifikke for hvert input-format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 msgid "Common Options" msgstr "Fælles tilvalg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 msgid "Set conversion options common to all formats" msgstr "Vælg konverteringsvalgmuligheder fælles for alle formater" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Output Options" msgstr "Output valgmuligheder" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each output format" msgstr "Vælg konverteringsvalgmuligheder specifikke for hvert output-format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Adding books" msgstr "Tilføjer boger" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:783 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:795 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:807 msgid "Import/Export" msgstr "Import/eksport" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Control how calibre reads metadata from files when adding books" msgstr "Styre hvordan calibre læser metadata fra filer, når bøger tilføjes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 msgid "Saving books to disk" msgstr "Gemmer bøger til disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -366,32 +366,32 @@ msgstr "" "Styre hvordan calibre eksporterer filer fra dens database til disk, når gem-" "til-disk anvendes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Sending books to devices" msgstr "Sender bøger til enheder" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 msgid "Control how calibre transfers files to your ebook reader" msgstr "Styre hvordan calibre overfører filer til dil e-bogslæser" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 msgid "Metadata plugboards" -msgstr "" +msgstr "Metadata plugboards" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 msgid "Change metadata fields before saving/sending" -msgstr "" +msgstr "Ændre metadata felter før gem/send" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 msgid "Sharing books by email" msgstr "Deler bøger via email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:818 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 msgid "Sharing" msgstr "Deler" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -399,11 +399,11 @@ msgstr "" "Opsætning som deler bøger via email. Kan anvendes til automatisk sending af " "downloadede nyheder til dine enheder" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Sharing over the net" msgstr "Deler over internettet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -411,33 +411,33 @@ msgstr "" "Opsætning af calibre indholdsserveren, hvilket vil give dig adgang til dit " "calibre-bibliotek fra overalt, på enhver enhed, over internettet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 msgid "Plugins" msgstr "Udvidelsesmoduler" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:866 msgid "Advanced" msgstr "Avanceret" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Tilføj/fjern/tilpas forskellige dele af calibres funktionalitet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Tweaks" msgstr "Tweaks" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 msgid "Fine tune how calibre behaves in various contexts" msgstr "Finjustér hvordan calibre opfører sig i forskellige sammenhænge" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 msgid "Miscellaneous" msgstr "Diverse" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 msgid "Miscellaneous advanced configuration" msgstr "Diverse avanceret opsætning" @@ -904,7 +904,7 @@ msgstr "Kommunikér med MiBuk Wolder læser." #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:116 msgid "Communicate with the JetBook Mini reader." -msgstr "" +msgstr "Kommunikér med JetBook Mini reader." #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." @@ -958,7 +958,7 @@ msgid "Adding books to device metadata listing..." msgstr "Tilføjer bøger til enhedens metadataliste..." #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 msgid "Not Implemented" msgstr "Ikke implementeret" @@ -991,6 +991,10 @@ msgid "Communicate with the Pandigital Novel" msgstr "Kommunikér med Pandigital Novel" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +msgid "Communicate with the VelocityMicro" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:132 msgid "Communicate with the GM2000" msgstr "Kommunikér med GM2000" @@ -2374,54 +2378,54 @@ msgstr "" "Ekstrahér almindelige e-bogsformater fra arkiver (zip/rar)-filer. Prøv også " "at auto-detektere om de er cbz/cbr-filer." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:112 msgid "TEMPLATE ERROR" -msgstr "" +msgstr "TEMPLATE ERROR" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "No" msgstr "Nej" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "Yes" msgstr "Ja" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:550 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:289 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "Titel" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 msgid "Author(s)" msgstr "Forfatter(e)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:552 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:555 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "Udgiver" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Producer" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:557 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:212 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:213 @@ -2429,42 +2433,42 @@ msgstr "Producer" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:332 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 msgid "Comments" msgstr "Kommentarer" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:154 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1122 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:146 msgid "Tags" msgstr "Mærker" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:558 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:337 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:94 msgid "Series" msgstr "Serier" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:562 msgid "Language" msgstr "Sprog" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 msgid "Timestamp" msgstr "Tidsstempel" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:563 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:566 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 @@ -2472,7 +2476,7 @@ msgstr "Tidsstempel" msgid "Published" msgstr "Udgivet" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:565 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:568 msgid "Rights" msgstr "Rettigheder" @@ -2741,7 +2745,7 @@ msgstr "" "fra LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1303 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1397 msgid "Cover" msgstr "Omslag" @@ -2776,7 +2780,7 @@ msgstr "Deaktivér kompression af filindholdet." msgid "Tag marking book to be filed with Personal Docs" msgstr "Mærk bogen til at blive gemt med Personal Docs" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108 msgid "All articles" msgstr "Alle artikler" @@ -2786,70 +2790,70 @@ msgstr "" "E-bogen er i det proprietære Amazon Topaz format. Den kan derfor ikke " "behandles." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Title Page" msgstr "Titelside" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 #: /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:199 msgid "Table of Contents" msgstr "Indholdsfortegnelse" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 msgid "Index" msgstr "Indeks" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Glossary" msgstr "Ordliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Acknowledgements" msgstr "Anerkendelser" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Bibliography" msgstr "Litteraturliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Colophon" msgstr "Kolofon" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Copyright" msgstr "Ophavsret" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Dedication" msgstr "Dedikation" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Epigraph" msgstr "Epigraf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Foreword" msgstr "Forord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "List of Illustrations" msgstr "Illustrationsliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Tables" msgstr "Tabelliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Notes" msgstr "Bemærkninger" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Preface" msgstr "Forord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Main Text" msgstr "Hovedtekst" @@ -3306,131 +3310,131 @@ msgstr "" "Håndhæv linjedeling før max-linje-længde værdien, også når ingen mellemrum " "findes. Tillad og at max-linje-længden kan være under minimum" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Send file to storage card instead of main memory by default" msgstr "" "Send som standard filen til hukommelseskortet istedet for arbejdshukommelsen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Confirm before deleting" msgstr "Bekræft før sletning" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Main window geometry" msgstr "Arbejdsvindues geometri" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Notify when a new version is available" msgstr "Advisér når en ny version er tilgængelig" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Use Roman numerals for series number" msgstr "Anvend romertal til serienumre" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Sort tags list by name, popularity, or rating" msgstr "Sortér mærkeliste efter navn, popularitet eller vurdering" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Number of covers to show in the cover browsing mode" msgstr "Antallet af omslag, der vises i omslags browser-tilstand" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Defaults for conversion to LRF" msgstr "Standardvalg ved konvertering til LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:83 msgid "Options for the LRF ebook viewer" msgstr "Muligheder for LRF ebook læser" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Formats that are viewed using the internal viewer" msgstr "Formater som kan ses ved anvendelse af den indbyggede e-bogslæser" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Columns to be displayed in the book list" msgstr "Kolonner som vises i boglisten" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Automatically launch content server on application startup" msgstr "Start automatisk indholdsserver under applikationsopstart" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Oldest news kept in database" msgstr "Ældste nyheder gemt i databasen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Show system tray icon" msgstr "Vis systembakkeikon" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Upload downloaded news to device" msgstr "Upload downloadede nyheder til enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "Delete books from library after uploading to device" msgstr "Slet bøger fra bibliotek efter upload til enhed" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" msgstr "Vis omslag i et separat vindue, istedet for i calibres arbejdsvindue" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Disable notifications from the system tray icon" msgstr "Deaktivér adviseringer i systembakkeikonet" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 msgid "Default action to perform when send to device button is clicked" msgstr "Ønsket standardaktion når enhedsknappens trykkes" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Maximum number of waiting worker processes" msgstr "Maksimalt antal ventende opgaver" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Download social metadata (tags/rating/etc.)" msgstr "Download sociale metadata (mærker/vurderinger/osv.)" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Overwrite author and title with new metadata" msgstr "Overskriv forfatter og titel med ny metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "Begræns maksimal antal samtidige opgaver til CPU kerneantallet" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "tag browser categories not to display" msgstr "Mærk browser kategorier som ikke skal vises" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "The layout of the user interface" msgstr "Brugergrænsefladens layout" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Show the average rating per item indication in the tag browser" msgstr "Vis middelvurdering per post indikeret i mærke browseren" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 msgid "Disable UI animations" msgstr "Deaktivér brugergrænseflade animationer" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:487 msgid "Copied" msgstr "Kopieret" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy" msgstr "Kopiér" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy to Clipboard" msgstr "Kopiér til udklipsholder" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466 msgid "Choose Files" msgstr "Vælg filer" @@ -3555,12 +3559,12 @@ msgstr "Kunne ikke læse metadata" msgid "Failed to read metadata from the following" msgstr "Kunne ikke læse metadata fra følgende" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "Add to library" msgstr "Tilføj til bibliotek" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 @@ -3568,13 +3572,13 @@ msgstr "Tilføj til bibliotek" msgid "No book selected" msgstr "Ingen bog valgt" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:254 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" "Følgende bøger er virtuelle og kan ikke tilføjes til calibre-biblioteket:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "No book files found" msgstr "Ingen bogfiler fundet" @@ -3587,7 +3591,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "Tilføj bøger til calibre-biblioteket fra den forbundne enhed" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Fetch annotations (experimental)" msgstr "Hent noter (eksperimentiel)" @@ -3707,7 +3711,7 @@ msgstr "Slet bibliotek" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:120 msgid "Library backup status..." -msgstr "" +msgstr "Bibliotek backup status..." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:176 msgid "Rename" @@ -3755,15 +3759,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:223 msgid "none" -msgstr "" +msgstr "ingen" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:224 msgid "Backup status" -msgstr "" +msgstr "Backup status" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:225 msgid "Book metadata files remaining to be written: %s" -msgstr "" +msgstr "Bog metadata filer, der mangler at blive skrevet: %s" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:234 msgid "No library found" @@ -3780,7 +3784,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:267 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:272 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:685 msgid "Not allowed" msgstr "Ikke tilladt" @@ -3846,7 +3850,7 @@ msgid "Could not copy books: " msgstr "Kunne ikke kopiere bøger: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:702 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:675 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" @@ -3909,14 +3913,14 @@ msgid "Main memory" msgstr "Arbejdshukommelse" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "Hukommelsekort A" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "Hukommelsekort B" @@ -4390,7 +4394,7 @@ msgid "The specified directory could not be processed." msgstr "Den angivne mappe kunne ikke behandles." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "Ingen bøger" @@ -4602,7 +4606,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1105 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 msgid "Path" msgstr "Sti" @@ -4619,8 +4623,8 @@ msgid "Formats" msgstr "Formater" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1108 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 msgid "Collections" msgstr "Samlinger" @@ -4633,8 +4637,8 @@ msgstr "Klik for at åbne" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1125 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 @@ -4719,7 +4723,7 @@ msgstr "output" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 @@ -5278,46 +5282,46 @@ msgstr "S&ans-serif skriftsfamilie:" msgid "&Monospaced font family:" msgstr "&Monospaced skriftsfamilie:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:44 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "Metadata" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:46 msgid "" "Set the metadata. The output file will contain as much of this metadata as " "possible." msgstr "" "Angiv metadata. Output-filen vil indeholde så meget metadata som muligt." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 msgid "Choose cover for " msgstr "Vælg omslag til " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:175 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "Cannot read" msgstr "Kan ikke læse" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 msgid "You do not have permission to read the file: " msgstr "Du har ikke tilladelse til at læse filen: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:191 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Error reading file" msgstr "Fejl ved fillæsning" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 msgid "

    There was an error reading from file:
    " msgstr "

    Der var en fejl ved læsning af filen:
    " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:192 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 msgid " is not a valid picture" msgstr " er ikke valid billede" @@ -5893,16 +5897,16 @@ msgstr " indeks:" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:460 msgid "Remove series" -msgstr "" +msgstr "Fjerner series" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:463 msgid "Automatically number books" -msgstr "" +msgstr "Numrér automatisk bøger" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:466 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 msgid "Force numbers to start with " -msgstr "" +msgstr "Start nummerering fra " #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:529 msgid "Remove all tags" @@ -5937,83 +5941,83 @@ msgstr "Hent liste af bøger fra enheden" msgid "Get annotations from device" msgstr "Hent noter fra enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:321 msgid "Send metadata to device" msgstr "Send metadata til enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:326 msgid "Send collections to device" msgstr "Send collections til enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "Upload %d bøger til enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "Slet bøger fra enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "Download bøger fra enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "Se bøger på enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "Angiv standard send til enhedsaktion" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "Send til arbejdshukommelse" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "Send til hukommelseskort A" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "Send til hukommelseskort B" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "Arbejdshukommelse" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:485 msgid "Send and delete from library" msgstr "Send og slet fra bibliotek" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 msgid "Send specific format" msgstr "Send specifik format" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:522 msgid "Eject device" msgstr "Skub enhed ud" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:639 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:132 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "Fejl" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:640 msgid "Error communicating with device" msgstr "Kommunikationsfejl med enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:652 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:661 msgid "Select folder to open as device" msgstr "Vælg mappe til at åbne som enhed" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:708 msgid "Error talking to device" msgstr "Fejl ved kommunikation med enhed" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:700 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:709 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -6021,123 +6025,123 @@ msgstr "" "Der var en midlertidig fejl ved kommunikation med enheden. Afbryd og " "genforbind enheden eller genstart." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:752 msgid "Device: " msgstr "Enhed: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:754 msgid " detected." msgstr " detekteret." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "valgt til at sende" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:842 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "Vælg format til at sende til enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "Ingen enhed" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:852 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "Kan ikke sende: Ingen enhed er forbundet" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:855 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:859 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "Intet hukommelseskort" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:856 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "Kan ikke sende: Enheden har intet hukommelseskort" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:901 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "E-bog:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "Tilknyttet, vil du finde e-bogen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:905 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "af" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:906 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "i %s formatet." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "Sender e-mail til" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:957 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1112 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1231 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1239 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1059 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1248 msgid "No suitable formats" msgstr "Ingen egnede formater" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:950 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "Auto konvertér følgende bøger før sending via e-mail?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:967 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "Kunne ikke e-maile følgende bøger da ingen egnede formater blev fundet:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email books" msgstr "Fejlede med at e-maile bøger" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 msgid "Failed to email the following books:" msgstr "Fejlede med at e-maile følgende bøger:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 msgid "Sent by email:" msgstr "Sendt via e-mail:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1009 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 msgid "News:" msgstr "Nyheder:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1010 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1019 msgid "Attached is the" msgstr "Forbundet er" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1030 msgid "Sent news to" msgstr "Send nyheder til" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1051 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1113 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1232 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1122 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1241 msgid "Auto convert the following books before uploading to the device?" msgstr "Auto konvertér følgende bøger før upload til enheden?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 msgid "Sending catalogs to device." msgstr "Sender kataloger til enheden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1145 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "Sending news to device." msgstr "Sender nyheder til enheden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending books to device." msgstr "Sender bøger til enheden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 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." @@ -6145,11 +6149,11 @@ msgstr "" "Kunne ikke uploade følgende bøger til enheden, da ingen egnede formater blev " "fundet. Konvertér bog/bøgerne til et format understøttet af din enhed først." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1313 msgid "No space on device" msgstr "Ingen plads på enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1304 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1314 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -6158,14 +6162,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 msgid "Invalid template" msgstr "Ugyldig skabelon" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 msgid "The template %s is invalid:" msgstr "Skabelonen %s er ugyldig:" @@ -6250,11 +6254,11 @@ msgstr "Katalog valgmuligheder" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:21 msgid "Check Library" -msgstr "" +msgstr "Check bibliotek" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:29 msgid "Run the check" -msgstr "" +msgstr "Kører checket" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:205 @@ -6263,19 +6267,19 @@ msgstr "Kopiér til udklipsholder" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:48 msgid "Names to ignore:" -msgstr "" +msgstr "Navne der skal ignoreres:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:54 msgid "Extensions to ignore" -msgstr "" +msgstr "Fil-extensions der skal ignoreres" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 msgid "Additional Information" -msgstr "" +msgstr "Yderligere information" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 msgid "Path from library" -msgstr "" +msgstr "Sti fra bibliotek" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 @@ -6401,7 +6405,7 @@ msgstr "Placering" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:280 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 @@ -6409,7 +6413,7 @@ msgid "Date" msgstr "Dato" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1104 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1111 msgid "Format" msgstr "Format" @@ -6424,12 +6428,12 @@ msgstr "Forfattersortering" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 msgid "Invalid author name" -msgstr "" +msgstr "Ugyldigt forfatternavn" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 msgid "Author names cannot contain & characters." -msgstr "" +msgstr "Forfatternavne kan ikke indeholde & tegnet." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:66 msgid "Manage authors" @@ -6561,19 +6565,19 @@ msgstr "Stop &alle ikke-enhedsopgaver" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:25 msgid "Title/Author" -msgstr "" +msgstr "Titel/forfatter" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:26 msgid "Standard metadata" -msgstr "" +msgstr "Standard metadata" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:27 msgid "Custom metadata" -msgstr "" +msgstr "Tilpas metadata" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:28 msgid "Search/Replace" -msgstr "" +msgstr "Søg/Erstat" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:76 @@ -6597,23 +6601,23 @@ msgstr "Titel STORE/små bogstaver" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:185 msgid "Character match" -msgstr "" +msgstr "Tegn match" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 msgid "Regular Expression" -msgstr "" +msgstr "Regulært udtryk" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 msgid "Replace field" -msgstr "" +msgstr "Erstat felt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 msgid "Prepend to field" -msgstr "" +msgstr "Tilføj til feltindholdets start" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:191 msgid "Append to field" -msgstr "" +msgstr "Tilføj til felt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:202 msgid "Editing meta information for %d books" @@ -6631,6 +6635,11 @@ msgid "" "before proceeding.

    Search and replace in text fields using character " "matching or regular expressions. " msgstr "" +"Du kan ødelægge biblioteket ved at anvende denne egenskab. Ændringer " +"er permanente. Der er ingen fortryd-funktion. Denne egenskab er " +"eksperimentiel, og der kan være programfejl. Du opfordres stærkt til at " +"sikkerhedskopiere biblioteket før du fortsætter.

    Søg og erstat i " +"tekstfelter ved anvendelse af tegn-matching eller regulært udtryk. " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:279 msgid "" @@ -6641,6 +6650,12 @@ msgid "" "checked, the search text must match exactly. If it is unchecked, the search " "text will match both upper- and lower-case letters" msgstr "" +"I tegntilstand, søges feltet for den indtastede søgestreng. Søgefund " +"erstattes med den angivne tekst overalt hvor den findes i det angivne felt. " +"Efter erstatningsprocessen er fuldført, kan teksten ændres til store, små " +"bogstaver eller titel-case. Hvis \"skeln mellem store og små bogstaver\" " +"boksen hakkes af, skal søgeteksten matche. Hvis boksen ikke hakkes af, vil " +"der ikke blive skelnet mellem store og små bogstaver" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:290 msgid "" @@ -6656,10 +6671,21 @@ msgid "" "information on python's regular expressions, and in particular the 'sub' " "function." msgstr "" +"I regulært udtryk tilstand, er søgeteksten et vilkårligt python-kompatibelt " +"regulært udtryk. Erstatningsteksten kan indeholde backreferencer til " +"parantesomsluttede deludtryk i søgemønsteret. Søgningen er ikke " +"fastforankret, og kan matche og erstatte flere gange på den samme streng. " +"Modifikationsfunktioner (\"skeln mellem store og små bogstaver\" osv.) " +"anvendes på tekstfundet, ikke til feltet som helhed. Destinationsboksen " +"angiver feltet, hvor resultatet efter matchning og erstatning skal tildeles. " +"Du kan erstatte teksten i feltet - eller tilføje den matchede tekst til " +"front eller ende. Se " +"denne reference for mere information om python's regulære udtryk, og " +"især 'sub'-funktionen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:432 msgid "You must specify a destination when source is a composite field" -msgstr "" +msgstr "Du skal angive en destination, når kilden er et sammensat felt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:532 @@ -6671,10 +6697,11 @@ msgstr "Søg/erstat ugyldig" msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" +"Forfattere kan ikke være den tomme streng. Bogtitel %s behandles ikke" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:533 msgid "Title cannot be set to the empty string. Book title %s not processed" -msgstr "" +msgstr "Titler kan ikke være den tomme streng. Bogtitel %s behandles ikke" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:624 msgid "Search pattern is invalid: %s" @@ -6685,6 +6712,8 @@ msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." msgstr "" +"Udfører ændringer på %d bøger.\n" +"Fase {0} {1}%%." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:314 msgid "Edit Meta information" @@ -6756,11 +6785,11 @@ msgstr "Fjern alt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 msgid "If checked, the series will be cleared" -msgstr "" +msgstr "Hvis hakket af, vil series blive fjernet" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 msgid "Clear series" -msgstr "" +msgstr "Fjern series" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 msgid "" @@ -6799,6 +6828,9 @@ msgid "" "checked,\n" "title and author are swapped before the title case is set" msgstr "" +"Vælg titlen til at være i titel-case. Hvis både denne og ombyt-forfattere er " +"hakket af,\n" +"vil titel og forfatter blive byttet før titel-case anvendes" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 msgid "" @@ -6830,17 +6862,19 @@ msgstr "Søg &felt:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:359 msgid "The name of the field that you want to search" -msgstr "" +msgstr "Feltnavnet du ønsker at søge efter" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:360 msgid "Search mode:" -msgstr "" +msgstr "Søgetilstand:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:361 msgid "" "Choose whether to use basic text matching or advanced regular expression " "matching" msgstr "" +"Vælg om der ønskes anvendt almindelig matching - eller avanceret regulært " +"udtryk matching" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:362 msgid "&Search for:" @@ -6851,16 +6885,21 @@ msgid "" "Enter the what you are looking for, either plain text or a regular " "expression, depending on the mode" msgstr "" +"Indtast hvad du søger efter, enten almindelig tekst - eller et regulært " +"udtryk, afhængig af valgt søgetilstand" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 msgid "" "Check this box if the search string must match exactly upper and lower case. " "Uncheck it if case is to be ignored" msgstr "" +"Sæt hak i denne boks, hvis søgestrengen også skal skelnes mellem store og " +"små bogstaver. Fjern hak, hvis der ikke skal skelnes mellem store og små " +"bogstaver" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:365 msgid "Case sensitive" -msgstr "" +msgstr "Skeln mellem store og små bogstaver" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 msgid "&Replace with:" @@ -6871,10 +6910,12 @@ msgid "" "The replacement text. The matched search text will be replaced with this " "string" msgstr "" +"Erstatningsteksten. Den matchede søgefund vil bliver erstattet med denne " +"tekststreng" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 msgid "Apply function after replace:" -msgstr "" +msgstr "Anvend funktion efter erstat:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 msgid "" @@ -6886,21 +6927,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:371 msgid "&Destination field:" -msgstr "" +msgstr "&Destinationsfelt:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 msgid "" "The field that the text will be put into after all replacements. If blank, " "the source field is used." msgstr "" +"Feltet som teksten skal isættes efter alle erstatninger. Hvis tom, vil " +"kildefeltet blive anvendt." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:373 msgid "Mode:" -msgstr "" +msgstr "Tilstand:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:374 msgid "Specify how the text should be copied into the destination." -msgstr "" +msgstr "Angiv hvordan teksten skal kopieres til destinationen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:375 msgid "" @@ -6908,10 +6951,13 @@ msgid "" "comma or\n" "nothing should be put between the original text and the inserted text" msgstr "" +"Hvis erstatningstilstand er tilføj til tekstfront eller tekstende, så skal " +"denne boks indikere om et komma eller\n" +"ej skal indsættes mellem den oprindelige tekst - og det tilføjede tekst" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 msgid "use comma" -msgstr "" +msgstr "anvend komma" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 msgid "Test &text" @@ -7183,7 +7229,7 @@ msgstr "Fjern kanter (hvis nogen) fra omslag" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 msgid "T&rim" -msgstr "" +msgstr "&Justér" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 msgid "Reset cover to default" @@ -7921,11 +7967,8 @@ msgstr "&Tilføj feed" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:281 msgid "" "For help with writing advanced news recipes, please visit User Recipes" +"href=\"http://calibre-ebook.com/user_manual/news.html\">User Recipes" msgstr "" -"For hjælp med at skrive avancerede nyhedsopskrifter, venligst besøg brugeropskrifter" -"" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:282 msgid "Recipe source code (python)" @@ -8150,42 +8193,42 @@ msgstr " - Opgaver" msgid "Eject this device" msgstr "Skub denne enhed ud" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:209 msgid "Library" msgstr "Bibliotek" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 msgid "Show books in calibre library" msgstr "Vis bøger i calibre-bibliotek" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 msgid "Device" msgstr "Enhed" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 msgid "Show books in the main memory of the device" msgstr "Vis bøger i enhedens arbejdshukommelse" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 #: /home/kovid/work/calibre/src/calibre/library/database2.py:839 msgid "Card A" msgstr "Kort A" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 msgid "Show books in storage card A" msgstr "Vis bøger i hukommelseskort A" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 #: /home/kovid/work/calibre/src/calibre/library/database2.py:841 msgid "Card B" msgstr "Kort B" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:70 msgid "Show books in storage card B" msgstr "Vis bøger i hukommelseskort B" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:110 msgid "available" msgstr "tilgængelige" @@ -8246,73 +8289,73 @@ msgid "Size (MB)" msgstr "Størrelse (MB)" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 msgid "Book %s of %s." msgstr "Bog %s af %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:697 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1222 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1229 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 msgid "The lookup/search name is \"{0}\"" msgstr "Opslaget/søgenavn er \"{0}\"" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:916 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 msgid "In Library" msgstr "I bibliotek" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 msgid "Size" msgstr "Størrelse" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1209 msgid "Marked for deletion" msgstr "Markeret til sletning" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1212 msgid "Double click to edit me

    " msgstr "Dobbeltklik for at redigere mig

    " -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:118 msgid "Hide column %s" msgstr "Gem kolonne %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:123 msgid "Sort on %s" msgstr "Sortér efter %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 msgid "Ascending" msgstr "Stigende" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:127 msgid "Descending" msgstr "Faldende" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 msgid "Change text alignment for %s" msgstr "Ændre tekstjustering for %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Left" msgstr "Venstre" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Right" msgstr "Højre" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:142 msgid "Center" msgstr "Centrér" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:161 msgid "Show column" msgstr "Vis kolonne" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:173 msgid "Restore default layout" msgstr "Gendan standard layout" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:686 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8547,19 +8590,19 @@ msgstr "Ingen match fundet for denne book" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 msgid "Failed to download metadata" -msgstr "" +msgstr "Hentning af metadata fejlede" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:217 msgid "cover" -msgstr "" +msgstr "omslag" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:218 msgid "Downloaded" -msgstr "" +msgstr "Hentet" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:218 msgid "Failed to get" -msgstr "" +msgstr "Hentning fejlede" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:219 msgid "%s %s for: %s" @@ -8572,11 +8615,11 @@ msgstr "Fuldført" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:279 msgid "Successfully downloaded metadata for %d out of %d books" -msgstr "" +msgstr "Metadata hentning lykkedes for %d ud af %d bøger" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:281 msgid "Details" -msgstr "" +msgstr "Detaljer" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/__init__.py:36 msgid "" @@ -8830,7 +8873,7 @@ msgstr "Ja/Nej" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 msgid "Column built from other columns" -msgstr "" +msgstr "Søjle bygget fra andre søjler" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 msgid "No column selected" @@ -8878,7 +8921,7 @@ msgstr "Overskriften %s er allerede brugt" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:156 msgid "You must enter a template for composite columns" -msgstr "" +msgstr "Du skal indtaste en skabelon for sammensatte søjler" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 @@ -8954,11 +8997,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 msgid "Default: (nothing)" -msgstr "" +msgstr "Standard: (intet)" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 msgid "&Template" -msgstr "" +msgstr "&Skabelon" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/device_debug.py:21 msgid "Getting debug information" @@ -9184,13 +9227,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:101 msgid "Backup metadata" -msgstr "" +msgstr "Backup metadata" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:102 msgid "" "Metadata will be backed up while calibre is running, at the rate of 30 books " "per minute." msgstr "" +"Der vil blive taget sikkerhedskopi af metadata mens calibre kører, med en " +"hastighed på 30 bøger per minut." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:133 msgid "Failed to install command line tools." @@ -9238,27 +9283,37 @@ msgstr "&Installér kommandolinje værktøj" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:76 msgid "Back up metadata of all books" -msgstr "" +msgstr "Sikkerhedskopiér metadata af alle bøger" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:77 msgid "Check the library folders for potential problems" +msgstr "Check biblioteksmapper for potentielle problemer" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:43 +msgid "Device currently connected: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:46 +msgid "Device currently connected: None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:207 msgid "" "That format and device already has a plugboard or conflicts with another " "plugboard." msgstr "" +"Dette format og enhed har allerede et plugboard - eller konflikter med et " +"andet plugboard." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:240 msgid "Invalid destination" -msgstr "" +msgstr "Ugyldig destination" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:241 msgid "The destination field cannot be blank" -msgstr "" +msgstr "Destinationsfeltet kan ikke være tomt" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 msgid "" "Here you can change the metadata calibre uses to update a book when saving " "to disk or sending to device.\n" @@ -9278,41 +9333,41 @@ msgid "" "would be to specify the language." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 -msgid "Format (choose first)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 -msgid "Device (choose second)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:115 -msgid "Add new plugboard" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:116 -msgid "Edit existing plugboard" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:117 -msgid "Existing plugboards" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:118 -msgid "Source template" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:119 -msgid "Destination field" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:120 -msgid "Save plugboard" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:121 +msgid "Format (choose first)" +msgstr "Formatér (vælg først)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:122 +msgid "Device (choose second)" +msgstr "Enhed (vælg anden)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:123 +msgid "Add new plugboard" +msgstr "Tilføj nyt plugboard" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:124 +msgid "Edit existing plugboard" +msgstr "Redigér eksisterende plugboard" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:125 +msgid "Existing plugboards" +msgstr "Eksisterende plugboards" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:126 +msgid "Source template" +msgstr "Kildeskabelon" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:127 +msgid "Destination field" +msgstr "Destinationsfelt" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:128 +msgid "Save plugboard" +msgstr "Gem plugboard" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:129 msgid "Delete plugboard" -msgstr "" +msgstr "Slet plugboard" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:100 msgid "%(plugin_type)s %(plugins)s" @@ -9406,7 +9461,7 @@ msgstr "&Tilføj" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:33 msgid "Any custom field" -msgstr "" +msgstr "Ethvert brugerdefineret felt" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:34 msgid "The lookup name of any custom field. These names begin with \"#\")" @@ -10884,7 +10939,7 @@ msgstr "umarkeret" #: /home/kovid/work/calibre/src/calibre/library/caches.py:539 #: /home/kovid/work/calibre/src/calibre/library/caches.py:549 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "no" msgstr "nej" @@ -10895,7 +10950,7 @@ msgstr "markeret" #: /home/kovid/work/calibre/src/calibre/library/caches.py:542 #: /home/kovid/work/calibre/src/calibre/library/caches.py:552 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "yes" msgstr "ja" @@ -11151,35 +11206,35 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:17 msgid "Invalid titles" -msgstr "" +msgstr "Ugyldige titler" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:18 msgid "Extra titles" -msgstr "" +msgstr "Extra titler" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:19 msgid "Invalid authors" -msgstr "" +msgstr "Ugyldige forfattere" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:20 msgid "Extra authors" -msgstr "" +msgstr "Ekstra forfattere" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:21 msgid "Missing book formats" -msgstr "" +msgstr "Manglende bogformater" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:22 msgid "Extra book formats" -msgstr "" +msgstr "Ekstra bogformater" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:23 msgid "Unknown files in books" -msgstr "" +msgstr "Ukendte filer i bøger" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:24 msgid "Folders raising exception" -msgstr "" +msgstr "Mapper som giver exception-vink" #: /home/kovid/work/calibre/src/calibre/library/cli.py:43 msgid "" @@ -11704,32 +11759,42 @@ msgid "" "Perform some checks on the filesystem representing a library. Reports are " "{0}\n" msgstr "" +"%prog check_library [options]\n" +"\n" +"Udføre nogle check på filsystemet som repræsenterer et bibliotek. Rapporter " +"er {0}\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:886 msgid "Output in CSV" -msgstr "" +msgstr "Output i CSV" #: /home/kovid/work/calibre/src/calibre/library/cli.py:889 msgid "" "Comma-separated list of reports.\n" "Default: all" msgstr "" +"Komma-separeret liste af rapporter.\n" +"Standard: Alle" #: /home/kovid/work/calibre/src/calibre/library/cli.py:893 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" msgstr "" +"Komma-separeret liste af fil-extensions som ignoreres.\n" +"Standard: Alle" #: /home/kovid/work/calibre/src/calibre/library/cli.py:897 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" +"Komma-separeret liste af navne som ignoreres.\n" +"Standard: Alle" #: /home/kovid/work/calibre/src/calibre/library/cli.py:927 msgid "Unknown report check" -msgstr "" +msgstr "Ukendt rapport check" #: /home/kovid/work/calibre/src/calibre/library/cli.py:966 msgid "" @@ -11740,10 +11805,21 @@ msgid "" " files in each directory of the calibre library. This is\n" " useful if your metadata.db file has been corrupted.\n" "\n" -" WARNING: This completely regenrates your datbase. You will\n" +" WARNING: This completely regenerates your datbase. You will\n" " lose stored per-book conversion settings and custom recipes.\n" " " msgstr "" +"\n" +" %prog restore_database [options]\n" +"\n" +" Gendanner denne database fra metadataene gemt i OPF-\n" +" filer i hver af bibliotekets mapper. Dette er\n" +" brugbart hvis din metadata.db fil er blevet forvansket.\n" +"\n" +" ADVARSEL: Dette vil fuldstændig regenerere din database. Du vil\n" +" miste gemte per-bog konverteringsindstillinger og brugerdefinerede " +"recipes.\n" +" " #: /home/kovid/work/calibre/src/calibre/library/cli.py:1019 msgid "" @@ -11815,21 +11891,21 @@ msgstr "Vurderinger" #: /home/kovid/work/calibre/src/calibre/library/restore.py:117 msgid "Processed" -msgstr "" +msgstr "Behandlet" #: /home/kovid/work/calibre/src/calibre/library/restore.py:182 msgid "creating custom column " -msgstr "" +msgstr "opret tilpasset søjle " -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:31 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 msgid "The title" msgstr "Titlen" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 msgid "The authors" msgstr "Forfatterne" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:34 msgid "" "The author sort string. To use only the first letter of the name use " "{author_sort[0]}" @@ -11837,15 +11913,15 @@ msgstr "" "Forfatter sorteringsstrengen. For kun at anvende første bogstav af navnet, " "brug {author_sort[0]}" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:35 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 msgid "The tags" msgstr "Mærkerne" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 msgid "The series" msgstr "Serierne" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:38 msgid "" "The series number. To get leading zeros use {series_index:0>3s} or " "{series_index:>3s} for leading spaces" @@ -11853,35 +11929,35 @@ msgstr "" "Seriens nummer. For at få foranstillede nuller brug {series_index:0>3s} " "eller {series_index:>3s} for foranstillede mellemrum" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:40 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 msgid "The rating" msgstr "Vurderingen" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 msgid "The ISBN" msgstr "ISBN" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 msgid "The publisher" msgstr "Udgiveren" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 msgid "The date" msgstr "Datoen" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 msgid "The published date" msgstr "Publiseringsdatoen" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:46 msgid "The calibre internal id" msgstr "Calibre intern id" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:55 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:56 msgid "Options to control saving to disk" msgstr "Valg til at styre gem-til-disk" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:61 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:62 msgid "" "Normally, calibre will update the metadata in the saved files from what is " "in the calibre library. Makes saving to disk slower." @@ -11889,7 +11965,7 @@ msgstr "" "Normalt vil calibre opdatere metadataene i de gemte filer fra hvad der er i " "calibre-biblioteket. Gør gem-til-disk langsommere." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:64 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:65 msgid "" "Normally, calibre will write the metadata into a separate OPF file along " "with the actual e-book files." @@ -11897,7 +11973,7 @@ msgstr "" "Normalt, vil calibre skrive metadataene til en separat OPF-fil sammen med de " "aktuelle e-bog-filer." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:67 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:68 msgid "" "Normally, calibre will save the cover in a separate file along with the " "actual e-book file(s)." @@ -11905,7 +11981,7 @@ msgstr "" "Normalt, vil calibre gemme omslaget i en separat fil sammen med den aktuelle " "e-bogfil(er)." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:70 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:71 msgid "" "Comma separated list of formats to save for each book. By default all " "available formats are saved." @@ -11913,7 +11989,7 @@ msgstr "" "Kommasepareret liste af formater, som gemmes for hver bog. Som standard " "gemmes alle tilgængelige formater." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:73 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:74 msgid "" "The template to control the filename and directory structure of the saved " "files. Default is \"%s\" which will save books into a per-author " @@ -11924,7 +12000,7 @@ msgstr "" "Standard er \"%s\" som vil gemme bøgerne i en per-forfatter undermappe med " "filnavne indeholdende titel og forfatter. Tilgængelige valg er: {%s}" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:78 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:79 msgid "" "The template to control the filename and directory structure of files sent " "to the device. Default is \"%s\" which will save books into a per-author " @@ -11936,7 +12012,7 @@ msgstr "" "undermappe med filnavne indeholdende titel og forfatter. Tilgængelige valg " "er: {%s}" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:85 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:86 msgid "" "Normally, calibre will convert all non English characters into English " "equivalents for the file names. WARNING: If you turn this off, you may " @@ -11948,8 +12024,8 @@ msgstr "" "opleve fejl under gemning, afhængig af hvor godt filsystemet du gemmer i, " "understøtter unicode." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:91 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:94 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:92 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:95 msgid "" "The format in which to display dates. %d - day, %b - month, %Y - year. " "Default is: %b, %Y" @@ -11957,15 +12033,15 @@ msgstr "" "Formatet i hvilket datoer vises i. %d - dag, %b - måned, %Y - år. Standard " "er: %b, %Y" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:97 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:98 msgid "Convert paths to lowercase." msgstr "Konvertér stier til småbogstaver." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:99 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:100 msgid "Replace whitespace with underscores." msgstr "Udskift blanktegn med bundstreger." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:319 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:330 msgid "Requested formats not available" msgstr "Ønskede formater ikke tilgængelig" @@ -12261,7 +12337,7 @@ msgstr "Tysk (AT)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:115 msgid "French (BE)" -msgstr "" +msgstr "Fransk (BE)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:116 msgid "Dutch (NL)" @@ -12273,41 +12349,43 @@ msgstr "Hollansk (BE)" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:56 msgid "Choose theme (needs restart)" -msgstr "" +msgstr "Vælg tema (genstart nødvendig)" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:188 msgid "No interpreter" -msgstr "" +msgstr "Ingen fortolker" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:189 msgid "No active interpreter found. Try restarting the console" -msgstr "" +msgstr "Ingen aktiv fortolker fundet. Prøv at genstarte konsolen" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:203 msgid "Interpreter died" -msgstr "" +msgstr "Fortolker døde" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:204 msgid "" "Interpreter dies while excuting a command. To see the command, click Show " "details" msgstr "" +"Fortolker døde mens en kommando blev udført. For at se kommandoen, klik " +"\"Vis detaljer\"" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:20 msgid "Welcome to" -msgstr "" +msgstr "Velkommen til" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:41 msgid " console " -msgstr "" +msgstr " konsol " #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:51 msgid "Code is running" -msgstr "" +msgstr "Program kører" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:58 msgid "Restart console" -msgstr "" +msgstr "Genstart konsol" #: /home/kovid/work/calibre/src/calibre/utils/sftp.py:53 msgid "URL must have the scheme sftp" @@ -14034,6 +14112,14 @@ msgstr "Download ikke CSS-stilark" #~ "Automatisk opret forfattersorteringsindgang baseret på den aktuelle " #~ "forfatterindgang" +#~ msgid "" +#~ "For help with writing advanced news recipes, please visit User Recipes" +#~ msgstr "" +#~ "For hjælp med at skrive avancerede nyhedsopskrifter, venligst besøg brugeropskrifter" +#~ "" + #~ msgid "Books located at" #~ msgstr "Bøger placeret ved" diff --git a/src/calibre/translations/de.po b/src/calibre/translations/de.po index 5238e5a8ad..60ef7d3306 100644 --- a/src/calibre/translations/de.po +++ b/src/calibre/translations/de.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-01 21:28+0000\n" -"PO-Revision-Date: 2010-10-01 21:12+0000\n" +"POT-Creation-Date: 2010-10-03 21:03+0000\n" +"PO-Revision-Date: 2010-10-03 22:00+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-02 05:00+0000\n" +"X-Launchpad-Export-Date: 2010-10-04 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -32,7 +32,7 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:526 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:525 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:398 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -45,13 +45,13 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:223 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:29 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:231 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:30 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:346 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:351 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:354 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /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:49 @@ -60,8 +60,8 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1017 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1129 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 @@ -79,11 +79,11 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 #: /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:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:136 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:138 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:909 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:914 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:980 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 @@ -111,29 +111,29 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:277 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:280 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1187 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1196 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1199 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:912 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:913 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:187 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 @@ -266,132 +266,132 @@ msgstr "Geben Sie die Metadaten in %s-Dateien an" msgid "Set metadata from %s files" msgstr "Geben Sie die Metadaten von %s-Dateien an" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 msgid "Look and Feel" msgstr "Erscheinungsbild" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:692 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:704 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:715 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 msgid "Interface" msgstr "Bedienungsoberfläche" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Passen sie das Erscheinungsbild von calibre ihren Bedürfnissen an." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 msgid "Behavior" msgstr "Verhalten" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708 msgid "Change the way calibre behaves" msgstr "Ändern sie das Verhalten von calibre." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:177 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:180 msgid "Add your own columns" msgstr "Eigene Spalten hinzufügen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 msgid "Add/remove your own columns to the calibre book list" msgstr "Hinzufügen/Entfernen eigener Spalten in der calibre Buchliste" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Customize the toolbar" msgstr "Werkzeugleiste anpassen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "Passt individuell Werkzeugleiste und Kontextmenus an." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 msgid "Input Options" msgstr "Eingabeoptionen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:738 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:749 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 msgid "Conversion" msgstr "Konvertierung" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 msgid "Set conversion options specific to each input format" msgstr "Stellt Eingabeoptionen für jedes einzelne Eingabeformat ein." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 msgid "Common Options" msgstr "Allgemeine Einstellungen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 msgid "Set conversion options common to all formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Output Options" msgstr "Ausgabeoptionen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each output format" msgstr "" "Konvertierungsoptionen für jedes Ausgabeformat individuell einstellen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Adding books" msgstr "Bücher hinzuzufügen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:783 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:795 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:807 msgid "Import/Export" msgstr "Import/Export" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Stellt ein, wie Calibre mit den Metadaten aus den Dateien beim Einlesen von " "Büchern verfährt." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 msgid "Saving books to disk" msgstr "Bücher auf Datenträger speichern" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Sending books to devices" msgstr "Übertragen der Bücher an Geräte" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 msgid "Control how calibre transfers files to your ebook reader" msgstr "Stellt ein, wie Calibre die Dateien an den eBook-Reader sendet." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 msgid "Change metadata fields before saving/sending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 msgid "Sharing books by email" msgstr "Bücherversand per Email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:818 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 msgid "Sharing" msgstr "Versand" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -399,43 +399,43 @@ msgstr "" "Setup für Bücherversand per Email. Kann für den automatischen Versand von " "heruntergeladenen Nachrichten an Ihr Gerät genutzt werden." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Sharing over the net" msgstr "Versand über Netzwerk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:866 msgid "Advanced" msgstr "Erweitert" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 msgid "Miscellaneous" msgstr "Verschiedenes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 msgid "Miscellaneous advanced configuration" msgstr "Konfiguration verschiedener fortgeschrittener Parameter." @@ -954,7 +954,7 @@ msgid "Adding books to device metadata listing..." msgstr "Bücher zur Metadaten-Liste des Geräts hinzufügen ..." #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 msgid "Not Implemented" msgstr "Nicht implementiert" @@ -988,6 +988,10 @@ msgid "Communicate with the Pandigital Novel" msgstr "Kommunikation mit dem Pandigital Novel" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +msgid "Communicate with the VelocityMicro" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:132 msgid "Communicate with the GM2000" msgstr "Kommunikation mit dem GM2000" @@ -2400,54 +2404,54 @@ msgstr "" "Extrahiere bekannte eBook-Formate aus Archivdateien (ZIP/RAR). Versuche " "zudem zu erkennen, ob diese Dateien eventuell CBZ/CBR Dateien sind." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:112 msgid "TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "No" msgstr "Nein" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "Yes" msgstr "Ja" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:550 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:289 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "Titel" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 msgid "Author(s)" msgstr "Autor(en)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:552 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:555 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "Herausgeber" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Produzent" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:557 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:212 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:213 @@ -2455,42 +2459,42 @@ msgstr "Produzent" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:332 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 msgid "Comments" msgstr "Bemerkung" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:154 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1122 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:146 msgid "Tags" msgstr "Etiketten (Tags)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:558 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:337 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:94 msgid "Series" msgstr "Reihe" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:562 msgid "Language" msgstr "Sprache" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 msgid "Timestamp" msgstr "Zeitstempel" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:563 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:566 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 @@ -2498,7 +2502,7 @@ msgstr "Zeitstempel" msgid "Published" msgstr "Veröffentlicht" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:565 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:568 msgid "Rights" msgstr "Rechte" @@ -2773,7 +2777,7 @@ msgstr "" "LibraryThing.com laden.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1303 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1397 msgid "Cover" msgstr "Umschlagbild" @@ -2806,7 +2810,7 @@ msgstr "Komprimierung der Datei-Inhalte ausschalten." msgid "Tag marking book to be filed with Personal Docs" msgstr "Etikett, das ein Buch markiert, welches persönliche Daten enthält" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108 msgid "All articles" msgstr "Alle Artikel" @@ -2814,70 +2818,70 @@ msgstr "Alle Artikel" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Dies ist ein Amazon Topaz-Buch. Es kann nicht verarbeitet werden." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Title Page" msgstr "Titelseite" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 #: /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:199 msgid "Table of Contents" msgstr "Inhaltsverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 msgid "Index" msgstr "Index" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Glossary" msgstr "Glossar" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Acknowledgements" msgstr "Danksagung" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Bibliography" msgstr "Literaturverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Colophon" msgstr "Schlussschrift" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Copyright" msgstr "Copyright" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Dedication" msgstr "Widmung" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Epigraph" msgstr "Epigraph" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Foreword" msgstr "Vorwort" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "List of Illustrations" msgstr "Abbildungsverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Tables" msgstr "Tabellenverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Notes" msgstr "Anmerkungen" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Preface" msgstr "Vorwort" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Main Text" msgstr "Haupttext" @@ -3349,74 +3353,74 @@ msgstr "" "Leerzeichen vorhanden ist. Gestattet auch, die maximale Zeilenlänge unter " "das Minimum zu setzen." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Send file to storage card instead of main memory by default" msgstr "" "Datei auf die Speicherkarte anstatt in den Hauptspeicher des Gerätes " "(Voreinstellung) senden" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Confirm before deleting" msgstr "Bestätigung vor dem Löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Main window geometry" msgstr "Aufteilung des Hauptfensters" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Notify when a new version is available" msgstr "Benachrichtigen, wenn eine neue Version verfügbar ist" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Use Roman numerals for series number" msgstr "Benutze römische Ziffern für Reihennummerierung" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Sort tags list by name, popularity, or rating" msgstr "Etikettenliste nach Name, Beliebtheit oder Bewertung" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Number of covers to show in the cover browsing mode" msgstr "" "Anzahl der Umschlagbilder, die im Cover-Ansicht Modus angezeit werden" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Defaults for conversion to LRF" msgstr "Voreinstellungen für Konvertierung zu LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:83 msgid "Options for the LRF ebook viewer" msgstr "Optionen für den LRF eBook Viewer" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Formats that are viewed using the internal viewer" msgstr "Formate, die mithilfe des internen Viewers angesehen werden" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Columns to be displayed in the book list" msgstr "Spalten, die in der Liste der Bücher angezeigt werden sollen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Automatically launch content server on application startup" msgstr "Content Server automatisch beim Aufrufen von Calibre starten" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Oldest news kept in database" msgstr "Älteste in der Datenbank gespeicherte Nachrichten" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Show system tray icon" msgstr "Symbol im Systembereich der Kontrollleiste anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Upload downloaded news to device" msgstr "Geladene Nachrichten auf das Gerät übertragen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "Delete books from library after uploading to device" msgstr "Bücher nach der Übertragung auf das Gerät aus der Bibliothek löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" @@ -3424,65 +3428,65 @@ msgstr "" "Zeige Cover-Ansicht in einem eigenen Fenster anstatt im Hauptfenster von " "Calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Disable notifications from the system tray icon" msgstr "" "Benachrichtigungen aus dem Systembereich der Kontrollleiste deaktivieren" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 msgid "Default action to perform when send to device button is clicked" msgstr "" "Voreingestellte Übertragungsart beim Verwenden der \"An Reader übertragen\" " "Schaltfläche" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Maximum number of waiting worker processes" msgstr "Maximale Anzahl der Arbeitsprozesse in der Warteschlange" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Download social metadata (tags/rating/etc.)" msgstr "Soziale Metadaten (Etikettierung/Bewertung/etc.) laden" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Overwrite author and title with new metadata" msgstr "Autor und Titel mit neuen Metadaten überschreiben" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" "Maximale Anzahl gleichzeitiger Aufträge auf die Anzahl der CPUs beschränken" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "tag browser categories not to display" msgstr "Etiketten-Browser Kategorien nicht anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "The layout of the user interface" msgstr "Das Aussehen der Benutzeroberfläche" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Show the average rating per item indication in the tag browser" msgstr "" "Durchschnittsbewertungsindikator pro Einheit im Etikettenbrowser anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 msgid "Disable UI animations" msgstr "Keine Benutzeroberflächen-Animationen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:487 msgid "Copied" msgstr "Kopiert" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy" msgstr "Kopieren" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy to Clipboard" msgstr "In die Zwischenablage kopieren" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466 msgid "Choose Files" msgstr "Dateien wählen" @@ -3610,12 +3614,12 @@ msgstr "Lesen der Metadaten schlug fehl" msgid "Failed to read metadata from the following" msgstr "Lesen der Metadaten schlug fehl bei folgenden" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "Add to library" msgstr "Zur Bibliothek hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 @@ -3623,14 +3627,14 @@ msgstr "Zur Bibliothek hinzufügen" msgid "No book selected" msgstr "Kein Buch ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:254 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" "Folgende Bücher sind virtuell und können nicht zur Calibre-Bibliothek " "hinzugefügt werden:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "No book files found" msgstr "Keine Buch-Dateien gefunden" @@ -3644,7 +3648,7 @@ msgstr "" "Bücher aus dem angeschlossenen Gerät zur Calibre Bibliothek hinzufügen" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Fetch annotations (experimental)" msgstr "Anmerkungen abrufen (experimentell)" @@ -3833,7 +3837,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:267 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:272 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:685 msgid "Not allowed" msgstr "Das ist nicht gestattet" @@ -3902,7 +3906,7 @@ msgid "Could not copy books: " msgstr "Konnte Bücher nicht kopieren: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:702 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:675 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" @@ -3965,14 +3969,14 @@ msgid "Main memory" msgstr "Hauptspeicher" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "Speicherkarte A" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "Speicherkarte B" @@ -4440,7 +4444,7 @@ msgid "The specified directory could not be processed." msgstr "Das angegebene Verzeichnis konnte nicht bearbeitet werden." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "Keine Bücher" @@ -4654,7 +4658,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1105 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 msgid "Path" msgstr "Pfad" @@ -4671,8 +4675,8 @@ msgid "Formats" msgstr "Formate" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1108 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 msgid "Collections" msgstr "Sammlungen" @@ -4685,8 +4689,8 @@ msgstr "Zum Öffnen klicken" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1125 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 @@ -4771,7 +4775,7 @@ msgstr "Ausgabe" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 @@ -5323,13 +5327,13 @@ msgstr "Serifenlose Schrift&artfamilie:" msgid "&Monospaced font family:" msgstr "Nichtproportionale Schriftartfa&milie:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:44 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "Metadaten" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:46 msgid "" "Set the metadata. The output file will contain as much of this metadata as " "possible." @@ -5337,33 +5341,33 @@ msgstr "" "Metadaten eingeben. Die Ausgabe-Datei wird möglichst viel dieser Metadaten " "enthalten." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 msgid "Choose cover for " msgstr "Wählen Sie das Umschlagbild für " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:175 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "Cannot read" msgstr "Lesen nicht möglich" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 msgid "You do not have permission to read the file: " msgstr "Sie haben nicht die nötigen Rechte, um diese Datei zu lesen: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:191 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Error reading file" msgstr "Fehler beim Lesen der Datei" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 msgid "

    There was an error reading from file:
    " msgstr "

    Es trat ein Fehler beim Lesen dieser Datei auf:
    " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:192 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 msgid " is not a valid picture" msgstr " ist kein gültiges Bild" @@ -5990,83 +5994,83 @@ msgstr "Liste der Bücher auf dem Gerät erstellen" msgid "Get annotations from device" msgstr "Anmerkungen vom Gerät laden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:321 msgid "Send metadata to device" msgstr "Metadaten zum Gerät senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:326 msgid "Send collections to device" msgstr "Sammlungen zum Gerät schicken" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "%d Bücher auf das Gerät laden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "Bücher vom Gerät löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "Bücher vom Gerät herunterladen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "Buch auf dem Gerät ansehen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "Geben Sie die voreingestellte Übertragungsart an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "An Hauptspeicher senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "An Speicherkarte A senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "An Speicherkarte B senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "Hauptspeicher" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:485 msgid "Send and delete from library" msgstr "Übertragen und aus der Bibliothek löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 msgid "Send specific format" msgstr "Angegebenes Format übertragen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:522 msgid "Eject device" msgstr "Gerät auswerfen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:639 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:132 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "Fehler" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:640 msgid "Error communicating with device" msgstr "Fehler bei der Kommunikation mit dem Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:652 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:661 msgid "Select folder to open as device" msgstr "Verzeichnis wählen, das als Gerät geöffnet werden soll" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:708 msgid "Error talking to device" msgstr "Fehler in der Kommunikation zum Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:700 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:709 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -6074,125 +6078,125 @@ msgstr "" "Es trat ein Fehler in der Kommunikation mit dem Gerät auf. Bitte entfernen " "und schließen Sie das Gerät wieder an und - oder starten Sie neu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:752 msgid "Device: " msgstr "Gerät: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:754 msgid " detected." msgstr " gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "zum Übertragen ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:842 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "Format wählen, das ans Gerät geschickt wird" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "Kein Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:852 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "Übertragung schlug fehl: Kein Gerät verbunden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:855 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:859 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "Keine Speicherkarte" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:856 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "Übertragung schlug fehl: Keine Speicherkarte im Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:901 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "eBook:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "Im Anhang finden Sie das eBook" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:905 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "von" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:906 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "im %s Format." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "Sende eMail an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:957 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1112 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1231 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1239 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1059 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1248 msgid "No suitable formats" msgstr "Keine geeigneten Formate" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:950 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "" "Die folgenden Bücher vor dem Versenden per eMail automatisch konvertieren?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:967 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "Konnte die folgenden Bücher nicht versenden, da geeignete Formate fehlen:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email books" msgstr "Senden der Bücher schlug fehl" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 msgid "Failed to email the following books:" msgstr "Senden der folgenden Bücher schlug fehl:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 msgid "Sent by email:" msgstr "Per eMail versendet:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1009 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 msgid "News:" msgstr "Nachrichten:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1010 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1019 msgid "Attached is the" msgstr "Im Anhang ist" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1030 msgid "Sent news to" msgstr "Nachrichten senden an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1051 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1113 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1232 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1122 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1241 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Die folgenden Bücher vor dem Laden auf das Gerät automatisch konvertieren?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 msgid "Sending catalogs to device." msgstr "Sende Kataloge ans Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1145 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "Sending news to device." msgstr "Sende Nachrichten an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending books to device." msgstr "Sende Bücher an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 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." @@ -6201,11 +6205,11 @@ msgstr "" "fehlen. Konvertieren Sie die Bücher zuerst in ein von Ihrem Gerät " "unterstütztes Format." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1313 msgid "No space on device" msgstr "Gerätespeicher voll" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1304 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1314 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -6214,14 +6218,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 msgid "Invalid template" msgstr "Ungültige Vorlage" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 msgid "The template %s is invalid:" msgstr "Die Vorlage %s ist ungültig:" @@ -6456,7 +6460,7 @@ msgstr "Ort" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:280 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 @@ -6464,7 +6468,7 @@ msgid "Date" msgstr "Datum" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1104 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1111 msgid "Format" msgstr "Format" @@ -7990,11 +7994,8 @@ msgstr "Feed &anfügen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:281 msgid "" "For help with writing advanced news recipes, please visit User Recipes" +"href=\"http://calibre-ebook.com/user_manual/news.html\">User Recipes" msgstr "" -"Wenn Sie Hilfe zur Erstellung Erweiterter Schemata für Nachrichten " -"benötigen, besuchen Sie die englischsprachige Seite User Recipes" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:282 msgid "Recipe source code (python)" @@ -8221,42 +8222,42 @@ msgstr " - Aufträge" msgid "Eject this device" msgstr "Diese Gerät auswerfen" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:209 msgid "Library" msgstr "Bibliothek" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 msgid "Show books in calibre library" msgstr "Zeige Bücher in Calibre Bibliothek" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 msgid "Device" msgstr "Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 msgid "Show books in the main memory of the device" msgstr "Zeige Bücher im Hauptspeicher des Geräts" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 #: /home/kovid/work/calibre/src/calibre/library/database2.py:839 msgid "Card A" msgstr "Karte A" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 msgid "Show books in storage card A" msgstr "Zeige Bücher auf Speicherkarte A" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 #: /home/kovid/work/calibre/src/calibre/library/database2.py:841 msgid "Card B" msgstr "Karte B" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:70 msgid "Show books in storage card B" msgstr "Zeige Bücher auf Speicherkarte B" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:110 msgid "available" msgstr "verfügbar" @@ -8319,73 +8320,73 @@ msgid "Size (MB)" msgstr "Größe (MB)" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 msgid "Book %s of %s." msgstr "Buch %s von %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:697 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1222 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1229 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 msgid "The lookup/search name is \"{0}\"" msgstr "Der Such-Name ist \"{0}\"" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:916 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 msgid "In Library" msgstr "In der Bibliothek" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 msgid "Size" msgstr "Größe" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1209 msgid "Marked for deletion" msgstr "Zum Löschen ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1212 msgid "Double click to edit me

    " msgstr "Doppelklick ermöglicht Bearbeitung

    " -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:118 msgid "Hide column %s" msgstr "Spalte %s ausblenden" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:123 msgid "Sort on %s" msgstr "Sortieren nach %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 msgid "Ascending" msgstr "aufsteigend" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:127 msgid "Descending" msgstr "absteigend" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 msgid "Change text alignment for %s" msgstr "Textausrichtung ändern für %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Left" msgstr "Links" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Right" msgstr "Rechts" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:142 msgid "Center" msgstr "Zentriert" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:161 msgid "Show column" msgstr "Spalte anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:173 msgid "Restore default layout" msgstr "Voreingestelltes Layout wiederherstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:686 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -9314,21 +9315,29 @@ msgstr "" msgid "Check the library folders for potential problems" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:43 +msgid "Device currently connected: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:46 +msgid "Device currently connected: None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:207 msgid "" "That format and device already has a plugboard or conflicts with another " "plugboard." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:240 msgid "Invalid destination" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:241 msgid "The destination field cannot be blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 msgid "" "Here you can change the metadata calibre uses to update a book when saving " "to disk or sending to device.\n" @@ -9348,39 +9357,39 @@ msgid "" "would be to specify the language." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:121 msgid "Format (choose first)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:122 msgid "Device (choose second)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:123 msgid "Add new plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:124 msgid "Edit existing plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:125 msgid "Existing plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:126 msgid "Source template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:127 msgid "Destination field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:128 msgid "Save plugboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:129 msgid "Delete plugboard" msgstr "" @@ -10950,7 +10959,7 @@ msgstr "nicht ausgewählt" #: /home/kovid/work/calibre/src/calibre/library/caches.py:539 #: /home/kovid/work/calibre/src/calibre/library/caches.py:549 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "no" msgstr "nein" @@ -10961,7 +10970,7 @@ msgstr "ausgewählt" #: /home/kovid/work/calibre/src/calibre/library/caches.py:542 #: /home/kovid/work/calibre/src/calibre/library/caches.py:552 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "yes" msgstr "ja" @@ -11781,7 +11790,7 @@ msgid "" " files in each directory of the calibre library. This is\n" " useful if your metadata.db file has been corrupted.\n" "\n" -" WARNING: This completely regenrates your datbase. You will\n" +" WARNING: This completely regenerates your datbase. You will\n" " lose stored per-book conversion settings and custom recipes.\n" " " msgstr "" @@ -11860,15 +11869,15 @@ msgstr "" msgid "creating custom column " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:31 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 msgid "The title" msgstr "Der Titel" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 msgid "The authors" msgstr "Die Autoren" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:34 msgid "" "The author sort string. To use only the first letter of the name use " "{author_sort[0]}" @@ -11876,15 +11885,15 @@ msgstr "" "Die Sortierungszeichenfolge für Autoren. Für die Benutzung der ersten " "Buchstaben des Namens verwenden Sie {author_sort[0]}" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:35 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 msgid "The tags" msgstr "Die Etiketten" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 msgid "The series" msgstr "Die Reihen" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:38 msgid "" "The series number. To get leading zeros use {series_index:0>3s} or " "{series_index:>3s} for leading spaces" @@ -11892,35 +11901,35 @@ msgstr "" "Die Reihennummer. Für anführende Nullen verwenden Sie {series_index:0>3s} " "oder {series_index:>3s} für anführende Leerzeichen" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:40 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 msgid "The rating" msgstr "Die Bewertung" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 msgid "The ISBN" msgstr "Die ISBN" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 msgid "The publisher" msgstr "Der Herausgeber" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 msgid "The date" msgstr "Das Datum" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 msgid "The published date" msgstr "Das Veröffentlichungsdatum" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:46 msgid "The calibre internal id" msgstr "Die Calibre interne ID" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:55 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:56 msgid "Options to control saving to disk" msgstr "Einstellungen zur Kontrolle des Speicherns auf die Festplatte" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:61 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:62 msgid "" "Normally, calibre will update the metadata in the saved files from what is " "in the calibre library. Makes saving to disk slower." @@ -11929,7 +11938,7 @@ msgstr "" "Dateien mit den Metadaten in der Calibre Bibliothek. Dies verlangsamt das " "Speichern auf die Festplatte." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:64 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:65 msgid "" "Normally, calibre will write the metadata into a separate OPF file along " "with the actual e-book files." @@ -11937,7 +11946,7 @@ msgstr "" "Normalerweise schreibt Calibre die Metadaten in eine gesonderte OPF Datei " "zusammen mit den eigentlichen eBook Dateien." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:67 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:68 msgid "" "Normally, calibre will save the cover in a separate file along with the " "actual e-book file(s)." @@ -11945,13 +11954,13 @@ msgstr "" "Normalerweise speichert Calibre das Umschlagbild in einer gesonderten Datei " "zusammen mit den eigentlichen eBook Dateien." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:70 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:71 msgid "" "Comma separated list of formats to save for each book. By default all " "available formats are saved." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:73 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:74 msgid "" "The template to control the filename and directory structure of the saved " "files. Default is \"%s\" which will save books into a per-author " @@ -11963,7 +11972,7 @@ msgstr "" "Autoren benannte Unterverzeichnisse mit Dateinamen, die Titel und Autor " "enthalten, speichert. Verfügbare Einstellungen sind: {%s}" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:78 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:79 msgid "" "The template to control the filename and directory structure of files sent " "to the device. Default is \"%s\" which will save books into a per-author " @@ -11975,7 +11984,7 @@ msgstr "" "Bücher in ein Autorenverzeichnis mit Dateinamen, die Titel und Autor " "beinhalten, speichert. Verfügbare Einstellungen sind: {%s}" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:85 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:86 msgid "" "Normally, calibre will convert all non English characters into English " "equivalents for the file names. WARNING: If you turn this off, you may " @@ -11987,8 +11996,8 @@ msgstr "" "könnten Fehler beim Speichern auftreten, abhängig davon, wie gut das " "Dateisystem, unter dem sie abspeichern, Unicode unterstützt." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:91 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:94 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:92 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:95 msgid "" "The format in which to display dates. %d - day, %b - month, %Y - year. " "Default is: %b, %Y" @@ -11996,15 +12005,15 @@ msgstr "" "Format, in dem das Datum angezeigt wird. %d - Tag, %b - Monat, %Y - Jahr. " "Voreinstellung ist: %b, %Y" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:97 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:98 msgid "Convert paths to lowercase." msgstr "Pfade in Kleinschreibung umwandeln." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:99 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:100 msgid "Replace whitespace with underscores." msgstr "Leerzeichen mit Unterstrichen ersetzen." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:319 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:330 msgid "Requested formats not available" msgstr "Angeforderte Formate nicht verfügbar" @@ -14496,6 +14505,14 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ "Wenn Sie diese Option wählen, wird jedes Argument %prog ignoriert und ein " #~ "voreingestelltes Schema zum Download der Feeds verwendet." +#~ msgid "" +#~ "For help with writing advanced news recipes, please visit User Recipes" +#~ msgstr "" +#~ "Wenn Sie Hilfe zur Erstellung Erweiterter Schemata für Nachrichten " +#~ "benötigen, besuchen Sie die englischsprachige Seite User Recipes" + #~ msgid "" #~ "%%prog [options] ARG\n" #~ "\n" diff --git a/src/calibre/translations/eu.po b/src/calibre/translations/eu.po index bc1cbdf28f..a91af983fc 100644 --- a/src/calibre/translations/eu.po +++ b/src/calibre/translations/eu.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-10-01 21:28+0000\n" -"PO-Revision-Date: 2010-10-01 21:12+0000\n" +"POT-Creation-Date: 2010-10-03 21:03+0000\n" +"PO-Revision-Date: 2010-10-04 04:41+0000\n" "Last-Translator: gorkaazk \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-02 04:59+0000\n" +"X-Launchpad-Export-Date: 2010-10-04 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Ez du ezer egiten" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:526 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:525 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:398 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -44,13 +44,13 @@ msgstr "Ez du ezer egiten" #: /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:223 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:29 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:231 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:30 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:346 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:351 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:354 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /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:49 @@ -59,8 +59,8 @@ msgstr "Ez du ezer egiten" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1017 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1129 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 @@ -78,11 +78,11 @@ msgstr "Ez du ezer egiten" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 #: /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:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:136 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:138 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:909 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:914 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:980 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 @@ -110,29 +110,29 @@ msgstr "Ez du ezer egiten" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:277 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:280 #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1187 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1196 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1199 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:399 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:912 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1100 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:913 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:187 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 @@ -265,43 +265,43 @@ msgstr "Ezarri metadatuak %s fitxategietan" msgid "Set metadata from %s files" msgstr "Ezarri metadatuak %s fitxategietatik" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:688 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 msgid "Look and Feel" msgstr "Itxura eta izaera" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:692 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:704 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:715 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 msgid "Interface" msgstr "Interfazea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:694 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Doi ezazu calibreren interfazearen itxura zure gustuen arabera" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:700 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 msgid "Behavior" msgstr "Jokabidea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708 msgid "Change the way calibre behaves" msgstr "Calibre-ren jokatzeko era aldatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:177 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:180 msgid "Add your own columns" msgstr "Gehi itzazu zureak diren zutabeak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 msgid "Add/remove your own columns to the calibre book list" msgstr "Calibre-ren liburu zerrendan zuk egindako zutabeak gehitu/ezabatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Customize the toolbar" msgstr "Tresna-barra pertsonalizatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:728 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -309,58 +309,58 @@ msgstr "" "Tresna-barra eta kontextuaren araberako menuak pertsonalizatu, bakoitzean " "aukeragarri agertuko diren ekintzak aldatuz." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 msgid "Input Options" msgstr "Sorburu aukerak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:738 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:749 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 msgid "Conversion" msgstr "Bihurketa" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 msgid "Set conversion options specific to each input format" msgstr "Ezarri itzazu sorburu formatu bakoitzeko bihurketa aukera zehatzak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 msgid "Common Options" msgstr "Aukera komunak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 msgid "Set conversion options common to all formats" msgstr "Formatu guztientzako eraldatze aukera komunak ezartzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Output Options" msgstr "Helburu aukerak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:762 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each output format" msgstr "Ezarri itzazu helburu formatu bakoitzeko bihurketa aukera zehatzak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Adding books" msgstr "Liburuak gehitzen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:783 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:795 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:807 msgid "Import/Export" msgstr "Inportatu/Esportatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:773 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Liburuak gehitzean, calibre-k fitxategietako metadatuak zelan irakurriko " "dituen kontrolatzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 msgid "Saving books to disk" msgstr "Liburuak diskan gordetzen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -368,34 +368,34 @@ msgstr "" "Kontrola ezazu calibrek nola esportatzen dituen fitxategiak bere datu " "basetik diskora \"Diskoan gorde\" aukera erabiltzen denean." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 msgid "Sending books to devices" msgstr "Liburuak gailuetara bidaltzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 msgid "Control how calibre transfers files to your ebook reader" msgstr "" "calibre-k zure liburu elektronikoen irakurgailura fitxategiak zelan igaroko " "dituen kontrolatzen du" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 msgid "Metadata plugboards" -msgstr "" +msgstr "Metadatuen konektore-txartela" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 msgid "Change metadata fields before saving/sending" -msgstr "" +msgstr "Aldatu metadatu eremuak gorde/igorri baino lehenago" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 msgid "Sharing books by email" msgstr "elektropostaz liburuak elkarbanatzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:818 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 msgid "Sharing" msgstr "Elkarbanatzea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -403,11 +403,11 @@ msgstr "" "Elektropostaz liburuak elkarbanatzea arautzen du. Saretik jaitsitako " "albisteak norbere gailuetara automatikoki bidaltzeko erabil daiteke" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 msgid "Sharing over the net" msgstr "Sarean zehar elkarbanatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -416,35 +416,35 @@ msgstr "" "interneten bidezko sarbidea emango dizun edozein lekutan eta edozein " "gailuren bidez" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 msgid "Plugins" msgstr "Gehigarriak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:866 msgid "Advanced" msgstr "Aurreratua" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Gehitu/ezabatu/pertsonalizatu calibreren zenbait funtzio" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 msgid "Tweaks" msgstr "Doikuntzak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Afina ezazu zehaztasun handiz nola jokatuko duen calibrek hainbat " "testuingurutan" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 msgid "Miscellaneous" msgstr "Denetarik" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 msgid "Miscellaneous advanced configuration" msgstr "Hainbat gauzetarako ezarpen aurreratuak" @@ -919,7 +919,7 @@ msgstr "Jar zaitez harremanetan \"MiBuk Wolder reader\" horrekin." #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:116 msgid "Communicate with the JetBook Mini reader." -msgstr "" +msgstr "Jar zaitez harremanetan JetBook Mini reader enpresakoekin." #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." @@ -973,7 +973,7 @@ msgid "Adding books to device metadata listing..." msgstr "Gailuaren metadatu zerrendara liburuak gehitzen..." #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 msgid "Not Implemented" msgstr "Abiarazi gabea, inplementatu gabea" @@ -1007,6 +1007,10 @@ msgid "Communicate with the Pandigital Novel" msgstr "Jar zaitez harremanetan \"Pandigital Novel\" horrekin." #: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +msgid "Communicate with the VelocityMicro" +msgstr "Jar zaitez harremanetan VelocityMicro enpresarekin" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:132 msgid "Communicate with the GM2000" msgstr "Jar zaitez harremanetan GM2000-ko horiekin" @@ -2501,54 +2505,54 @@ msgstr "" "beretik, saia zaitez modu automatikoan detektatzen ea CBZ/CBR fitxategiak " "ote diren." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:112 msgid "TEMPLATE ERROR" -msgstr "" +msgstr "AKATSA TXANTILOIAN" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "No" msgstr "Ez" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:479 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 msgid "Yes" msgstr "Bai" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:550 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:377 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:289 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 msgid "Title" msgstr "Izenburua" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:551 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 msgid "Author(s)" msgstr "Egilea(k)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:552 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:555 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "Argitaratzailea" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "Ekoizlea" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:557 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:212 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:213 @@ -2556,42 +2560,42 @@ msgstr "Ekoizlea" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:332 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 msgid "Comments" msgstr "Iruzkinak" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:154 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1122 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:146 msgid "Tags" msgstr "Etiketak" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:558 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:337 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:94 msgid "Series" msgstr "Serieak" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:562 msgid "Language" msgstr "Hizkuntza" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 msgid "Timestamp" msgstr "Dataren zigilua (noizkoa)" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:563 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:566 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 @@ -2599,7 +2603,7 @@ msgstr "Dataren zigilua (noizkoa)" msgid "Published" msgstr "Argitaratua" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:565 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:568 msgid "Rights" msgstr "Eskubideak" @@ -2761,11 +2765,11 @@ msgstr "Error del servidor LibraryThing.com. Pruebe de nuevo más tarde." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:226 msgid "Download covers from Douban.com" -msgstr "" +msgstr "Deskargatu liburu-azalak hemendik: Douban.com" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:235 msgid "Douban.com API timed out. Try again later." -msgstr "" +msgstr "Douban.com API, denbora iraungita. Saia zaitez berriro beranduago." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 msgid "Downloads metadata from Douban.com" @@ -2877,7 +2881,7 @@ msgstr "" "hemendik: LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1303 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1397 msgid "Cover" msgstr "Liburu-azala" @@ -2915,7 +2919,7 @@ msgstr "" "Etiketatu markatutako liburu elektronikoa Zeure Dokumentuen karpetan " "artxibatzeko" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108 msgid "All articles" msgstr "Artikulu guztiak" @@ -2923,70 +2927,70 @@ msgstr "Artikulu guztiak" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Hauxe Amazon Topaz liburua da. Ezin da prozesatu." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Title Page" msgstr "Orriaren Izenburua" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 #: /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:199 msgid "Table of Contents" msgstr "Aurkibidea" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 msgid "Index" msgstr "Indizea" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Glossary" msgstr "Glosarioa" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Acknowledgements" msgstr "Aipamenak" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Bibliography" msgstr "Bibliografia" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Colophon" msgstr "Azken oharra" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Copyright" msgstr "Copyright-a" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Dedication" msgstr "Eskaintza" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Epigraph" msgstr "Epigrafea" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Foreword" msgstr "Sarrera" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "List of Illustrations" msgstr "Irudien zerrenda" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Tables" msgstr "Taulen zerrenda" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Notes" msgstr "Oharrak" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Preface" msgstr "Aitzinsolasa" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Main Text" msgstr "Testu nagusia" @@ -3452,75 +3456,75 @@ msgstr "" "espaziorik ez dagoenean. Onartzen du, baita, lerro-luzera-maximoa minomoaren " "azpian egotea." -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Send file to storage card instead of main memory by default" msgstr "" "Lehenetsita: bidali fitxategia memoria-txartelara trepetaren memoria " "nagusira bidali beharrean" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Confirm before deleting" msgstr "Baieztatu ezabatu baino lehen" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Main window geometry" msgstr "Leiho nagusiaren geometria" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Notify when a new version is available" msgstr "Oharra bidali bertsio berri bat eskuragarri dagoen bakoitzean" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Use Roman numerals for series number" msgstr "Erabili zenbaki erromatarrak zenbaki segidetarako" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Sort tags list by name, popularity, or rating" msgstr "" "Sailkatu etiketa zerrendak, izenen arabera, ospearen arabera edo balorazioen " "arabera" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Number of covers to show in the cover browsing mode" msgstr "Erakutsiko den liburu-azal kopurua, liburu-azal-arakatzaile moduan" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Defaults for conversion to LRF" msgstr "Lehenetsitako balioak LRF formatura bihurtzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:83 msgid "Options for the LRF ebook viewer" msgstr "Aukerak LRF liburu-e irakurgailuarentzat" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Formats that are viewed using the internal viewer" msgstr "Barneko irakurtzeko sistema erabilita ikus daitezkeen formatuak" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Columns to be displayed in the book list" msgstr "Liburu zerrenda zenbat zutabetan erakutsiko" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Automatically launch content server on application startup" msgstr "Automatikoki abiaraziko du zerbitzariko edukia hasi aplikazioan" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Oldest news kept in database" msgstr "Albiste zaharragoak datu basean gordeta" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Show system tray icon" msgstr "Erakutsi sistemako erretiluaren ikonoa" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Upload downloaded news to device" msgstr "Karga itzazu irakurgailuan deskargaturiko albisteak" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "Delete books from library after uploading to device" msgstr "Ezabatu liburuak liburutegitik irakurgailura kargatu eta gero" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" @@ -3528,67 +3532,67 @@ msgstr "" "Erakutsi Cover Flow, (liburu-azal nabigazioa), berariazko leiho batean eta " "ez calibreren leiho nagusian" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Disable notifications from the system tray icon" msgstr "Desgaitu abisuak sistemaren erretilu ikonotik" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 msgid "Default action to perform when send to device button is clicked" msgstr "" "Lehenetsitako egiteko ekintza klik egiten duzunean \"bidali irakurgailura\" " "botoian" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Maximum number of waiting worker processes" msgstr "\"Langilearen zain\" prozesuen gehienezko kopurua" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Download social metadata (tags/rating/etc.)" msgstr "" "Deskargatu gizarte mailako metadatuak (etiketak/balorazioak/eta abar.)" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Overwrite author and title with new metadata" msgstr "" "Gainetik idatzi egilearen izena eta testuaren izenburua metadatu berriekin" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" "Murriztu itzazu aldi bereko gehienezko egitekoen kopurua dauden CPU-en " "arabera" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "tag browser categories not to display" msgstr "etiketatu arakatzailearen kategoriak ez erakusteko moduan" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "The layout of the user interface" msgstr "Erabiltzailearen interfazearen itxura" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Show the average rating per item indication in the tag browser" msgstr "" "Erakutsi batez besteko balorazioa kontu bakoitzeko etiketen arakatzailean" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 msgid "Disable UI animations" msgstr "Desgaitu EI (erabiltzailearen interfazearen) animazioak" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:487 msgid "Copied" msgstr "Kopiaturik" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy" msgstr "Kopiatu" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy to Clipboard" msgstr "Kopiatu arbelean" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466 msgid "Choose Files" msgstr "Aukeratu fitxategiak" @@ -3716,12 +3720,12 @@ msgstr "Metadatuak irakurtzen huts egin du" msgid "Failed to read metadata from the following" msgstr "Huts egin du metadatuak hemendik irakurtzen" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "Add to library" msgstr "Gehitu liburutegira" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 @@ -3729,13 +3733,13 @@ msgstr "Gehitu liburutegira" msgid "No book selected" msgstr "Hautaturiko libururik ez dago" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:254 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" "Hurrengo liburuak birtualak dira eta ezin dira calibre liburutegira gehitu:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "No book files found" msgstr "Liburu fitxategirik ez da aurkitu" @@ -3748,7 +3752,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "Gehitu liburuak zure calibre liburutegira konektatutako gailutik" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Fetch annotations (experimental)" msgstr "Berreskura itzazu zure ohar eta zirriborroak (esperimentala)" @@ -3868,7 +3872,7 @@ msgstr "Ezabatu liburutegia" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:120 msgid "Library backup status..." -msgstr "" +msgstr "Liburutegiaren babes-kopia nola dagoen..." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:176 msgid "Rename" @@ -3918,15 +3922,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:223 msgid "none" -msgstr "" +msgstr "ezer ere ez" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:224 msgid "Backup status" -msgstr "" +msgstr "Babes-kopiaren egoera" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:225 msgid "Book metadata files remaining to be written: %s" -msgstr "" +msgstr "Idazteko geratzen diren liburuen metadatu fitxategiak : %s" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:234 msgid "No library found" @@ -3943,7 +3947,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:267 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:272 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:587 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:685 msgid "Not allowed" msgstr "Not allowed" @@ -4011,7 +4015,7 @@ msgid "Could not copy books: " msgstr "Ezin izan dira liburuak kopiatu: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:702 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:675 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" @@ -4074,14 +4078,14 @@ msgid "Main memory" msgstr "Memoria nagusia" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "Memoria-txartela A" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "Memoria-txartela B" @@ -4559,7 +4563,7 @@ msgid "The specified directory could not be processed." msgstr "Zehaztutako direktorioa ezin izan da prozesatu." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "Libururik ez" @@ -4776,7 +4780,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1105 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 msgid "Path" msgstr "Bidea (Path)" @@ -4793,8 +4797,8 @@ msgid "Formats" msgstr "Formatuak" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1108 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 msgid "Collections" msgstr "Bildumak" @@ -4807,8 +4811,8 @@ msgstr "Egin klik zabaltzeko" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1125 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 @@ -4893,7 +4897,7 @@ msgstr "outputa, helburua" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 @@ -5458,13 +5462,13 @@ msgstr "S&ans-serif letra-tipo familia:" msgid "&Monospaced font family:" msgstr "&Monospaced letra-tipo familia:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:44 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "Metadatuak" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:46 msgid "" "Set the metadata. The output file will contain as much of this metadata as " "possible." @@ -5472,33 +5476,33 @@ msgstr "" "Ezarri metadatuak. Helburu fitxategiak metadatu hauetatik ahalik eta " "metadatu gehien gordeko ditu." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 msgid "Choose cover for " msgstr "Aukeratu liburu-azala honentzat: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:175 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "Cannot read" msgstr "Ezin irakurri" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 msgid "You do not have permission to read the file: " msgstr "Ez duzu fitxategi hau irakurtzeko baimenik: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:191 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Error reading file" msgstr "Huts egin du fitxategia irakurtzerakoan" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 msgid "

    There was an error reading from file:
    " msgstr "

    Akats bat egon da fitxategitik irakurtzerakoan:
    " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:192 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 msgid " is not a valid picture" msgstr " ez da irudi baliogarria" @@ -6081,16 +6085,16 @@ msgstr " aurkibidea:" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:460 msgid "Remove series" -msgstr "" +msgstr "Ezabatu serieak" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:463 msgid "Automatically number books" -msgstr "" +msgstr "Liburuen zenbaketa automatikoa" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:466 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 msgid "Force numbers to start with " -msgstr "" +msgstr "behartu zenbakia honekin hasten " #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:529 msgid "Remove all tags" @@ -6125,83 +6129,83 @@ msgstr "Lortu liburu zerrenda irakurgailutik" msgid "Get annotations from device" msgstr "Lortu zirriborroak eta oharrak irakurgailutik" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:321 msgid "Send metadata to device" msgstr "Igorri irakurgailura metadatuak" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:326 msgid "Send collections to device" msgstr "Igorri irakurgailura bildumak" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "Kargatu %d liburuak irakurgailuan" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "Ezabatu liburuak irakurgailutik" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "Deskargatu liburuak irakurgailutik" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "Ikusi liburua irakurgailuan" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "Ezarri lehenetsia bezala \"irakurgailura bidali\" ekintza" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "Bidali memoria nagusira" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "Bidali A memoria-txartelera" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "Bidali B memoria-txartelera" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "Memoria nagusia" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:485 msgid "Send and delete from library" msgstr "Bidali eta ezabatu liburutegitik" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:477 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 msgid "Send specific format" msgstr "Bidali formatu jakin bat" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:522 msgid "Eject device" msgstr "Egotzi irakurgailua (Eject)" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:630 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:639 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:132 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "Errorea" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:640 msgid "Error communicating with device" msgstr "Irakurgailuarekin komunikatzeko saioak huts egin du" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:652 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:661 msgid "Select folder to open as device" msgstr "Aukeratu karpeta bat irakurgailua izango balitz bezala zabaltzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:708 msgid "Error talking to device" msgstr "Akatsen bat irakurgailuarekin komunikatzerakoan" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:700 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:709 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -6209,127 +6213,127 @@ msgstr "" "Behin-behineko huts egite bat egon da irakurgailuarekin komunikatzerakoan. " "Mesedez, deskonektatu eta konektatu berriro gailua, edo berrabiarazi." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:752 msgid "Device: " msgstr "Gailua: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:754 msgid " detected." msgstr " detektaturik." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "hautatua bidaltzeko" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:842 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "Aukeratu irakurgailura bidaltzeko formatua" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "Gailurik ez dago" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:852 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "Ezin izan da igorri: ez dago inolako gailurik konektatua" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:855 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:859 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "Txartelik ez dago" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:856 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "Ezin bidali: gailuak ez dauka memoria-txartelik" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:901 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "Liburu elektronikoa:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:904 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "Erantsita, liburu elektronikoa topatuko duzu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:905 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "egilea:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:906 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "%s formatuan." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "E-posta igortzen honi:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:949 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:957 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1112 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1231 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1239 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1059 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1248 msgid "No suitable formats" msgstr "Ez dago formatu egokirik" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:950 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "" "Bihurtu modu automatikoan ondorengo liburuak e-postaren bidez igorri " "aurretik?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:967 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "Ezin izan da e-postaz ondorengo liburuak igorri formatu egokirik topatu ez " "delako:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:976 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email books" msgstr "Huts egin du liburuak igortzerakoan" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:977 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 msgid "Failed to email the following books:" msgstr "Huts egin du e-postaz hurrengo liburuak bidaltzerakoan:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 msgid "Sent by email:" msgstr "E-postaz igorria:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1009 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 msgid "News:" msgstr "Albisteak:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1010 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1019 msgid "Attached is the" msgstr "Erantsita doana hau da" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1030 msgid "Sent news to" msgstr "Bidali albisteak honi:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1051 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1113 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1232 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1122 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1241 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Bihurtu modu automatikoan hurrengo liburuak irakurgailuan kargatu aurretik?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 msgid "Sending catalogs to device." msgstr "Katalogoak irakurgailura bidaltzen." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1145 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "Sending news to device." msgstr "Albisteak irakurgailura bidaltzen." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending books to device." msgstr "Liburuak irakurgailura bidaltzen." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 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." @@ -6338,11 +6342,11 @@ msgstr "" "topatu egin ez delako. Lehenengo eta behin, bihurtu liburua(k) zure " "irakurgailuak onartzen duen formaturen batean." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1313 msgid "No space on device" msgstr "Lekurik ez irakurgailuan" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1304 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1314 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -6350,14 +6354,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 msgid "Invalid template" msgstr "Baliorik ez duen txantiloia" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 msgid "The template %s is invalid:" msgstr "%s txantiloiak ez du balio:" @@ -6445,11 +6449,11 @@ msgstr "Katalogo aukerak" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:21 msgid "Check Library" -msgstr "" +msgstr "Ikuskatu liburutegia" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:29 msgid "Run the check" -msgstr "" +msgstr "Arakaketa martxan jarri" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:205 @@ -6458,19 +6462,19 @@ msgstr "Kopiatu arbelean" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:48 msgid "Names to ignore:" -msgstr "" +msgstr "Kontuan hartu behar ez diren izenak:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:54 msgid "Extensions to ignore" -msgstr "" +msgstr "Kontuan hartu behar ez diren luzapenak" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 msgid "Additional Information" -msgstr "" +msgstr "Informazio osagarria" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 msgid "Path from library" -msgstr "" +msgstr "Liburutegitiko laster-bidea" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 @@ -6599,7 +6603,7 @@ msgstr "Kokalekua" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:280 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 @@ -6607,7 +6611,7 @@ msgid "Date" msgstr "Data" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1104 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1111 msgid "Format" msgstr "Formatua" @@ -6622,12 +6626,12 @@ msgstr "Egile izenaren araberako sailkapena" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 msgid "Invalid author name" -msgstr "" +msgstr "Baliogarria ez den egile izena" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 msgid "Author names cannot contain & characters." -msgstr "" +msgstr "Egile izenek ezin dute & karakterea eduki." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:66 msgid "Manage authors" @@ -6767,19 +6771,19 @@ msgstr "Stop, gelditu, &lan guztiak (irakurgailutik kanpokoak)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:25 msgid "Title/Author" -msgstr "" +msgstr "Izenburua/Egilea" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:26 msgid "Standard metadata" -msgstr "" +msgstr "Metadatu estandarrak" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:27 msgid "Custom metadata" -msgstr "" +msgstr "Metadatu pertsonalizatuak" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:28 msgid "Search/Replace" -msgstr "" +msgstr "Bilatu/Ordeztu" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:76 @@ -6803,23 +6807,23 @@ msgstr "Izenburuaren letra mota (xehe/larri)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:185 msgid "Character match" -msgstr "" +msgstr "Karaktereek bat egin" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 msgid "Regular Expression" -msgstr "" +msgstr "Adierazpen erregularra" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 msgid "Replace field" -msgstr "" +msgstr "Ordeztu eremua" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 msgid "Prepend to field" -msgstr "" +msgstr "Erantsi aurretik eremuari" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:191 msgid "Append to field" -msgstr "" +msgstr "Erantsi eremuari" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:202 msgid "Editing meta information for %d books" @@ -6837,6 +6841,12 @@ msgid "" "before proceeding.

    Search and replace in text fields using character " "matching or regular expressions. " msgstr "" +"Aukera hau erabilita zure liburutegia suntsi dezakezu. Aldaketak " +"betiko izango dira. Ez dago atzera egiteko aukerik. Aukera hau " +"esperimentatzen ari gara eta akatsak izan ditzake. Zinez eskatzen dizugu " +"liburutegiaren babes-kopia ona izatea aukera honekin aurrera egin baino " +"lehen.

    Bilatu eta ordeztu testu eremuetan bat egiten duten karaktereak edo " +"adierazpen arruntak erabiliz. " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:279 msgid "" @@ -6847,6 +6857,13 @@ msgid "" "checked, the search text must match exactly. If it is unchecked, the search " "text will match both upper- and lower-case letters" msgstr "" +"Karaktere modua erabilita, eremua bilatzen da sartutako testu osoari begira. " +"Testua ordezkatu egingo da zehaztutako ordezkatze testuarekin zehaztutako " +"eremuan topatzen den edozein tokitan. Ordezkatzea bukatu eta gero, testua " +"maiuskuletara, minuskuletara edo izenburu tipora alda daiteke. Letra tipo " +"arakatzailea ondo zehaztu bada, testu bilaketak bete-betean asmatuko du. Ez " +"bada ondo zehazten, bilaketa testua bai letra larriekin bai letra xeheekin " +"egingo da." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:290 msgid "" @@ -6862,10 +6879,21 @@ msgid "" "information on python's regular expressions, and in particular the 'sub' " "function." msgstr "" +"Adierazpen arrunta moduan, bilaketa testua python-ekin bateragarria den " +"adierazpen arrunta testua da. Ordezkatze testuak eduki ditzake ereduari " +"buruzko parentesien arteko erreferentziak. Bilaketa ez dago ainguratua eta " +"bat egin dezake eta ordezka dezake hamaika aldiz kate berean. Aldaketa " +"aukerak (letra-xeheekin eta abar) aplikatuko da bat egiten duen testuari, ez " +"eremuari bere osotasunean. Helmuga kutxak zehaztuko du non ezarriko den bat " +"egin eta ordezkatu eta gero sortuko den eremua. Ordezkatu dezakezu testua " +"eremuan, edo aurretik erantsi edo besterik gabe erantsi bat egiten duen " +"testua. Ikus " +"erreferentzia python adierazpen arruntei buruz gehiago irakurtzeko eta " +"begiratu batez ere 'sub' funtzioa." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:432 msgid "You must specify a destination when source is a composite field" -msgstr "" +msgstr "Zehaztu beha duzu helburu bat sorburua eremu mistoa denean" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:524 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:532 @@ -6877,10 +6905,14 @@ msgstr "Bilatu/ordeztu ez dabil" msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" +"Egileak ezin dira hutsik dagoen kate batean ezarri. Liburuaren izenburua %s " +"ez da prozesatu" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:533 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" +"Izenburuak ezin dira hutsik dagoen kate batean ezarri. Liburuaren izenburua " +"%s ez da prozesatu" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:624 msgid "Search pattern is invalid: %s" @@ -6891,6 +6923,8 @@ msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." msgstr "" +"Aldaketak ezartzen %d liburuetara.\n" +"Fase {0} {1}%%." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:314 msgid "Edit Meta information" @@ -6962,11 +6996,11 @@ msgstr "Ezabatu dena" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 msgid "If checked, the series will be cleared" -msgstr "" +msgstr "Arakatuz gero, seriak ezabatu egingo dira" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 msgid "Clear series" -msgstr "" +msgstr "Ezabatu serieak" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 msgid "" @@ -6975,6 +7009,13 @@ msgid "" "you selected them. So if you selected Book A and then Book B,\n" "Book A will have series number 1 and Book B series number 2." msgstr "" +"Ez bada ezer arakatu, liburuen serie-zenbakia honela ezarriko da: 1.\n" +"Arakatu bada, hautatutako liburuak modu automatikoan zenbakidun bihurtuko " +"dira, zeuk\n" +"ezarritako hurrenkeran. Beraz hautatu baduzu lehenengo A Liburua eta gero B " +"Liburua,\n" +"A Liburuak 1 serie zenbakia izango du eta B Liburuak 2 serie zenbakia izango " +"du." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 msgid "Automatically number books in this series" @@ -6986,6 +7027,11 @@ msgid "" "for that series. Checking this box will tell calibre to start numbering\n" "from the value in the box" msgstr "" +"Serieak normalean zenbaketa berriarekin geratuko dira datu baseko zenbakirik " +"altuenetik hasita\n" +"serie horretarako. Kutxa hau arakatzea calibreri adieraziko dio " +"zenbaketarekin hasteko\n" +"kutxan dagoen zenbakitik hasita" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 msgid "Remove &format:" @@ -6997,7 +7043,7 @@ msgstr "&Trukatu haien artean izenburua eta egilearen izena" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 msgid "Change title to title case" -msgstr "" +msgstr "Aldatu izenburua, izenburu letra tipora" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 msgid "" @@ -7005,6 +7051,9 @@ msgid "" "checked,\n" "title and author are swapped before the title case is set" msgstr "" +"Behartu ezazu izenburua izenburu letra tipoa izatera. Bietan, bai honetan " +"bai egile azterketan\n" +"egile eta izenburua aztertuko dira izenburu letra tipoa ezarri baino lehen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 msgid "" @@ -7037,17 +7086,19 @@ msgstr "Search &eremua:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:359 msgid "The name of the field that you want to search" -msgstr "" +msgstr "Aztertu nahi duzun eremuaren izena" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:360 msgid "Search mode:" -msgstr "" +msgstr "Bilaketa modua:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:361 msgid "" "Choose whether to use basic text matching or advanced regular expression " "matching" msgstr "" +"Aukeratu ea oinarrizko testuaren bilaketa egin edo adierazpen arrunten " +"bilaketa aurreratua egin" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:362 msgid "&Search for:" @@ -7058,16 +7109,21 @@ msgid "" "Enter the what you are looking for, either plain text or a regular " "expression, depending on the mode" msgstr "" +"Sartu bilatzen ari zaren hori, bai testu hutsa bai adierazpen arrunta, " +"aukeratu duzun moduaren arabera" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 msgid "" "Check this box if the search string must match exactly upper and lower case. " "Uncheck it if case is to be ignored" msgstr "" +"Arakatu kutxa honetan baldin eta bilaketa kateak bat egin behar badu zehatz " +"letra larri eta letra xeheekin. Ez arakatu kutxa honetan baldin eta letra " +"tipoari ez badiozu arreta eskaini nahi." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:365 msgid "Case sensitive" -msgstr "" +msgstr "Letra larriak/xeheak bereiziz" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 msgid "&Replace with:" @@ -7078,10 +7134,11 @@ msgid "" "The replacement text. The matched search text will be replaced with this " "string" msgstr "" +"Ordezkatze testua. Bat egiten duen testua kate honekin ordezkatu egingo da" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 msgid "Apply function after replace:" -msgstr "" +msgstr "Aplikatu funtzioa ordezkatu eta gero:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 msgid "" @@ -7090,24 +7147,30 @@ msgid "" "field is processed. In regular expression mode, only the matched text is " "processed" msgstr "" +"Zehaztu nola prozesatuko den testua bilaketa eta ordezkatzea egin eta gero. " +"Karaktere moduan, \n" +"eremu osoa prozesatu egingo da. Adierazpen erregular moduan, bakarrik " +"prozesatuko da bilatu eta bat egiten duen testua" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:371 msgid "&Destination field:" -msgstr "" +msgstr "&Helburu eremua:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 msgid "" "The field that the text will be put into after all replacements. If blank, " "the source field is used." msgstr "" +"Ordezkatzeak egin eta gero ezarriko den eremua. Zuriz utziz gero, sorburu " +"eremua erabiliko da." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:373 msgid "Mode:" -msgstr "" +msgstr "Modua:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:374 msgid "Specify how the text should be copied into the destination." -msgstr "" +msgstr "Zehaztu nola kopiatuko den testua helburura." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:375 msgid "" @@ -7115,10 +7178,13 @@ msgid "" "comma or\n" "nothing should be put between the original text and the inserted text" msgstr "" +"Ordezkatze modua aurretik edo atzetik erantsiz gero, orduan kutxak " +"adieraziko du ea koma bat edo\n" +"ezer ez jarriko den jatorrizko testua eta txertatutako testuaren artean" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 msgid "use comma" -msgstr "" +msgstr "erabili koma bat" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 msgid "Test &text" @@ -7395,7 +7461,7 @@ msgstr "Ezabatu ertza (ertzik baldin badago) liburu-azaletik" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 msgid "T&rim" -msgstr "" +msgstr "M&oztu" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 msgid "Reset cover to default" @@ -8143,11 +8209,11 @@ msgstr "&Gehitu jarioa" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:281 msgid "" "For help with writing advanced news recipes, please visit User Recipes" +"href=\"http://calibre-ebook.com/user_manual/news.html\">User Recipes" msgstr "" -"Laguntza lortzeko albiste formula aurreratuak idazterakoan, bisita ezazu " -"mesedez User " -"Recipes (Erabiltzailearen formulak)" +"Laguntzeko errezeta berriak idazten, mesedez bisita ezazu Erabiltzaileen " +"errezetak" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:282 msgid "Recipe source code (python)" @@ -8373,42 +8439,42 @@ msgstr " - Lanak" msgid "Eject this device" msgstr "Irakurgailua deskonektatu" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:209 msgid "Library" msgstr "Liburutegia" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 msgid "Show books in calibre library" msgstr "Erakutsi liburuak calibre liburutegian" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 msgid "Device" msgstr "Gailua" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 msgid "Show books in the main memory of the device" msgstr "Erakutsi liburuak irakurgailuaren memoria nagusian" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 #: /home/kovid/work/calibre/src/calibre/library/database2.py:839 msgid "Card A" msgstr "A txartela" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 msgid "Show books in storage card A" msgstr "Erakutsi liburuak A memoria-txartelean" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 #: /home/kovid/work/calibre/src/calibre/library/database2.py:841 msgid "Card B" msgstr "B txartela" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:70 msgid "Show books in storage card B" msgstr "Erakutsi liburuak B memoria-txartelean" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:110 msgid "available" msgstr "erabilgarria" @@ -8424,7 +8490,7 @@ msgstr "Bilaketa aurreratua" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:155 msgid "&Search:" -msgstr "" +msgstr "&Bilatu:" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:162 msgid "" @@ -8470,73 +8536,73 @@ msgid "Size (MB)" msgstr "Tamaina (Mb)" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 msgid "Book %s of %s." msgstr "Liburua %s honi buruz: %s." -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:697 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1222 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1229 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:401 msgid "The lookup/search name is \"{0}\"" msgstr "Bilaketa izena hauxe: \"{0}\"" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:916 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:917 msgid "In Library" msgstr "Liburutegian" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:921 msgid "Size" msgstr "Tamaina" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1209 msgid "Marked for deletion" msgstr "Ezabatzeko markatuta" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1205 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1212 msgid "Double click to edit me

    " msgstr "Egin ezazu klik birritan editatzeko

    " -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:118 msgid "Hide column %s" msgstr "Ezkutatu %s zutabea" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:123 msgid "Sort on %s" msgstr "%s -en arabera sailkatu" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 msgid "Ascending" msgstr "Gorantz" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:127 msgid "Descending" msgstr "Beherantz" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 msgid "Change text alignment for %s" msgstr "Alda ezazu testuaren lerrokatzea %s horretarako" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Left" msgstr "Ezkerretara" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:141 msgid "Right" msgstr "Eskuinetara" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:142 msgid "Center" msgstr "Erdian" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:161 msgid "Show column" msgstr "Erakutsi zutabea" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:173 msgid "Restore default layout" msgstr "Berrezarri lehenetsitako diseinua" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:686 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8776,23 +8842,23 @@ msgstr "Ez da bat etortzerik aurkitu liburu honetarako" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 msgid "Failed to download metadata" -msgstr "" +msgstr "Kale egin du metadatuak deskargatzen" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:217 msgid "cover" -msgstr "" +msgstr "liburu-azala" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:218 msgid "Downloaded" -msgstr "" +msgstr "Deskargatua" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:218 msgid "Failed to get" -msgstr "" +msgstr "Ezin izan da eskuratu" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:219 msgid "%s %s for: %s" -msgstr "" +msgstr "%s %s honetarako: %s" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:162 @@ -8801,11 +8867,11 @@ msgstr "Egina" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:279 msgid "Successfully downloaded metadata for %d out of %d books" -msgstr "" +msgstr "Ongi deskargatu dira metadatuak %d horietarako %d liburuetatik" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:281 msgid "Details" -msgstr "" +msgstr "Zehaztasunak" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/__init__.py:36 msgid "" @@ -9070,7 +9136,7 @@ msgstr "Bai/Ez" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 msgid "Column built from other columns" -msgstr "" +msgstr "Beste zutabeetatik eraiki den zutabea" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 msgid "No column selected" @@ -9118,7 +9184,7 @@ msgstr "Goiburua %s dagoeneko erabilita dago" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:156 msgid "You must enter a template for composite columns" -msgstr "" +msgstr "Txantiloia sartu beharko duzu zutabe mistoentzat" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 @@ -9191,18 +9257,19 @@ msgstr "Formatuak &datak" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:143 msgid "

    Field template. Uses the same syntax as save templates." msgstr "" +"

    Eremu txantiloia. Erabiltzen du gordetako txantiloiek duten sintaxi bera." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:144 msgid "Similar to save templates. For example, {title} {isbn}" -msgstr "" +msgstr "Gordetako txantiloien antzekoa. Esate baterako, {title} {isbn}" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 msgid "Default: (nothing)" -msgstr "" +msgstr "Lehenetsita: (ezer ez)" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 msgid "&Template" -msgstr "" +msgstr "&Txantiloia" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/device_debug.py:21 msgid "Getting debug information" @@ -9439,13 +9506,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:101 msgid "Backup metadata" -msgstr "" +msgstr "Metadatuen babes kopia" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:102 msgid "" "Metadata will be backed up while calibre is running, at the rate of 30 books " "per minute." msgstr "" +"Metadatuen babes kopia egingo da calibre martxan dagoen bitartean. 30 liburu " +"/ minutuko, gutxi gorabehera, lastertasunarekin, ." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:133 msgid "Failed to install command line tools." @@ -9495,27 +9564,37 @@ msgstr "&Instalatu lerro-aginduen, lerro-komandoen, lanabesa" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:76 msgid "Back up metadata of all books" -msgstr "" +msgstr "Liburu guztien metadatuen babes kopia" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:77 msgid "Check the library folders for potential problems" -msgstr "" +msgstr "Arakatu liburutegi karpetak balizko problemen bila" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:43 +msgid "Device currently connected: " +msgstr "Irakurgailua konektaturik oraintxe bertan: " + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:46 +msgid "Device currently connected: None" +msgstr "Irakurgailua konektaturik oraintxe bertan: bat ere ez" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:207 msgid "" "That format and device already has a plugboard or conflicts with another " "plugboard." msgstr "" +"Formatu horrek eta irakurgailu horrek dagoeneko badu konexio-txartelik edo " +"bestela badago beste konexio-txartel batekin gatazkaren bat." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:240 msgid "Invalid destination" -msgstr "" +msgstr "Helburu baliogabea" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:241 msgid "The destination field cannot be blank" -msgstr "" +msgstr "Helburu eremua ezin da hutsik egon" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 msgid "" "Here you can change the metadata calibre uses to update a book when saving " "to disk or sending to device.\n" @@ -9535,41 +9614,41 @@ msgid "" "would be to specify the language." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 -msgid "Format (choose first)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:114 -msgid "Device (choose second)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:115 -msgid "Add new plugboard" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:116 -msgid "Edit existing plugboard" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:117 -msgid "Existing plugboards" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:118 -msgid "Source template" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:119 -msgid "Destination field" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:120 -msgid "Save plugboard" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:121 +msgid "Format (choose first)" +msgstr "Formatua (aukeratu lehenengo)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:122 +msgid "Device (choose second)" +msgstr "Gailua (aukeratu segundo batean)" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:123 +msgid "Add new plugboard" +msgstr "Gehitu konexio-txartel berria" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:124 +msgid "Edit existing plugboard" +msgstr "Editatu dagoen konexio-txartela" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:125 +msgid "Existing plugboards" +msgstr "Daudenen konexio-txartelak" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:126 +msgid "Source template" +msgstr "Sorburu txantiloia" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:127 +msgid "Destination field" +msgstr "Helburu eremua" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:128 +msgid "Save plugboard" +msgstr "Gorde konexio-txartela" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:129 msgid "Delete plugboard" -msgstr "" +msgstr "Ezabatu konexio-txartela" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:100 msgid "%(plugin_type)s %(plugins)s" @@ -9663,11 +9742,13 @@ msgstr "&Gehitu" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:33 msgid "Any custom field" -msgstr "" +msgstr "Pertsonalizaturiko edozein eremu" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:34 msgid "The lookup name of any custom field. These names begin with \"#\")" msgstr "" +"Pertsonalizatutako edozein eremutako bilaketa izena. Izen hauek ikur honekin " +"hasiko: \"#\")" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:47 msgid "Save &template" @@ -10894,6 +10975,8 @@ msgstr "Hautatu liburuendako kokagunea" msgid "" "You must choose an empty folder for the calibre library. %s is not empty." msgstr "" +"Aukeratu beharko duzu hutsik dagoen edozein karpeta calibre liburutegirako. " +"%s hori ez dago hutsik." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:703 msgid "welcome wizard" @@ -11178,7 +11261,7 @@ msgstr "aztertu gabea" #: /home/kovid/work/calibre/src/calibre/library/caches.py:539 #: /home/kovid/work/calibre/src/calibre/library/caches.py:549 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "no" msgstr "Ez" @@ -11189,7 +11272,7 @@ msgstr "aztertua" #: /home/kovid/work/calibre/src/calibre/library/caches.py:542 #: /home/kovid/work/calibre/src/calibre/library/caches.py:552 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:175 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "yes" msgstr "bai" @@ -11449,35 +11532,35 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:17 msgid "Invalid titles" -msgstr "" +msgstr "Izenburu horiek ez dira zuzenak" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:18 msgid "Extra titles" -msgstr "" +msgstr "Aparteko izenburuak" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:19 msgid "Invalid authors" -msgstr "" +msgstr "Egile horiek ez dira zuzenak" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:20 msgid "Extra authors" -msgstr "" +msgstr "Aparteko egileak" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:21 msgid "Missing book formats" -msgstr "" +msgstr "Galdutako liburu formatuak" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:22 msgid "Extra book formats" -msgstr "" +msgstr "Aparteko liburu formatuak" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:23 msgid "Unknown files in books" -msgstr "" +msgstr "Fitxategi ezezagunak liburuetan" #: /home/kovid/work/calibre/src/calibre/library/check_library.py:24 msgid "Folders raising exception" -msgstr "" +msgstr "Goraka doazen karpeten salbuespena" #: /home/kovid/work/calibre/src/calibre/library/cli.py:43 msgid "" @@ -12017,32 +12100,42 @@ msgid "" "Perform some checks on the filesystem representing a library. Reports are " "{0}\n" msgstr "" +"%prog aztertu_liburutegia [options]\n" +"\n" +"Egin itzazu liburutegia osatzen duen fitxategi sisteman azterketa eta " +"egiaztapen batzuk . Txostenak hauek dira: {0}\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:886 msgid "Output in CSV" -msgstr "" +msgstr "Helburua CSV (Comma Separated Values) horretan" #: /home/kovid/work/calibre/src/calibre/library/cli.py:889 msgid "" "Comma-separated list of reports.\n" "Default: all" msgstr "" +"Txostenak komaz bereizitako zerrenda.\n" +"Lehenetsita: dena" #: /home/kovid/work/calibre/src/calibre/library/cli.py:893 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" msgstr "" +"Komaz bereizitako luzapenen zerrenda kasurik ez egiteko.\n" +"Lehenetsita: dena" #: /home/kovid/work/calibre/src/calibre/library/cli.py:897 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" +"Komaz bereizitako izenen zerrenda kasurik ez egiteko.\n" +"Lehenetsita: dena" #: /home/kovid/work/calibre/src/calibre/library/cli.py:927 msgid "Unknown report check" -msgstr "" +msgstr "Txosten azterketa ezezaguna" #: /home/kovid/work/calibre/src/calibre/library/cli.py:966 msgid "" @@ -12053,7 +12146,7 @@ msgid "" " files in each directory of the calibre library. This is\n" " useful if your metadata.db file has been corrupted.\n" "\n" -" WARNING: This completely regenrates your datbase. You will\n" +" WARNING: This completely regenerates your datbase. You will\n" " lose stored per-book conversion settings and custom recipes.\n" " " msgstr "" @@ -12130,21 +12223,21 @@ msgstr "Balorazioak" #: /home/kovid/work/calibre/src/calibre/library/restore.py:117 msgid "Processed" -msgstr "" +msgstr "Prozesatua" #: /home/kovid/work/calibre/src/calibre/library/restore.py:182 msgid "creating custom column " -msgstr "" +msgstr "zutabe pertsonalizatua sortzen " -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:31 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 msgid "The title" msgstr "Izenburua" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 msgid "The authors" msgstr "Egileak" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:34 msgid "" "The author sort string. To use only the first letter of the name use " "{author_sort[0]}" @@ -12152,15 +12245,15 @@ msgstr "" "Egile-izenen sailkapen katea. Erabiltzeko bakarrik egilearen izenaren lehen " "letra, erabil ezazu {author_sort[0]}" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:35 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 msgid "The tags" msgstr "Etiketak" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:36 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 msgid "The series" msgstr "Serieak" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:38 msgid "" "The series number. To get leading zeros use {series_index:0>3s} or " "{series_index:>3s} for leading spaces" @@ -12168,35 +12261,35 @@ msgstr "" "Serie zenbakia. Erabil ezazu {series_index:0>3s} zeroak ezkerretara " "tartekatzeko edo {series_index:>3s} espazioak tartekatzeko" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:40 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 msgid "The rating" msgstr "Balorazioa" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:41 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 msgid "The ISBN" msgstr "ISBN zkia." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:42 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 msgid "The publisher" msgstr "Argitaletxea" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 msgid "The date" msgstr "Data" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:44 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 msgid "The published date" msgstr "Noiz argitaratua" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:45 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:46 msgid "The calibre internal id" msgstr "calibreren barneko ID" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:55 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:56 msgid "Options to control saving to disk" msgstr "Kontrolatzeko diskoan gordetzeko aukerak" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:61 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:62 msgid "" "Normally, calibre will update the metadata in the saved files from what is " "in the calibre library. Makes saving to disk slower." @@ -12205,7 +12298,7 @@ msgstr "" "calibreren liburutegian dauden edukiei esker. Eguneratze honek diskoan " "gordetze prozesua moteltzen du." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:64 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:65 msgid "" "Normally, calibre will write the metadata into a separate OPF file along " "with the actual e-book files." @@ -12213,7 +12306,7 @@ msgstr "" "Normalean, calibrek metadatuak bereiziriko OPF fitxategi batean idatziko " "ditu, oraingo liburu elektronikoen fitxategiekin batera." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:67 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:68 msgid "" "Normally, calibre will save the cover in a separate file along with the " "actual e-book file(s)." @@ -12221,7 +12314,7 @@ msgstr "" "Normalean, calibrek liburu-azalak bereiziriko fitxategi batean gordeko ditu, " "oraingo liburu elektronikoen fitxategi(ar)ekin batera." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:70 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:71 msgid "" "Comma separated list of formats to save for each book. By default all " "available formats are saved." @@ -12229,7 +12322,7 @@ msgstr "" "Liburu bakoitzaren komen bidez bereizitako formatuen zerrenda gordetzeko. " "Lehenetsita: eskuragarri dauden formatu guztiak gordeko dira." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:73 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:74 msgid "" "The template to control the filename and directory structure of the saved " "files. Default is \"%s\" which will save books into a per-author " @@ -12242,7 +12335,7 @@ msgstr "" "gordeko ditu non fitxategi-izenak liburuaren izenburua eta egile-izenak " "izango ditu bere baitan. Eskuragarri dauden kontrolak hauek dira: {%s}" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:78 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:79 msgid "" "The template to control the filename and directory structure of files sent " "to the device. Default is \"%s\" which will save books into a per-author " @@ -12254,7 +12347,7 @@ msgstr "" "izenaren araberako direktorio batera liburuaren izenburuarekin eta egilearen " "izenarekin gordeko ditu. Eskuragarri dauden kontrolak hauek dira: {%s}" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:85 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:86 msgid "" "Normally, calibre will convert all non English characters into English " "equivalents for the file names. WARNING: If you turn this off, you may " @@ -12267,8 +12360,8 @@ msgstr "" "Akatsak izateko aukera gordetzen ari zaren fitxategi-sistemak zelan jasaten " "duen unicode araberakoa izango da." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:91 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:94 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:92 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:95 msgid "" "The format in which to display dates. %d - day, %b - month, %Y - year. " "Default is: %b, %Y" @@ -12276,15 +12369,15 @@ msgstr "" "Datak erakusteko formatua. %d - eguna, %b - hilabetea, %Y - urtea (AEBko " "ohitura). Lehenetsita honela: %b, %Y" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:97 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:98 msgid "Convert paths to lowercase." msgstr "Bihurtu bideak minuskuletara, letra xeheetara." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:99 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:100 msgid "Replace whitespace with underscores." msgstr "Ordeztu espazio zuriak azpiko marrekin." -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:319 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:330 msgid "Requested formats not available" msgstr "Eskatutako formatuak ez daude eskuragarri" @@ -12589,7 +12682,7 @@ msgstr "Alemana (AT)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:115 msgid "French (BE)" -msgstr "" +msgstr "Frantsesa (BE)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:116 msgid "Dutch (NL)" @@ -12601,41 +12694,44 @@ msgstr "Nederlandera (Belgika)" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:56 msgid "Choose theme (needs restart)" -msgstr "" +msgstr "Aukeratu gaia (berrabiarazi beharko gero)" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:188 msgid "No interpreter" -msgstr "" +msgstr "Interpreterik ez" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:189 msgid "No active interpreter found. Try restarting the console" msgstr "" +"Ez da interprete aktiborik aurkitu. Saia zaitez kontsola berrabiarazten" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:203 msgid "Interpreter died" -msgstr "" +msgstr "Interpretea bat-batean desagertu da" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/console.py:204 msgid "" "Interpreter dies while excuting a command. To see the command, click Show " "details" msgstr "" +"Interpretea bat-batean desagertu da aginte bat exekutatu bitartean. Agintea " +"ikusteko, egin klik \"Erakutsi zehaztasunak\" horretan" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:20 msgid "Welcome to" -msgstr "" +msgstr "Ongi etorri" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:41 msgid " console " -msgstr "" +msgstr " kontsola " #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:51 msgid "Code is running" -msgstr "" +msgstr "Kodea martxan" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:58 msgid "Restart console" -msgstr "" +msgstr "Berrabiarazi kontsola" #: /home/kovid/work/calibre/src/calibre/utils/sftp.py:53 msgid "URL must have the scheme sftp" @@ -13194,6 +13290,14 @@ msgstr "Ez deskargatu CSS (Cascading Style Sheets) estilo orririk." #~ msgid "Restore to &default" #~ msgstr "Berrezarri &lehenetsia" +#~ msgid "" +#~ "For help with writing advanced news recipes, please visit User Recipes" +#~ msgstr "" +#~ "Laguntza lortzeko albiste formula aurreratuak idazterakoan, bisita ezazu " +#~ "mesedez User " +#~ "Recipes (Erabiltzailearen formulak)" + #~ msgid "Reader" #~ msgstr "Irakurgailua" diff --git a/src/calibre/translations/fi.po b/src/calibre/translations/fi.po index c72ee8e299..a911f4002b 100644 --- a/src/calibre/translations/fi.po +++ b/src/calibre/translations/fi.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-08-27 18:12+0000\n" -"PO-Revision-Date: 2010-08-27 20:19+0000\n" -"Last-Translator: Rami Selin \n" +"POT-Creation-Date: 2010-10-03 21:03+0000\n" +"PO-Revision-Date: 2010-10-03 06:43+0000\n" +"Last-Translator: Torsti Schulz \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-08-28 03:36+0000\n" +"X-Launchpad-Export-Date: 2010-10-04 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -22,13 +22,17 @@ msgid "Does absolutely nothing" msgstr "Ei tee mitään" #: /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/hanvon/driver.py:87 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:88 +#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:24 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:412 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:522 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:405 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:525 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:398 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 @@ -40,23 +44,25 @@ msgstr "Ei tee mitään" #: /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:240 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:283 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:286 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:20 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:231 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:30 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:69 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:354 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 #: /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/fb2.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:65 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:945 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1057 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1017 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1129 #: /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 @@ -72,12 +78,14 @@ msgstr "Ei tee mitään" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 #: /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:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 -#: /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/oeb/base.py:909 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:914 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:980 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:118 #: /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 @@ -100,48 +108,47 @@ msgstr "Ei tee mitään" #: /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:247 -#: /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/add.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:138 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1163 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1166 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:239 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:280 +#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:903 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1196 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1199 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:513 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:362 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:382 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:882 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1060 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:91 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:96 -#: /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/gui2/dialogs/metadata_single.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:913 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1107 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:187 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 #: /home/kovid/work/calibre/src/calibre/library/database.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:362 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:374 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1007 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1076 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1760 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1762 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1889 -#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:201 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:396 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:408 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1265 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1366 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2115 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2117 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2244 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:219 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 -#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:70 -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:76 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:118 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:78 @@ -170,15 +177,17 @@ msgstr "Metatietojen kirjoittaja" msgid "Catalog generator" msgstr "Katalogin luoja" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:369 msgid "User Interface Action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:376 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:386 #: /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/dialogs/config/config_ui.py:605 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:201 +#: /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 "" @@ -225,45 +234,213 @@ msgstr "Poimi kansi sarjakuvatiedostosta" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:205 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:215 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:225 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:236 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:247 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:259 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:280 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:291 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:301 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:311 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:235 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:246 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:258 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:279 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:290 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:300 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:310 msgid "Read metadata from %s files" msgstr "Lue metatiedot %s -tiedostoista" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:270 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:269 msgid "Read metadata from ebooks in RAR archives" msgstr "Lue metatiedot RAR-arkiston e-kirjoista" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:322 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:321 msgid "Read metadata from ebooks in ZIP archives" msgstr "Lue metatiedot ZIP-arkiston e-kirjoista" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:335 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:345 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:355 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:377 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:388 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:398 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:334 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:344 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:354 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:376 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:387 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:397 msgid "Set metadata in %s files" msgstr "Aseta metatiedot %s -tiedostoille" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365 msgid "Set metadata from %s files" msgstr "Aseta metatiedot %s -tiedostoista" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:681 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:690 msgid "Look and Feel" +msgstr "Käyttötuntuma" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:692 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:704 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:715 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +msgid "Interface" +msgstr "Käyttöliittymä" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:696 +msgid "Adjust the look and feel of the calibre interface to suit your tastes" +msgstr "" +"Mukauta calibren käyttöliittymän ulkoasu ja käyttötuntuma sinulle " +"mieleiseksi." + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:702 +msgid "Behavior" +msgstr "Käyttäytyminen" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708 +msgid "Change the way calibre behaves" +msgstr "Muuta calibren käyttäytymistä." + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:180 +msgid "Add your own columns" +msgstr "Lisää omia sarakkeita" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 +msgid "Add/remove your own columns to the calibre book list" +msgstr "Lisää/poista sarakkeita calibren kirjaluetteloon" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +msgid "Customize the toolbar" +msgstr "Mukauta työkalupalkkia" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +msgid "" +"Customize the toolbars and context menus, changing which actions are " +"available in each" +msgstr "Valitse työkalupalkkeissa ja pikavalikkossa näkyvät toiminnot." + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +msgid "Input Options" +msgstr "Syöteasetukset" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:738 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:749 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +msgid "Conversion" +msgstr "Muuntaminen" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 +msgid "Set conversion options specific to each input format" +msgstr "Valitse jokaisen syötemuodon muunnosasetukset" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +msgid "Common Options" +msgstr "Yhteiset asetukset" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 +msgid "Set conversion options common to all formats" +msgstr "Aseta kaikille muodoille yhteiset asetukset" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +msgid "Output Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:682 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 -msgid "Interface" +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 +msgid "Set conversion options specific to each output format" +msgstr "Valitse jokaisen vientimuodon muunnosasetukset" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +msgid "Adding books" +msgstr "Kirjojen lisääminen" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:783 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:795 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:807 +msgid "Import/Export" +msgstr "Tuonti ja vienti" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +msgid "Control how calibre reads metadata from files when adding books" msgstr "" +"Säädä sitä, miten calibre lukee metatiedot tiedostoista kirjoja lisättäessä" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +msgid "Saving books to disk" +msgstr "Kirjojen tallentaminen levylle" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +msgid "" +"Control how calibre exports files from its database to disk when using Save " +"to disk" +msgstr "" +"Säädä sitä, miten calibre vie tiedostoja tietokannastaan kun tallennetaan " +"levylle" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +msgid "Sending books to devices" +msgstr "Kirjojen lähettäminen laitteisiin" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +msgid "Control how calibre transfers files to your ebook reader" +msgstr "Säädä sitä, miten calibre siirtää tiedostoja e-kirjojen lukijaasi" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +msgid "Metadata plugboards" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +msgid "Change metadata fields before saving/sending" +msgstr "Muuta metatietokenttiä ennen tallentamista/lähettämistä" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 +msgid "Sharing books by email" +msgstr "Kirjojen jakaminen sähköpostitse" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:818 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +msgid "Sharing" +msgstr "Jakaminen" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 +msgid "" +"Setup sharing of books via email. Can be used for automatic sending of " +"downloaded news to your devices" +msgstr "" +"Ota käyttöön kirjojen jakaminen sähköpostitse. Toimintoa voidaan käyttää " +"lähettämään ladatut uutiset automaattisesti laitteellesi" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +msgid "Sharing over the net" +msgstr "Jakaminen verkon kautta" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 +msgid "" +"Setup the calibre Content Server which will give you access to your calibre " +"library from anywhere, on any device, over the internet" +msgstr "" +"Ota käyttöön calibren sisältöpalvelin. Sen avulla pääset käsiksi kirjastoosi " +"verkon kautta missä tahansa ja millä tahansa laitteella" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 +msgid "Plugins" +msgstr "Lisäosat" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:866 +msgid "Advanced" +msgstr "Lisäasetukset" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +msgid "Add/remove/customize various bits of calibre functionality" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +msgid "Tweaks" +msgstr "Hienosäätö" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 +msgid "Fine tune how calibre behaves in various contexts" +msgstr "Hienosäädä calibren käyttäytymistä eri yhteyksissä" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 +msgid "Miscellaneous" +msgstr "Sekalaiset" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 +msgid "Miscellaneous advanced configuration" +msgstr "Sekalaiset kehittyneet asetukset" #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102 msgid "Conversion Input" @@ -294,11 +471,11 @@ msgstr "" "luettava. Ei vaikuta välttämättä muiden tulokseen vaikuttavien lisäosien " "toimintaan." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:45 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:46 msgid "Input profile" msgstr "Syöttöprofiili" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:49 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:50 msgid "" "This profile tries to provide sane defaults and is useful if you know " "nothing about the input document." @@ -306,84 +483,84 @@ msgstr "" "Tämä profiili yrittää tarjota järkevät esiasetukset ja on käyttökelpoinen " "jos et tiedä mitään syötettävästä dokumentista." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:57 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:414 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:58 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:425 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" "Tämä profiili on tarkoitettu SONY PRS -laitteille, esim. 500/505/600/700 jne." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:69 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:70 msgid "This profile is intended for the SONY PRS 300." msgstr "Tämä profiili on tarkoitettu SONY PRS-300 -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:78 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:449 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:79 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the SONY PRS-900." msgstr "Tämä profiili on tarkoitettu SONY PRS-900 -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:86 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:479 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:87 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:492 msgid "This profile is intended for the Microsoft Reader." msgstr "Tämä profiili on tarkoitettu Microsoft Reader -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:97 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:490 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:98 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:503 msgid "This profile is intended for the Mobipocket books." msgstr "Tämä profiili on tarkoitettu Mobipocket-kirjoille." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:110 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:503 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:111 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:516 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "" "Tämä profiili on tarkoitettu Hanlin V3 -laitteelle ja sen klooneille." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:122 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:515 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:123 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:528 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "" "Tämä profiili on tarkoitettu Hanlin V5 -laitteelle ja sen klooneille." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:132 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:523 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:133 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:536 msgid "This profile is intended for the Cybook G3." msgstr "Tämä profiili on tarkoitettu Cybook G3 -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:145 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:146 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Cybook Opus." msgstr "Tämä profiili on tarkoitettu Cybook Opus -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:157 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:547 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:158 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:560 msgid "This profile is intended for the Amazon Kindle." msgstr "Tämä profiili on tarkoitettu Amazon Kindle -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:169 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:584 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:170 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:600 msgid "This profile is intended for the Irex Illiad." msgstr "Tämä profiili on tarkoitettu Irex Illiad -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:181 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:182 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:613 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Tämä profiili on tarkoitettu IRex Digital Reader 1000 -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:194 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:611 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:195 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:627 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Tämä profiili on tarkoitettu IRex Digital Reader 800 -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:206 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:625 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:207 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:641 msgid "This profile is intended for the B&N Nook." msgstr "Tämä profiili on tarkoitettu B&N Nook -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:228 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:229 msgid "Output profile" msgstr "Tulosprofiili" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:232 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:233 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 " @@ -393,26 +570,26 @@ msgstr "" "jos haluat tuottaa dokumentin luettavaksi tietokoneella tai erilaisilla " "laitteilla." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:269 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Tarkoitettu iPadille ja vastaaville laitteille, joiden näyttötarkkuus on " "768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:440 msgid "This profile is intended for the Kobo Reader." msgstr "Tämä profiili on tarkoitettu Kobo Readerille." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:440 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:453 msgid "This profile is intended for the SONY PRS-300." msgstr "Tämä profiili on tarkoitettu SONY PRS-300 -laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:458 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:471 msgid "This profile is intended for the 5-inch JetBook." msgstr "Tämä profiili on tarkoitettu 5-tuumaiselle JetBook-laitteelle." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:480 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -420,7 +597,7 @@ msgstr "" "Tämä profiili on tarkoitettu SONY PRS -laitteille, esim. 500/505/700 jne, " "vaakatasossa käytettäväksi. Käyttökelpoinen etenkin sarjakuville." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:566 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:581 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Tämä profiili on tarkoitettu Amazon Kindle DX -laitteelle." @@ -444,15 +621,15 @@ msgstr "Käytöstä poistetut lisäosat" msgid "Enabled plugins" msgstr "Käytössä olevat pluginit" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:93 msgid "No valid plugin found in " msgstr "Sopivaa lisäosaa ei löydetty " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:508 msgid "Initialization of plugin %s failed with traceback:" msgstr "%s lisäosan alustaminen epäonnistui:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:541 msgid "" " %prog options\n" "\n" @@ -464,17 +641,17 @@ msgstr "" " Säädä calibrea lataamalla ulkoisia lisäosia.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:547 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "Lisää lisäosa määrittämällä sen sisältävän zip-tiedoston polku." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:549 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Poista valinnainen lisäosa nimen perusteella. Ei vaikuta " "sisäänrakennettuihin lisäosiin" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:551 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -482,15 +659,15 @@ msgstr "" "Säädä lisäosaa. Määritä lisäosan nimi ja säädöksen käskyjono pilkulla " "erotettuna." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:553 msgid "List all installed plugins" msgstr "Listaa kaikki asennetut lisäosat" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:555 msgid "Enable the named plugin" msgstr "Salli nimetty lisäosa" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:557 msgid "Disable the named plugin" msgstr "Poista nimetty lisäosa käytöstä" @@ -498,7 +675,7 @@ msgstr "Poista nimetty lisäosa käytöstä" msgid "Communicate with Android phones." msgstr "Kommunikoi Android-puhelinten kanssa." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:50 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:52 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -506,47 +683,51 @@ msgstr "" "Pilkulla eroteltu lista laitteen hakemistoista, joihin e-kirjat lähetetään. " "Ensimmäistä olemassaolevaa käytetään" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:94 msgid "Communicate with S60 phones." msgstr "Kommunikoi S60-puhelimien kanssa." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:86 +msgid "Apple device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:88 msgid "Communicate with iTunes/iBooks." msgstr "Kommunikoi iTunesin/iBooksin kanssa" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:93 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:94 msgid "Apple device detected, launching iTunes, please wait ..." msgstr "Apple-laite havaittu, ladataan iTunes, odota hetki..." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:247 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:250 msgid "Updating device metadata listing..." msgstr "Päivittää laitteen metatietolistausta..." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:921 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:957 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2822 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2861 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:324 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:363 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:923 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:963 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2832 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2872 msgid "%d of %d" msgstr "%d %d:stä" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:369 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:962 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2867 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:370 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:968 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2878 msgid "finished" msgstr "Valmis" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:544 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:545 msgid "Use Series as Category in iTunes/iBooks" msgstr "Käytä Sarjaa kategoriana iTunesissa/iBooksissa" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:546 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:547 msgid "Cache covers from iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:558 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:559 msgid "" "Some books not found in iTunes database.\n" "Delete using the iBooks app.\n" @@ -556,7 +737,7 @@ msgstr "" "Poista iBooks-sovelluksella.\n" "Valitse 'Näytä yksityiskohdat' nähdäksesi listan." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:886 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:887 msgid "" "Some cover art could not be converted.\n" "Click 'Show Details' for a list." @@ -564,19 +745,27 @@ msgstr "" "Osaa kansitaiteesta ei voitu kääntää.\n" "Valitse 'Näytä yksityiskohdat' nähdäksesi listan." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2491 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2500 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:817 #: /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:190 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:203 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1644 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:132 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:853 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:248 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:209 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:222 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1975 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:135 msgid "News" msgstr "Uutiset" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2729 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2501 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:556 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1938 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1956 +msgid "Catalog" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2739 msgid "Communicate with iTunes." msgstr "Kommunikoi iTunesin kanssa." @@ -627,11 +816,11 @@ msgid "Communicate with the Sigmatek eBook reader." msgstr "Kommunikoi Sigmatek eBook -lukijan kanssa." #: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16 -#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:30 +#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:31 msgid "Use an arbitrary folder as a device." msgstr "Käytä kansiota laitteena." -#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:26 +#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:27 #: /home/kovid/work/calibre/src/calibre/devices/interface.py:14 msgid "Device Interface" msgstr "Laiterajapinta" @@ -656,23 +845,32 @@ msgstr "" "Pilkulla jaettu lista laitteen kansioista, joihin e-kirjat lähetetään. " "Ensimmäistä olemassaolevaa käytetään." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:22 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "Kommunikoi Hanvon N520 -lukijan kanssa." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:47 msgid "Communicate with The Book reader." msgstr "Kommunikoi The Book -lukijan kanssa." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:59 msgid "Communicate with the SpringDesign Alex eBook reader." msgstr "Kommunikoi SpringDesign Alex eBook -lukijan kanssa." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:102 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:248 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:280 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 +msgid "Removing books from device..." +msgstr "Poistetaan kirjoja laitteelta..." + +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:119 msgid "Communicate with the Azbooka" msgstr "Kommunikoi Azbookan kanssa" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:138 msgid "Communicate with the Elonex EB 511 eBook reader." msgstr "Kommunikoi Elonex EB 511 -lukijan kanssa." @@ -702,10 +900,14 @@ msgstr "Kommunikoi Iriver Story -lukijan kanssa." msgid "Communicate with the JetBook eBook reader." msgstr "Kommunikoi JetBook-lukijan kanssa." -#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:86 +#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:88 msgid "Communicate with the MiBuk Wolder reader." msgstr "Kommunikoi MiBuk Wolder -lukijan kanssa" +#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:116 +msgid "Communicate with the JetBook Mini reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." msgstr "Kommunikoi Kindle-lukijan kanssa." @@ -718,14 +920,20 @@ msgstr "" msgid "Communicate with the Kindle DX eBook reader." msgstr "Kommunikoi Kindle DX -lukijan kanssa." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:22 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:23 msgid "Communicate with the Kobo Reader" msgstr "Kommunikoi Kobo Readerin kanssa" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:53 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:56 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:59 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:170 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:47 +msgid "" +"The Kobo supports only one collection currently: the \"Im_Reading\" list. " +"Create a tag called \"Im_Reading\" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:63 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:66 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:69 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:188 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:68 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 @@ -735,33 +943,26 @@ msgstr "Kommunikoi Kobo Readerin kanssa" msgid "Getting list of books on device..." msgstr "Haetaan listaa laitteella olevista kirjoista..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:230 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:274 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:253 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:271 -msgid "Removing books from device..." -msgstr "Poistetaan kirjoja laitteelta..." - -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:278 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:285 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:284 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:291 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:278 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 msgid "Removing books from device metadata listing..." msgstr "Poistetaan kirjoja laitteen metatietolistasta..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:290 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:324 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:330 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:217 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 msgid "Adding books to device metadata listing..." msgstr "Lisätään kirjoja laitteen metatietolistaan..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:253 msgid "Not Implemented" msgstr "Ei toteutettu" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:376 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:393 msgid "" "\".kobo\" files do not exist on the device as books instead, they are rows " "in the sqlite database. Currently they cannot be exported or viewed." @@ -787,6 +988,14 @@ msgstr "Kommunikoi Koganin kanssa" msgid "Communicate with the Pandigital Novel" msgstr "Kommunikoi Pandigital Novelin kanssa" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +msgid "Communicate with the VelocityMicro" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:132 +msgid "Communicate with the GM2000" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "Kommunikoi Nokia 770 internet tablet -laitteen kanssa." @@ -827,7 +1036,7 @@ msgstr "" "Pilkun erottama lista metatietokentistä, jotka muutetaan kokoelmiksi " "laitteella. Vaihtoehtoja ovat: " -#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:149 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "Nimeämätön" @@ -848,6 +1057,10 @@ msgstr "Kommunikoi Newsmy-lukijan kanssa." msgid "Communicate with the iPapyrus reader." msgstr "Kommunikoi iPapyrus-lukijan kanssa." +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:59 +msgid "Communicate with the Sovos reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:255 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "Levyasemaa %s ei havaittu. Kokeile uudelleenkäynnistämistä." @@ -911,7 +1124,7 @@ msgid "Place files in sub directories if the device supports them" msgstr "Aseta tiedostot alihakemistoihin, mikäli laite tukee niitä" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:43 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:86 msgid "Read metadata from files on device" msgstr "Lue metatiedot laitteella olevista tiedostoista" @@ -924,7 +1137,7 @@ msgid "Template to control how books are saved" msgstr "Kontrollimalli, jonka mukaan kirjat tallennetaan" #: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:89 msgid "Extra customization" msgstr "Lisäasetukset" @@ -941,7 +1154,7 @@ msgstr "Haetaan laitetietoja..." msgid "Transferring books to device..." msgstr "Siirretään kirjoja laitteelle..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:314 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:313 msgid "Sending metadata to device..." msgstr "Lähetetään metatietoja laitteelle..." @@ -1466,28 +1679,43 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:367 +msgid "" +"Scale used to determine the length at which a line should be unwrapped if " +"preprocess is enabled. Valid values are a decimal between 0 and 1. The " +"default is 0.40, just below the median line length. This will unwrap typical " +"books with hard line breaks, but should be reduced if the line length is " +"variable." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:376 +msgid "" +"Convert plain quotes, dashes and ellipsis to their typographically correct " +"equivalents. For details, see http://daringfireball.net/projects/smartypants" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:384 msgid "Use a regular expression to try and remove the header." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:374 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:391 msgid "The regular expression to use to remove the header." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:397 msgid "Use a regular expression to try and remove the footer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:387 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:404 msgid "The regular expression to use to remove the footer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:394 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:411 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/calibre/src/calibre/ebooks/conversion/plumber.py:401 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:418 msgid "" "Transliterate unicode characters to an ASCII representation. Use with care " "because this will replace unicode characters with ASCII. For instance it " @@ -1497,7 +1725,7 @@ msgid "" "number of people will be used (Chinese in the previous example)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:416 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:433 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 " @@ -1507,101 +1735,101 @@ msgid "" "instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38 msgid "Set the title." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:432 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 msgid "Set the authors. Multiple authors should be separated by ampersands." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:437 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:454 msgid "The version of the title to be used for sorting. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:441 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:458 msgid "String to be used when sorting by author. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:462 msgid "Set the cover to the specified file or URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:466 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54 msgid "Set the ebook description." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:470 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56 msgid "Set the ebook publisher." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:457 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:474 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60 msgid "Set the series this ebook belongs to." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:461 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:478 #: /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/calibre/src/calibre/ebooks/conversion/plumber.py:465 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:482 #: /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/calibre/src/calibre/ebooks/conversion/plumber.py:469 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:486 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66 msgid "Set the ISBN of the book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:473 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:490 #: /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/calibre/src/calibre/ebooks/conversion/plumber.py:477 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:494 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:70 msgid "Set the book producer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:481 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:498 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:72 msgid "Set the language." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:485 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:502 msgid "Set the publication date." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:489 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:506 msgid "Set the book timestamp (used by the date column in calibre)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:589 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:606 msgid "Could not find an ebook inside the archive" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:647 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:664 msgid "Values of series index and rating must be numbers. Ignoring" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:654 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:671 msgid "Failed to parse date/time" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:826 msgid "Converting input to HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:836 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:853 msgid "Running transforms on ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:923 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:940 msgid "Creating" msgstr "" @@ -1883,7 +2111,7 @@ msgid "Path to output file" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:114 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:128 msgid "Verbose processing" msgstr "" @@ -1965,89 +2193,6 @@ msgstr "" msgid "Comic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 -msgid "Title" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:888 -msgid "Author(s)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 -msgid "Publisher" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 -msgid "Producer" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:405 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:35 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 -#: /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:318 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1079 -msgid "Comments" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:413 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:306 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1075 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:143 -msgid "Tags" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:415 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1084 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:91 -msgid "Series" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 -msgid "Language" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1067 -msgid "Timestamp" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:420 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -msgid "Published" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:422 -msgid "Rights" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazon.py:85 msgid "EDITORIAL REVIEW" msgstr "" @@ -2058,6 +2203,108 @@ msgid "" "autodetect if they are actually cbz/cbr files." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:112 +msgid "TEMPLATE ERROR" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 +msgid "No" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 +msgid "Yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:553 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:289 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:589 +msgid "Title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:919 +msgid "Author(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 +msgid "Publisher" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:556 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 +msgid "Producer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 +msgid "Comments" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:559 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1122 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:146 +msgid "Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:561 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:94 +msgid "Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:562 +msgid "Language" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1114 +msgid "Timestamp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:566 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:244 +msgid "Published" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:568 +msgid "Rights" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:20 msgid "options" msgstr "" @@ -2151,40 +2398,48 @@ msgstr "" msgid "No cover found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:27 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:28 msgid "Cover download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:79 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:80 msgid "Download covers from openlibrary.org" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:107 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:108 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:137 msgid "ISBN: %s not found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:117 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:118 msgid "Download covers from librarything.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:128 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:69 msgid "LibraryThing.com timed out. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:135 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:75 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 msgid "" "Could not fetch cover as server is experiencing high load. Please try again " "later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:139 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:79 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:140 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:80 msgid "LibraryThing.com server error. Try again later." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:226 +msgid "Download covers from Douban.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:235 +msgid "Douban.com API timed out. Try again later." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 msgid "Downloads metadata from Douban.com" msgstr "" @@ -2231,7 +2486,7 @@ msgstr "" msgid "Downloads series/tags/rating information from librarything.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 msgid "" "\n" "%prog [options] key\n" @@ -2245,27 +2500,27 @@ msgid "" "\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 msgid "The ISBN ID of the book you want metadata for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 msgid "The author whose book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 msgid "The title of the book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 msgid "The publisher of the book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:77 msgid " not found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:86 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:87 msgid "" "\n" "%prog [options] ISBN\n" @@ -2274,8 +2529,8 @@ msgid "" "LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1303 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1397 msgid "Cover" msgstr "" @@ -2314,70 +2569,70 @@ msgstr "" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1398 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Main Text" msgstr "" @@ -2385,12 +2640,18 @@ msgstr "" msgid "%s format books are not supported" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:156 +msgid "Book %s of %s" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:54 msgid "HTML TOC generation options." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:113 -msgid "Book Jacket" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 +msgid "Rating" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/split.py:34 @@ -2454,8 +2715,8 @@ msgstr "" #: /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." +"Valid values are a decimal between 0 and 1. The default is 0.45, just below " +"the median line length." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:30 @@ -2559,7 +2820,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:46 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:34 msgid "Author" msgstr "" @@ -2736,130 +2997,130 @@ msgid "" "allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 msgid "Confirm before deleting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Notify when a new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Sort tags list by name, popularity, or rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Number of covers to show in the cover browsing mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 msgid "Defaults for conversion to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:83 msgid "Options for the LRF ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 msgid "Formats that are viewed using the internal viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 msgid "Show system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 msgid "Upload downloaded news to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 msgid "Delete books from library after uploading to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 msgid "" "Show the cover flow in a separate window instead of in the main calibre " "window" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:101 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 msgid "Overwrite author and title with new metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 msgid "tag browser categories not to display" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 msgid "The layout of the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Show the average rating per item indication in the tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:487 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466 msgid "Choose Files" msgstr "" @@ -2875,127 +3136,128 @@ msgstr "" msgid "A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 msgid "" "Add books from directories, including sub-directories (One book per " "directory, assumes every ebook file is the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:39 msgid "" "Add books from directories, including sub directories (Multiple books per " "directory, assumes every ebook file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:43 msgid "Add Empty book. (Book entry with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:45 msgid "Add from ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:85 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:142 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:143 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:201 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:159 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:170 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:239 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:254 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 msgid "No book files found" msgstr "" @@ -3008,136 +3270,201 @@ msgid "Add books to your calibre library from the connected device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Fetch annotations (experimental)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:55 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:235 -msgid "Use library only" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:236 +msgid "Use library only" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:237 msgid "User annotations generated from main library only" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63 -#: /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:99 -#: /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/save_to_disk.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:65 msgid "No books selected to fetch annotations from" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:90 msgid "Merging user annotations into database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:118 msgid "%s
    Last Page Read: %d (%d%%)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:124 msgid "%s
    Last Page Read: Location %d (%d%%)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:143 msgid "Location %d • %s
    %s
    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:152 msgid "Page %d • %s
    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:157 msgid "Location %d • %s
    " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:34 msgid "Create catalog of books in your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 msgid "No books selected to generate catalog for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:53 msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:230 msgid "No books found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:59 msgid "" "No books to catalog\n" "Check exclude tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 msgid "Catalog generated." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:72 msgid "Export Catalog Directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:73 msgid "Select destination for %s.%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:82 msgid "Choose calibre library to work with" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:83 -msgid "Switch to library..." +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:91 +msgid "Switch/create library..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:99 msgid "Quick switch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:101 +msgid "Rename library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:103 +msgid "Delete library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:120 +msgid "Library backup status..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:176 +msgid "Rename" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:177 +msgid "Choose a new name for the library %s. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:178 +msgid "Note that the actual library folder will be renamed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 +msgid "Already exists" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:186 +msgid "The folder %s already exists. Delete it first." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:192 +msgid "Rename failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:193 +msgid "" +"Failed to rename the library at %s. The most common cause for this is if one " +"of the files in the library is open in another program." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102 +msgid "Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:204 +msgid "All files from %s will be permanently deleted. Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:223 +msgid "none" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:224 +msgid "Backup status" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:225 +msgid "Book metadata files remaining to be written: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:234 msgid "No library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:235 msgid "" "No existing calibre library was found at %s. It will be removed from the " "list of known libraries." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:685 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:268 msgid "You cannot change libraries when a device is connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:273 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -3149,58 +3476,59 @@ msgstr "" msgid "Convert books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:28 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:30 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:115 msgid "Starting conversion of %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:79 msgid "Copy to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:80 msgid "Copy selected books to the specified library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:115 msgid "Cannot copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120 msgid "No library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 msgid "No library found at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:128 msgid "Copying" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:141 msgid "Copied %d books to %s" msgstr "" @@ -3212,82 +3540,82 @@ msgstr "" msgid "Remove books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:24 msgid "Remove selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:26 msgid "Remove files of a specific format from selected books.." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:29 msgid "Remove all formats from selected books, except..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:32 msgid "Remove covers from selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:35 msgid "Remove matching books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:53 msgid "Cannot delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:66 msgid "Choose formats to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:84 msgid "Choose formats not to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104 msgid "Cannot delete books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:105 msgid "No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 msgid "Main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:436 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:438 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 msgid "No books to delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:123 msgid "None of the selected books are on the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:195 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:161 msgid "" "The selected books will be permanently deleted and the files removed " -"from your computer. Are you sure?" +"from your calibre library. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:180 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -3344,11 +3672,11 @@ msgstr "" msgid "Manage the collections on this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:23 msgid "E" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:23 msgid "Edit metadata" msgstr "" @@ -3392,80 +3720,62 @@ 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:94 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:96 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:96 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:217 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:97 msgid "Downloading %s for %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:124 -msgid "Failed to download some metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:125 -msgid "Failed to download metadata for the following:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:128 -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/device.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:569 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1001 -#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 -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:121 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:159 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:188 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:191 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:192 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:196 msgid "" -"All book formats and metadata from the selected books will be added to the " -"first selected book.

    The second and subsequently selected " -"books will not be deleted or changed.

    Please confirm you want to " -"proceed." +"Book formats and metadata from the selected books will be added to the " +"first selected book. ISBN will not be merged.

    The " +"second and subsequently selected books will not be deleted or " +"changed.

    Please confirm you want to proceed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +msgid "" +"Book formats and metadata from the selected books will be merged into the " +"first selected book. ISBN will not be merged.

    After " +"merger the second and subsequently selected books will be deleted. " +"

    All book formats of the first selected book will be kept and any " +"duplicate formats in the second and subsequently selected books will be " +"permanently deleted from your computer.

    Are you sure " +"you want to proceed?" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 msgid "" -"All book formats and metadata from the selected books will be merged into " -"the first selected book.

    After merger the second and " -"subsequently selected books will be deleted.

    All book formats " -"of the first selected book will be kept and any duplicate formats in the " -"second and subsequently selected books will be permanently deleted " -"from your computer.

    Are you sure you want to proceed?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:233 -msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" msgstr "" @@ -3532,6 +3842,7 @@ msgid "&Restart" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/restart.py:14 +#: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:59 msgid "Ctrl+R" msgstr "" @@ -3544,53 +3855,53 @@ msgid "S" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:40 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:46 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:48 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:69 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:72 msgid "Save only %s format to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:94 msgid "Choose destination directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:102 msgid "" "You are trying to save files into the calibre library. This can cause " "corruption of your library. Save to disk is meant to export files from your " "calibre library elsewhere." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:136 msgid "Error while saving" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:137 msgid "There was an error while saving." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:143 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:145 msgid "Could not save some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:146 msgid "Click the show details button to see which ones." msgstr "" @@ -3602,11 +3913,11 @@ msgstr "" msgid "I" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:27 msgid "No detailed information is available for books on the device." msgstr "" @@ -3614,66 +3925,88 @@ msgstr "" msgid "Similar books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 msgid "Alt+A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 msgid "Books by same author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 -msgid "Alt+S" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 msgid "Books in this series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +msgid "Alt+Shift+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Alt+P" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:27 msgid "Books by this publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:28 msgid "Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:28 msgid "Books with the same tags" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54 +msgid "Tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 +msgid "Make small changes to ePub format books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 +msgid "T" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 +msgid "Cannot tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 +msgid "No ePub available. First convert the book to ePub." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:33 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 msgid "Multiple Books Selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:110 msgid "" "You are attempting to open %d books. Opening too many books at once can be " "slow and have a negative effect on the responsiveness of your computer. Once " @@ -3681,11 +4014,11 @@ msgid "" "continue?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "Cannot open folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:157 msgid "%s has no available formats." msgstr "" @@ -3693,60 +4026,60 @@ msgstr "" msgid "Searching in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:198 msgid "Adding..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:211 msgid "Searching in all sub-directories..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:224 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:225 msgid "The specified directory could not be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:845 msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:294 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:307 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:308 msgid "" "The add books process seems to have hung. Try restarting calibre and adding " "the books in smaller increments, until you find the problem book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:323 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:324 msgid "" "Books with the same title as the following already exist in the database. " "Add them anyway?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:327 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:390 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:443 msgid "Saved" msgstr "" @@ -3763,7 +4096,7 @@ 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 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:70 msgid "Choose root folder" msgstr "" @@ -3780,7 +4113,7 @@ 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/add_wizard/welcome_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:49 @@ -3796,15 +4129,15 @@ msgstr "" msgid "This may take a few minutes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 msgid "Choose the location to add books from" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 msgid "Select a folder on your hard disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65 msgid "" "

    calibre can scan your computer for existing books automatically. These " "books will then be copied into the calibre library. This wizard will " @@ -3816,138 +4149,136 @@ msgid "" "not under the root folder you choose.

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 msgid "&Root folder:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:69 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:53 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:620 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:693 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:103 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:77 +#: /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:383 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 -#: /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/metadata_single_ui.py:397 +#: /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/metadata_single_ui.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:267 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:269 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:270 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:143 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:144 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:191 msgid "..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:72 msgid "Handle multiple files per book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:73 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 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:74 msgid "" "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:54 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:313 #: /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/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1065 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 msgid "Path" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 #: /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:229 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:326 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:103 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:891 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1068 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1115 msgid "Collections" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 msgid "Click to open" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:311 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:317 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1074 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1078 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1125 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:293 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:312 msgid "Click to open Book Details window" msgstr "" @@ -3990,16 +4321,16 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:81 #: /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_epub_mobi_ui.py:76 #: /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/debug_ui.py:54 #: /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:31 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:122 #: /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/metadata_ui.py:171 #: /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 @@ -4007,20 +4338,31 @@ msgstr "" #: /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:60 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46 #: /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:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:55 #: /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:77 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:41 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 #: /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/preferences/behavior_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/conversion_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 msgid "Form" msgstr "" @@ -4101,30 +4443,23 @@ msgstr "" msgid "E-book options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:550 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1607 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1625 -msgid "Catalog" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77 msgid "'Don't include this book' tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78 msgid "'Mark this book as read' tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:79 msgid "Additional note tag prefix:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:80 msgid "Regex pattern describing tags to exclude as genres:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:81 msgid "" "Regex tips:\n" "- The default regex - \\[.+\\] - excludes genre tags of the form [tag], " @@ -4133,18 +4468,22 @@ msgid "" "Genre Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:84 msgid "Include 'Titles' Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 msgid "Include 'Recently Added' Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Sort numbers as text" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 +msgid "Include 'Series' Section" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28 msgid "Tab template for catalog.ui" msgstr "" @@ -4156,11 +4495,11 @@ msgid "" "specified in the Preferences" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 msgid "Bulk Convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "" @@ -4178,52 +4517,52 @@ msgid "input" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99 msgid "&Number of Colors:" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101 msgid "Disable &normalize" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102 msgid "Keep &aspect ratio" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103 msgid "Disable &Sharpening" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:109 msgid "Disable &Trimming" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:108 msgid "&Wide" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104 msgid "&Landscape" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:106 msgid "&Right to left" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:105 msgid "Don't so&rt" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:107 msgid "De&speckle" msgstr "" @@ -4232,7 +4571,7 @@ msgid "&Disable comic processing" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:120 msgid "&Output format:" msgstr "" @@ -4249,7 +4588,7 @@ msgid "Debug the conversion process." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:56 msgid "Choose debug folder" msgstr "" @@ -4261,7 +4600,7 @@ msgstr "" msgid "Failed to create debug directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:55 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 " @@ -4269,7 +4608,7 @@ msgid "" "conversion parameters like Table of Contents and Chapter Detection." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:59 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 " @@ -4327,11 +4666,11 @@ msgstr "" msgid "Sectionize Chapters (Use with care!)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104 msgid "Font rescaling wizard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:105 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 " @@ -4347,25 +4686,25 @@ msgid "" "for a discussion of how font size rescaling works.

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 msgid "&Output document" msgstr "" -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 msgid "&Base font size:" msgstr "" -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 msgid "Font size &key:" msgstr "" -#: /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/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 #: /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 @@ -4376,23 +4715,23 @@ msgstr "" msgid " pt" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:112 msgid "Use &default values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 msgid "&Input document" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:116 msgid "&Font size: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:118 msgid " will map to size: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:119 msgid "0.0 pt" msgstr "" @@ -4416,69 +4755,73 @@ msgstr "" msgid "Justify text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:123 msgid "&Disable font size rescaling" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 msgid "Base &font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 msgid "Wizard to help you choose an appropriate font size key" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 msgid "Line &height:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 msgid "Input character &encoding:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 msgid "Remove &spacing between paragraphs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 msgid "Indent size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 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/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 msgid " em" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 msgid "Text justification:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 msgid "&Linearize tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 msgid "Extra &CSS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:139 msgid "&Transliterate unicode characters to ASCII" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:140 msgid "Insert &blank line" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:141 msgid "Keep &ligatures" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:142 +msgid "Smarten &punctuation" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19 msgid "LRF Output" msgstr "" @@ -4531,129 +4874,129 @@ msgstr "" msgid "&Monospaced font family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:44 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:46 msgid "" "Set the metadata. The output file will contain as much of this metadata as " "possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 msgid "Choose cover for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 msgid "

    There was an error reading from file:
    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 msgid " is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:414 msgid "Book Cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 msgid "Use cover from &source file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "Change &cover image:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 msgid "Browse for an image to use as the cover of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:373 msgid "&Title: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 msgid "Change the title of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /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:365 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "&Author(s): " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 msgid "Author So&rt:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 msgid "" "Change the author(s) of this book. Multiple authors should be separated by a " "comma" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:177 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "&Publisher: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 msgid "Ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:326 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

    They can be any words or phrases, separated by commas." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 msgid "&Series:" msgstr "" -#: /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:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:380 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 msgid "List of known series. You can add new series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400 msgid "Book " msgstr "" @@ -4661,7 +5004,7 @@ msgstr "" msgid "MOBI Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:43 msgid "Default" msgstr "" @@ -4812,7 +5155,7 @@ msgid "Regex:" msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122 msgid "Test" msgstr "" @@ -4824,18 +5167,18 @@ msgstr "" msgid "Options specific to the input format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:112 -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:53 msgid "Dialog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:118 msgid "&Input format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:119 msgid "Use &saved conversion settings for individual books" msgstr "" @@ -4850,66 +5193,70 @@ msgid "" "Fine tune the detection of chapter headings and other document structure." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:37 msgid "Detect chapters at (XPath expression):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:38 msgid "Insert page breaks before (XPath expression):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:40 msgid "Header regular expression:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:43 msgid "Footer regular expression:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87 msgid "Invalid regular expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:88 msgid "Invalid regular expression: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:39 msgid "Invalid XPath" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:40 msgid "The XPath expression %s is invalid." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:81 msgid "Chapter &mark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:82 msgid "Remove first &image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:83 msgid "Insert &metadata as page at start of book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:64 -msgid "&Preprocess input file to possibly improve structure detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:84 msgid "Remove F&ooter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:85 msgid "Remove H&eader" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:86 +msgid "Line &un-wrap factor during preprocess:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:87 +msgid "&Preprocess input file to possibly improve structure detection" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:16 msgid "" "Table of\n" @@ -4991,18 +5338,18 @@ msgstr "" msgid "Force maximum line length" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:51 -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:55 msgid "TextLabel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:57 msgid "Use a wizard to help construct the XPath expression" msgstr "" @@ -5094,26 +5441,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:270 -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:243 msgid "Undefined" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /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:59 -#: /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:122 msgid "star(s)" msgstr "" @@ -5130,270 +5465,299 @@ msgstr "" msgid " index:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:451 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:188 -msgid "Automatically number books in this series" +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:460 +msgid "Remove series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:463 +msgid "Automatically number books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 +msgid "Force numbers to start with " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:529 msgid "Remove all tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:550 msgid "tags to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:555 msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:50 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:136 msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:167 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:285 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:296 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:306 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:321 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:326 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:425 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:434 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:485 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 msgid "Send specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:522 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:639 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:132 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 +msgid "Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:640 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:661 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:708 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:709 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:752 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:754 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:846 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:851 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:826 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:860 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:861 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:864 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:868 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:910 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:913 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:914 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1215 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1059 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1248 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:959 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:967 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 msgid "Failed to email books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 msgid "Failed to email the following books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:956 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1018 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1019 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1030 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1027 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1208 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1122 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1241 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1057 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1216 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 msgid "" "Could not upload the following books to the device, as no suitable formats " "were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1278 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1313 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1314 msgid "" "

    Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 -msgid "Select available formats and their order for this device" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 +msgid "Invalid template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 -msgid "Use sub directories" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 +msgid "The template %s is invalid:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:83 +msgid "Select available formats and their order for this device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:87 +msgid "Use sub directories" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:88 msgid "Use author sort for author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:90 msgid "Save &template:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:48 msgid "Add books by ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:49 msgid "" "

    Enter a list of ISBNs in the box to the left, one per line. calibre will " "automatically create entries for books based on the ISBN and download " @@ -5401,19 +5765,19 @@ msgid "" "ignored." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 msgid "&Paste from clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 msgid "Fit &cover within view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 msgid "&Previous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 msgid "&Next" msgstr "" @@ -5422,7 +5786,7 @@ msgid "My Books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:304 msgid "Generate catalog" msgstr "" @@ -5447,7 +5811,41 @@ msgstr "" msgid "Catalog options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:21 +msgid "Check Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:29 +msgid "Run the check" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:205 +msgid "Copy to clipboard" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:48 +msgid "Names to ignore:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:54 +msgid "Extensions to ignore" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 +msgid "Additional Information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 +msgid "Path from library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 +msgid "Name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:45 msgid "Choose Format" msgstr "" @@ -5488,6 +5886,7 @@ msgid "No location selected" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:628 msgid "Bad location" msgstr "" @@ -5495,27 +5894,27 @@ msgstr "" msgid "%s is not an existing folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 msgid "Choose your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 msgid "Your calibre library is currently located at {0}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:73 msgid "New &Location:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:74 msgid "Use &existing library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:75 msgid "&Create an empty library at the new location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:76 msgid "&Move current library to new location" msgstr "" @@ -5527,15 +5926,15 @@ msgstr "" msgid "Set options for converting %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 msgid "&Title:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:98 msgid "&Author(s):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:100 msgid "&Profile:" msgstr "" @@ -5543,1092 +5942,11 @@ msgstr "" msgid "Edit Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:173 -msgid "%(plugin_type)s %(plugins)s" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:174 -msgid "plugins" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:183 -msgid "" -"\n" -"Customization: " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:198 -msgid "General" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 -msgid "Conversion" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:201 -msgid "" -"Email\n" -"Delivery" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:202 -msgid "Add/Save" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:203 -msgid "Advanced" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:204 -msgid "" -"Content\n" -"Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:205 -msgid "Plugins" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 -msgid "Auto send" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:229 -msgid "Email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:234 -msgid "Formats to email. The first matching format will be sent." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:235 -msgid "" -"If checked, downloaded news will be automatically mailed
    to this email " -"address (provided it is in one of the listed formats)." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:309 -msgid "new email address" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 -msgid "Wide" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 -msgid "Narrow" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 -msgid "Medium" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 -msgid "Small" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 -msgid "Large" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 -msgid "Always" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 -msgid "Automatic" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 -msgid "Never" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:529 -msgid "Toolbars/Context menus" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:543 -msgid "Done" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:544 -msgid "Confirmation dialogs have all been reset" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:549 -msgid "System port selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:550 -msgid "" -"The value %d you have chosen for the content server port is a system " -"port. Your operating system may not allow the server to run on this " -"port. To be safe choose a port number larger than 1024." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 -msgid "Failed to install command line tools." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:573 -msgid "Command line tools installed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:574 -msgid "Command line tools installed in" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:575 -msgid "" -"If you move calibre.app, you have to re-install the command line tools." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:626 -msgid "No valid plugin path" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 -msgid "%s is not a valid plugin path" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:630 -msgid "Choose plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:642 -msgid "Plugin cannot be disabled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:643 -msgid "The plugin: %s cannot be disabled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:652 -msgid "Plugin not customizable" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 -msgid "Plugin: %s does not need customization" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:661 -msgid "Customize" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:699 -msgid "Cannot remove builtin plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:700 -msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:715 -msgid "Invalid tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:716 -msgid "" -"The tweaks you entered are invalid, try resetting the tweaks to default and " -"changing them one by one until you find the invalid setting." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:746 -msgid "You must select a column to delete it" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:751 -msgid "The selected column is not a custom column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:752 -#: /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:753 -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:820 -msgid "Error log:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:827 -msgid "Access log:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:855 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 -msgid "Failed to start content server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:880 -msgid "Invalid size" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:881 -msgid "The size %s is invalid. must be of the form widthxheight" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:947 -msgid "Must restart" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:948 -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:982 -msgid "Checking database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1002 -msgid "Failed to check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1007 -msgid "Some inconsistencies found" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1008 -msgid "" -"The following books had formats listed in the database that are not actually " -"available. The entries for the formats have been removed. You should check " -"them manually. This can happen if you manipulate the files in the library " -"folder directly." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:133 -msgid "TabWidget" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:134 -msgid "" -"Here you can control how calibre will read metadata from the files you add " -"to it. calibre can either read metadata from the contents of the file, or " -"from the filename." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:135 -msgid "Read metadata only from &file name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:136 -msgid "" -"Swap the firstname and lastname of the author. This affects only metadata " -"read from file names." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:137 -msgid "&Swap author firstname and lastname" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:138 -msgid "" -"If an existing book with a similar title and author is found that does not " -"have the format being added, the format is added\n" -"to the existing book, instead of creating a new entry. If the existing book " -"already has the format, then it is silently ignored.\n" -"\n" -"Title match ignores leading indefinite articles (\"the\", \"a\", \"an\"), " -"punctuation, case, etc. Author match is exact." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:142 -msgid "" -"If books with similar titles and authors found, &merge the new files " -"automatically" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:143 -msgid "&Configure metadata from file name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:144 -msgid "&Adding books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:145 -msgid "" -"Here you can control how calibre will save your books when you click the " -"Save to Disk button:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:146 -msgid "Save &cover separately" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:147 -msgid "Update &metadata in saved copies" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:148 -msgid "Save metadata in &OPF file" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:149 -msgid "Convert non-English characters to &English equivalents" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:150 -msgid "Format &dates as:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:151 -msgid "File &formats to save:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:152 -msgid "Replace space with &underscores" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:153 -msgid "Change paths to &lowercase" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:154 -msgid "&Saving books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:155 -msgid "Metadata &management:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:156 -msgid "Manual management" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:157 -msgid "Only on send" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:158 -msgid "Automatic management" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:159 -msgid "" -"

  • Manual Management: Calibre updates the metadata and adds " -"collections only when a book is sent. With this option, calibre will never " -"remove a collection.
  • \n" -"
  • Only on send: Calibre updates metadata and adds/removes " -"collections for a book only when it is sent to the device.
  • \n" -"
  • Automatic management: Calibre automatically keeps metadata on the " -"device in sync with the calibre library, on every connect
  • " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:162 -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/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:163 -msgid "Sending to &device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:606 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:128 -msgid "Show notification when &new version is available" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:127 -msgid "Download &social metadata (tags/ratings/etc.) by default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:126 -msgid "&Overwrite author and title by default when fetching metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:131 -msgid "Default network &timeout:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:132 -msgid "" -"Set the default timeout for network fetches (i.e. anytime we go out to the " -"internet to get information)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:133 -msgid " seconds" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:100 -msgid "Choose &language (requires restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:134 -msgid "Normal" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:135 -msgid "High" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 -msgid "Low" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:137 -msgid "Job &priority:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:138 -msgid "Preferred &output format:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 -msgid "Reset all disabled &confirmation dialogs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:142 -msgid "Preferred &input format order:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:98 -msgid "User Interface &layout (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:623 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:99 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 -msgid "Restriction to apply when the current library is opened:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 -msgid "" -"Apply this restriction on calibre startup if the current library is being " -"used. Also applied when switching to this library. Note that this setting is " -"per library. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:102 -msgid "Disable all animations. Useful if you have a slow/old computer." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:103 -msgid "Disable &animations" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 -msgid "&Toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 -msgid "&Icon size:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 -msgid "Show &text under icons:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 -msgid "&Delete news from library when it is automatically sent to reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 -msgid "Select visible &columns in library view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:79 -msgid "Remove a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 -msgid "Add a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 -msgid "Edit settings of a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:145 -msgid "Use internal &viewer for:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 -msgid "Search as you type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 -msgid "Use &Roman numerals for series" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:104 -msgid "Enable system &tray icon (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:101 -msgid "Show &average ratings in the tags browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:129 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 -msgid "Show &splash screen at startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:648 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 -msgid "Show cover &browser in a separate window (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:649 -msgid "Show ¬ifications in system tray" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:650 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 -msgid "&Miscellaneous" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:651 -msgid "Add an email address to which to send books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:652 -msgid "&Add email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 -msgid "Make &default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 -msgid "&Remove email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 -msgid "" -"calibre can send your books to you (or your reader) by email. Emails will be " -"automatically sent for downloaded news to all email addresses that have Auto-" -"send checked." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 -msgid "&Maximum number of waiting worker processes (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 -msgid "Limit the max. simultaneous jobs to the available CPU &cores" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 -msgid "Debug &device detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 -msgid "&Check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:660 -msgid "Open calibre &configuration directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:661 -msgid "&Install command line tools" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:663 -msgid "" -"Values for the tweaks are shown below. Edit them to change the behavior of " -"calibre" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:664 -msgid "All available tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:665 -msgid "&Current tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:666 -msgid "&Restore to defaults" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:667 -msgid "&Tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 -msgid "" -"calibre contains a network server that allows you to access your book " -"collection using a browser from anywhere in the world. Any changes to the " -"settings will only take effect after a server restart." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 -msgid "Server &port:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 -msgid "&Username:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 -msgid "&Password:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 -msgid "" -"If you leave the password blank, anyone will be able to access your book " -"collection using the web interface." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 -msgid "" -"The maximum size (widthxheight) for displayed covers. Larger covers are " -"resized. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 -msgid "Max. &cover size:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 -msgid "&Show password" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 -msgid "Max. &OPDS items per query:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 -msgid "Max. OPDS &ungrouped items:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 -msgid "Restriction (saved search) to apply:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 -msgid "" -"This restriction (based on a saved search) will restrict the books the " -"content server makes available to those matching the search. This setting is " -"per library (i.e. you can have a different restriction per library)." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 -msgid "&Start Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 -msgid "St&op Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 -msgid "&Test Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:683 -msgid "Run server &automatically on startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 -msgid "View &server logs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 -msgid "" -"

    Remember to leave calibre running as the server only runs as long as " -"calibre is running.\n" -"

    Stanza should see your calibre collection automatically. If not, try " -"adding the URL http://myhostname:8080 as a new catalog in the Stanza reader " -"on your iPhone. Here myhostname should be the fully qualified hostname or " -"the IP address of the computer calibre is running on." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 -msgid "" -"Here you can customize the behavior of Calibre by controlling what plugins " -"it uses." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 -msgid "Enable/&Disable plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 -msgid "&Customize plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 -msgid "&Remove plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 -msgid "Add new plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:692 -msgid "Plugin &file:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:694 -msgid "&Add" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:125 -msgid "Create Tag-based Column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:126 -msgid "Lookup name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:127 -msgid "Column heading" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:128 -msgid "Column type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:129 -msgid "Use brackets" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:130 -msgid "Values can be edited" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:135 -msgid "Text" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:136 -msgid "Number" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568 -msgid "Date" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:138 -msgid "Tag on book" -msgstr "" - -#: /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/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:140 -msgid "Create and edit tag-based columns" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:19 -msgid "Text, column shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:22 -msgid "Comma separated text, like tags, shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:25 -msgid "Long text, like comments, not shown in the tag browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:28 -msgid "Text column for keeping series-like information" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:33 -msgid "Floating point numbers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:35 -msgid "Integers" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:37 -msgid "Ratings, shown with stars" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:40 -msgid "Yes/No" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:69 -msgid "No column selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:70 -msgid "No column has been selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:74 -msgid "Selected column is not a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:105 -msgid "No lookup name was provided" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:107 -msgid "" -"The lookup name must contain only lower case letters, digits and " -"underscores, and start with a letter" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:116 -msgid "No column heading was provided" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:122 -msgid "The lookup name %s is already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:132 -msgid "The heading %s is already used" -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/calibre/src/calibre/gui2/dialogs/config/device_debug.py:22 -msgid "Copy to &clipboard" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:24 -msgid "Debug device detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:44 -msgid "Invalid template" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template.py:45 -msgid "The template %s is invalid:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:42 -msgid "Save &template" -msgstr "" - -#: /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 " -"indicate sub-folders. Available metadata variables are described below. If a " -"particular book does not have some metadata, the variable will be replaced " -"by the empty string." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:44 -msgid "Available variables:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/social.py:34 -msgid "Downloading social metadata, please wait..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:35 -msgid "Switch between library and device views" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:38 -msgid "Separator" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:51 -msgid "Choose library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:201 -msgid "The main toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:202 -msgid "The main toolbar when a device is connected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:203 -msgid "The context menu for the books in the calibre library" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:205 -msgid "The context menu for the books on the device" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:243 -msgid "Cannot add" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:244 -msgid "Cannot add the actions %s to this location" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:261 -msgid "Cannot remove" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:262 -msgid "Cannot remove the actions %s from this location" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97 -msgid "Customize the actions in:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98 -msgid "A&vailable actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99 -msgid "&Current actions" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100 -msgid "Move selected action up" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102 -msgid "Move selected action down" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 -msgid "Ctrl+S" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:105 -msgid "Add selected actions to toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:107 -msgid "Remove selected actions from toolbar" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:109 -msgid "Restore to &default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:55 msgid "&Show this warning again" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:47 msgid "ERROR" msgstr "" @@ -6643,7 +5961,16 @@ msgid "Location" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1064 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:920 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:280 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:588 +msgid "Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1111 msgid "Format" msgstr "" @@ -6651,10 +5978,20 @@ msgstr "" msgid "Delete from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:34 msgid "Author sort" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:511 +msgid "Invalid author name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 +msgid "Author names cannot contain & characters." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:66 msgid "Manage authors" msgstr "" @@ -6715,11 +6052,11 @@ msgid "" "No metadata found, try adjusting the title and author or the ISBN key." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 msgid "Fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 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 " @@ -6727,588 +6064,888 @@ msgid "" "below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 msgid "&Access Key:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:93 msgid "Fetch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:94 msgid "Matches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:95 msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:96 msgid "Download &social metadata (tags/rating/etc.) for the selected book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:97 msgid "Overwrite author and title with author and title of selected book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:42 msgid "Details of job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:49 msgid "Active Jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:50 msgid "&Stop selected job" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:51 msgid "Show job &details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:52 msgid "Stop &all non device jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:25 +msgid "Title/Author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:26 +msgid "Standard metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:27 +msgid "Custom metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:28 +msgid "Search/Replace" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:76 +msgid "Working" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +msgid "Lower Case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:384 +msgid "Upper Case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:387 +msgid "Title Case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:185 +msgid "Character match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 +msgid "Regular Expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 +msgid "Replace field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 +msgid "Prepend to field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:191 +msgid "Append to field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:202 msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:225 -msgid "Applying changes to %d books. This may take a while." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:255 +msgid "Book %d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:270 +msgid "" +"You can destroy your library using this feature. Changes are " +"permanent. There is no undo function. This feature is experimental, and " +"there may be bugs. You are strongly encouraged to back up your library " +"before proceeding.

    Search and replace in text fields using character " +"matching or regular expressions. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:279 +msgid "" +"In character mode, the field is searched for the entered search text. The " +"text is replaced by the specified replacement text everywhere it is found in " +"the specified field. After replacement is finished, the text can be changed " +"to upper-case, lower-case, or title-case. If the case-sensitive check box is " +"checked, the search text must match exactly. If it is unchecked, the search " +"text will match both upper- and lower-case letters" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:290 +msgid "" +"In regular expression mode, the search text is an arbitrary python-" +"compatible regular expression. The replacement text can contain " +"backreferences to parenthesized expressions in the pattern. The search is " +"not anchored, and can match and replace multiple times on the same string. " +"The modification functions (lower-case etc) are applied to the matched text, " +"not to the field as a whole. The destination box specifies the field where " +"the result after matching and replacement is to be assigned. You can replace " +"the text in the field, or prepend or append the matched text. See this reference for more " +"information on python's regular expressions, and in particular the 'sub' " +"function." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:432 +msgid "You must specify a destination when source is a composite field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:623 +msgid "Search/replace invalid" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:525 +msgid "" +"Authors cannot be set to the empty string. Book title %s not processed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:533 +msgid "Title cannot be set to the empty string. Book title %s not processed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:624 +msgid "Search pattern is invalid: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:661 +msgid "" +"Applying changes to %d books.\n" +"Phase {0} {1}%%." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:314 msgid "Edit Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:316 msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:317 msgid "Author s&ort: " msgstr "" -#: /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:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:318 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/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:165 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "&Rating:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:166 -#: /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:371 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:321 +#: /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 "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:322 msgid "No change" msgstr "" -#: /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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid " stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:325 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:173 -#: /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:377 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 msgid "Open Tag Editor" msgstr "" -#: /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:329 msgid "&Remove tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:330 msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:177 -msgid "Remove all" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:331 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:182 -msgid "Remove &format:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:332 +msgid "Remove all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 -msgid "&Swap title and author" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 +msgid "If checked, the series will be cleared" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 +msgid "Clear series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 msgid "" -"Selected books will be automatically numbered,\n" -"in the order you selected them.\n" -"So if you selected Book A and then Book B,\n" +"If not checked, the series number for the books will be set to 1.\n" +"If checked, selected books will be automatically numbered, in the order\n" +"you selected them. So if you selected Book A and then Book B,\n" "Book A will have series number 1 and Book B series number 2." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 +msgid "Automatically number books in this series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 +msgid "" +"Series will normally be renumbered from the highest number in the database\n" +"for that series. Checking this box will tell calibre to start numbering\n" +"from the value in the box" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 +msgid "Remove &format:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 +msgid "&Swap title and author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 +msgid "Change title to title case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 +msgid "" +"Force the title to be in title case. If both this and swap authors are " +"checked,\n" +"title and author are swapped before the title case is set" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 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:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:193 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:194 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:358 +msgid "Search &field:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:359 +msgid "The name of the field that you want to search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:360 +msgid "Search mode:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:361 +msgid "" +"Choose whether to use basic text matching or advanced regular expression " +"matching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:362 +msgid "&Search for:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 +msgid "" +"Enter the what you are looking for, either plain text or a regular " +"expression, depending on the mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 +msgid "" +"Check this box if the search string must match exactly upper and lower case. " +"Uncheck it if case is to be ignored" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:365 +msgid "Case sensitive" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 +msgid "&Replace with:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 +msgid "" +"The replacement text. The matched search text will be replaced with this " +"string" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 +msgid "Apply function after replace:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 +msgid "" +"Specify how the text is to be processed after matching and replacement. In " +"character mode, the entire\n" +"field is processed. In regular expression mode, only the matched text is " +"processed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:371 +msgid "&Destination field:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 +msgid "" +"The field that the text will be put into after all replacements. If blank, " +"the source field is used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:373 +msgid "Mode:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:374 +msgid "Specify how the text should be copied into the destination." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:375 +msgid "" +"If the replace mode is prepend or append, then this box indicates whether a " +"comma or\n" +"nothing should be put between the original text and the inserted text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 +msgid "use comma" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 +msgid "Test &text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 +msgid "Test re&sult" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 +msgid "Your test:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 +msgid "&Search and replace (experimental)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:133 msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:150 msgid "Specify title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:151 msgid "You must specify a title and author before generating a cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:169 msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:200 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:201 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:223 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:229 msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:240 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:241 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:284 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:295 msgid "Could not read cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:290 msgid "Could not read cover from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:296 msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 +msgid "" +" The green color indicates that the current author sort matches the current " +"author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354 +msgid "" +" The red color indicates that the current author sort does not match the " +"current author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 msgid "Abort the editing of all remaining books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 msgid "Cannot use tag editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 msgid "The tags editor cannot be used if you have modified the tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:574 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:586 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:591 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:597 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:587 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:598 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:603 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661 msgid "Could not fetch cover.
    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:592 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 msgid "Could not find cover for this book. Try specifying the ISBN first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:604 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 msgid "" "For the error message from each cover source, click Show details below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:675 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:733 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:676 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:734 msgid "You must specify at least one of ISBN, Title, Authors or Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:759 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:820 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:821 msgid "Could not open %s. Is it being used by another program?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid "Swap the author and title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 msgid "" -"Automatically create the author sort entry based on the current author entry" +"Specify how the author(s) of this book should be sorted. For example Charles " +"Dickens should be sorted as Dickens, Charles.\n" +"If the box is colored green, then text matches the individual author's sort " +"strings. If it is colored red, then the authors and this text do not match." msgstr "" -#: /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:381 +msgid "" +"Automatically create the author sort entry based on the current author " +"entry.\n" +"Using this button to create author sort will change author sort from red to " +"green." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Publishe&d:" msgstr "" -#: /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:402 msgid "dd MMM yyyy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "&Date:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "&Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 msgid "&Fetch metadata from server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 msgid "Available Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 msgid "Add a new format for this book to the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409 msgid "Remove the selected formats for this book from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:411 msgid "Set the cover for the book from the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:413 msgid "Update metadata from the metadata in the selected format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:416 msgid "&Browse" msgstr "" -#: /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:417 +msgid "Remove border (if any) from cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 +msgid "T&rim" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 msgid "Reset cover to default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 -msgid "Download &cover" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:421 +msgid "Download co&ver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:422 msgid "Generate a default cover based on the title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:423 msgid "&Generate cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:61 msgid "Password needed" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 +msgid "&Username:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 +msgid "&Password:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 +msgid "&Show password" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:59 msgid "Aborting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:76 -msgid "Working" -msgstr "" - #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 msgid "Saved Search Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 msgid "Saved Search: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:90 msgid "Select a saved search to edit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 msgid "Delete this selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:93 msgid "Enter a new saved search name." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:94 msgid "Add the new saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor_ui.py:96 msgid "Change the contents of the saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:124 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:125 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:176 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:183 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:198 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:200 msgid "Last downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:220 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:227 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:232 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:332 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:333 msgid "Cannot download news as no internet connection is active" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:278 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 msgid "Download all scheduled recipes at once" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 msgid "Download &all scheduled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 msgid "blurb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 msgid "&Schedule for download:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 msgid "Every " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 msgid "day" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 msgid "Monday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 msgid "Tuesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 msgid "Wednesday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:208 msgid "Thursday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 msgid "Friday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210 msgid "Saturday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 msgid "Sunday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 msgid "at" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 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/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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:268 msgid " days" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 msgid "&Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 msgid "For the scheduling to work, you must leave calibre running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 msgid "&Schedule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:222 msgid "Add &title as tag" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 msgid "&Extra tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:224 msgid "&Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:225 msgid "&Download now" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:226 msgid "" "Delete downloaded news older than the specified number of days. Set to zero " "to disable." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:228 msgid "Delete downloaded news older than " msgstr "" @@ -7330,56 +6967,56 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 msgid "Find entries that have..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 msgid "&All these words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 msgid "This exact &phrase:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 msgid "&One or more of these words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 msgid "But dont show entries that have..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 msgid "Any of these &unwanted words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 msgid "Contains: the word or phrase matches anywhere in the metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 msgid "Equals: the word or phrase must match an entire metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 msgid "" "Regular expression: the expression must match anywhere in the metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:129 msgid " " msgstr " " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 msgid "" "See the User Manual for more help" @@ -7390,12 +7027,12 @@ msgid "Choose formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:80 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:83 msgid "Authors" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:114 msgid "Publishers" msgstr "" @@ -7408,51 +7045,51 @@ 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 msgid "User Categories Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:159 msgid "A&vailable items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 msgid "Apply tags to current tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 msgid "A&pplied items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163 msgid "Unapply (remove) tag from current tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 msgid "Category name: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:166 msgid "Select a category to edit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 msgid "Delete this selected tag category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:169 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:170 msgid "Add the new category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:172 msgid "Category filter: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:173 msgid "Select the content kind of the new category" msgstr "" @@ -7467,43 +7104,43 @@ msgid "" "to delete them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:128 msgid "Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 msgid "A&vailable tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 msgid "" "Delete tag from database. This will unapply the tag from all books and then " "remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 msgid "Apply tag to current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 msgid "A&pplied tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:135 msgid "Unapply (remove) tag from current book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:137 msgid "&Add tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:138 msgid "" "If the tag you want is not in the available list, you can add it here. " "Accepts a comma separated list of tags." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:139 msgid "Add tag to available tags and apply it to current book" msgstr "" @@ -7512,12 +7149,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:501 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:502 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -7541,37 +7178,76 @@ msgstr "" msgid "Are you certain you want to delete the following items?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:77 msgid "Category Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78 msgid "Items in use" msgstr "" -#: /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:79 msgid "" "Delete item from database. This will unapply the item from all books and " "then remove it from the database." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:81 msgid "Rename the item in every book where it is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:106 +msgid "Ctrl+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:56 msgid "Test email settings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:57 msgid "Send test mail from %s to:" msgstr "" -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:120 msgid "&Test" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:55 +msgid "Display contents of exploded ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:56 +msgid "&Explode ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:57 +msgid "Rebuild ePub from exploded contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:58 +msgid "&Rebuild ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:59 +msgid "Discard changes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +msgid "&Cancel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61 +msgid "" +"

    Explode the ePub to display contents in a file browser window. To tweak " +"individual files, right-click, then 'Open with...' your editor of choice. " +"When tweaks are complete, close the file browser window and the editor " +"windows you used to edit files in the epub.

    Rebuild the ePub, " +"updating your calibre library.

    " +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127 msgid "No recipe selected" msgstr "" @@ -7586,7 +7262,7 @@ msgstr "" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:260 msgid "Switch to Advanced mode" msgstr "" @@ -7611,10 +7287,6 @@ msgstr "" msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 -msgid "Already exists" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186 msgid "This feed has already been added to the recipe" msgstr "" @@ -7655,35 +7327,35 @@ msgstr "" msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 msgid "Add custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:249 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 msgid "Available user recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:255 msgid "Add/Update &recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 msgid "&Remove recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:257 msgid "&Share recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:258 msgid "Customize &builtin recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:259 msgid "&Load recipe from file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:261 msgid "" "