merge from main branch

This commit is contained in:
ldolse 2010-08-25 12:05:49 +10:00
commit b3455954d7
88 changed files with 41428 additions and 20198 deletions

View File

@ -0,0 +1,114 @@
@echo OFF
REM CalibreRun.bat
REM ~~~~~~~~~~~~~~
REM Batch File to start a Calibre configuration on Windows
REM giving explicit control of the location of:
REM - Calibe Program Files
REM - Calibre Library Files
REM - Calibre Config Files
REM - Calibre Metadata database
REM - Calibre Source files
REM By setting the paths correctly it can be used to run:
REM - A "portable calibre" off a USB stick.
REM - A network installation with local metadata database
REM (for performance) and books stored on a network share
REM
REM If trying to run off a USB stick then the following
REM folder structure is recommended:
REM - Calibre2 Location of program files
REM - CalibreConfig Location of Configuration files
REM - CalibreLibrary Location of Books and metadata
REM -------------------------------------
REM Set up Calibre Config folder
REM -------------------------------------
If EXIST CalibreConfig SET CALIBRE_CONFIG_DIRECTORY=%cd%\CalibreConfig
REM --------------------------------------------------------------
REM Specify Location of ebooks
REM
REM Location where Book files are located
REM Either set explicit path, or if running from a USB stick
REM a relative path can be used to avoid need to know the
REM drive letter of the USB stick.
REM Comment out any of the following that are not to be used
REM --------------------------------------------------------------
SET CALIBRE_LIBRARY_DIRECTORY=U:\eBOOKS\CalibreLibrary
IF EXIST CalibreLibrary SET CALIBRE_LIBRARY_DIRECTORY=%cd%\CalibreLibrary
IF EXIST CalibreBooks SET CALIBRE_LIBRARY_DIRECTORY=%cd%\CalibreBooks
REM --------------------------------------------------------------
REM Specify Location of metadata database (optional)
REM
REM Location where the metadata.db file is located. If not set
REM the same location as Books files will be assumed. This.
REM options is used to get better performance when the Library is
REM on a (slow) network drive. Putting the metadata.db file
REM locally gives a big performance improvement.
REM --------------------------------------------------------------
IF EXIST CalibreBooks SET SET CALIBRE_OVERRIDE_DATABASE_PATH=%cd%\CalibreBooks\metadata.db
IF EXIST CalibreMetadata SET CALIBRE_OVERRIDE_DATABASE_PATH=%cd%\CalibreMetadata\metadata.db
REM --------------------------------------------------------------
REM Specify Location of source (optional)
REM
REM It is easy to run Calibre from source
REM Just set the environment variable to where the source is located
REM When running from source the GUI will have a '*' after the version.
REM --------------------------------------------------------------
IF EXIST Calibre\src SET CALIBRE_DEVELOP_FROM=%cd%\Calibre\src
REM --------------------------------------------------------------
REM Specify Location of calibre binaries (optinal)
REM
REM To avoid needing Calibre to be set in the search path, ensure
REM that Calibre Program Files is current directory when starting.
REM The following test falls back to using search path .
REM This folder can be populated by cpying the Calibre2 folder from
REM an existing isntallation or by isntalling direct to here.
REM --------------------------------------------------------------
IF EXIST Calibre2 CD Calibre2
REM --------------------------------------------
REM Display settings that will be used
REM --------------------------------------------
echo PROGRAMS=%cd%
echo SOURCE=%CALIBRE_DEVELOP_FROM%
echo CONFIG=%CALIBRE_CONFIG_DIRECTORY%
echo LIBRARY=%CALIBRE_LIBRARY_DIRECTORY%
echo DATABASE=%CALIBRE_OVERRIDE_DATABASE_PATH%
REM The following gives a chance to check the settings before
REM starting Calibre. It can be commented out if not wanted.
echo "Press CTRL-C if you do not want to continue"
pause
REM --------------------------------------------------------
REM Start up the calibre program.
REM
REM The use of 'belownormal' priority helps keep the system
REM responsive while Calibre is running. Within Calibre itself
REM the backgound processes should be set to run with 'low' priority.
REM Using the START command starts up Calibre in a separate process.
REM If used without /WAIT opotion launches Calibre and contines batch file.
REM Use with /WAIT to wait until Calibre completes to run a task on exit
REM --------------------------------------------------------
echo "Starting up Calibre"
START /belownormal Calibre --with-library %CALIBRE_LIBRARY_DIRECTORY%

View File

@ -44,7 +44,7 @@ bool_custom_columns_are_tristate = 'yes'
# title within authors.
sort_columns_at_startup = None
# Format to be used for publication date
# Format to be used for publication date and the timestamp (date).
# A string controlling how the publication date is displayed in the GUI
# d the day as number without a leading zero (1 to 31)
# dd the day as number with a leading zero (01 to 31)
@ -59,8 +59,10 @@ sort_columns_at_startup = None
# For example, given the date of 9 Jan 2010, the following formats show
# MMM yyyy ==> Jan 2010 yyyy ==> 2010 dd MMM yyyy ==> 09 Jan 2010
# MM/yyyy ==> 01/2010 d/M/yy ==> 9/1/10 yy ==> 10
# default if not set: MMM yyyy
# publication default if not set: MMM yyyy
# timestamp default if not set: dd MMM yyyy
gui_pubdate_display_format = 'MMM yyyy'
gui_timestamp_display_format = 'dd MMM yyyy'
# Control title and series sorting in the library view.
# If set to 'library_order', Leading articles such as The and A will be ignored.

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 953 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,53 @@
__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
consumerist.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class Consumerist(BasicNewsRecipe):
title = 'Consumerist'
__author__ = 'NA'
description = "Consumerist, Shoppers Bite Back."
publisher = 'consumerist.com'
category = 'news, consumer news, consumer rights'
oldest_article = 2
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://consumerist.com/css/images/footer_man.gif'
extra_css = '''
body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
img{margin-bottom: 1em}
h1{font-family :Arial,Helvetica,sans-serif; font-size:x-large}
h2{font-family :Arial,Helvetica,sans-serif; font-size:large}
'''
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
remove_attributes = ['width','height']
#keep_only_tags = [dict(attrs={'class':['', 'category-breadcrumb']}),]
remove_tags_before = dict(name='h2')
remove_tags = [
#dict(name='iframe'),
dict(name='div', attrs={'class':['e-comments', 'more-about', 'entry-tags']}),
#dict(name='div', attrs={'id':['IEContainer', 'clickIncludeBox']}),
#dict(name='ul', attrs={'class':'article-tools'}),
#dict(name='ul', attrs={'class':'articleTools'}),
]
remove_tags_after = dict(attrs={'class':'e-body'})
feeds = [(u'Articles', u'http://consumerist.com/index.xml')]
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -0,0 +1,44 @@
__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
deadspin.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class Deadspin(BasicNewsRecipe):
title = 'Deadspin'
__author__ = 'NA'
description = "Deadspin, Sports News without Access, Favor, or Discretion."
publisher = 'deadspin.com'
category = 'news, sports, meltdowns'
oldest_article = 2
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://cache.gawkerassets.com/assets/deadspin.com/img/logo.png'
extra_css = '''
body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
img{margin-bottom: 1em}
h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
'''
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
remove_attributes = ['width','height']
keep_only_tags = [dict(attrs={'class':'content permalink'})]
remove_tags_before = dict(name='h1')
remove_tags = [dict(attrs={'class':'contactinfo'})]
remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/deadspin/full')]
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -0,0 +1,44 @@
__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
fleshbot.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class Fleshbot(BasicNewsRecipe):
title = 'Fleshbot'
__author__ = 'NA'
description = "Fleshbot, Pure Filth."
publisher = 'Fleshbot.com'
category = 'news, sex, sex industry, celebs, nudes, adult, adult toys, sex toys'
oldest_article = 2
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://cache.fleshbot.com/assets/base/img/thumbs140x140/fleshbot.com.png'
extra_css = '''
body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
img{margin-bottom: 1em}
h1{font-family :Arial,Helvetica,sans-serif; font-size:x-large}
'''
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
remove_attributes = ['width','height']
keep_only_tags = [dict(attrs={'class':'content permalink'})]
remove_tags_before = dict(name='h1')
remove_tags = [dict(attrs={'class':'contactinfo'})]
remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/fleshbot/full')]
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -0,0 +1,44 @@
__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
gawker.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class Gawker(BasicNewsRecipe):
title = 'Gawker'
__author__ = 'NA'
description = "Gawker, Gossip from Manhattan and the Beltway to Hollywood and the Valley."
publisher = 'gawker.com'
category = 'news, gossip'
oldest_article = 2
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://cache.gawkerassets.com/assets/gawker.com/img/logo.png'
extra_css = '''
body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
img{margin-bottom: 1em}
h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
'''
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
remove_attributes = ['width','height']
keep_only_tags = [dict(attrs={'class':'content permalink'})]
remove_tags_before = dict(name='h1')
remove_tags = [dict(attrs={'class':'contactinfo'})]
remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/gawker/full')]
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -0,0 +1,46 @@
__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
io9.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class i09(BasicNewsRecipe):
title = 'io9'
__author__ = 'NA'
description = "io9, We Come From the Future."
publisher = 'io9.com'
category = 'news, science, education'
oldest_article = 2
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://cache.gawkerassets.com/assets/io9.com/img/logo.png'
extra_css = '''
body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
img{margin-bottom: 1em}
h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
h2{font-family :Arial,Helvetica,sans-serif; font-size:x-small}
'''
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
remove_attributes = ['width','height']
keep_only_tags = [dict(attrs={'class':'content permalink'})]
remove_tags_before = dict(name='h1')
remove_tags = [dict(attrs={'class':'contactinfo'})]
remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/io9/full')]
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -0,0 +1,45 @@
__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
jalopnik.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class Jalopnik(BasicNewsRecipe):
title = 'Jalopnik'
__author__ = 'NA'
description = "Jalopnik, Obsessed With The Cult of Cars."
publisher = 'jalopnik.com'
category = 'news, cars, spyshots'
oldest_article = 2
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://cache.gawkerassets.com/assets/jalopnik.com/img/logo.png'
extra_css = '''
body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
img{margin-bottom: 1em}
h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
h2{font-family :Arial,Helvetica,sans-serif; font-size:x-small}
'''
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
remove_attributes = ['width','height']
keep_only_tags = [dict(attrs={'class':'content permalink'})]
remove_tags_before = dict(name='h1')
remove_tags = [dict(attrs={'class':'contactinfo'})]
remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/jalopnik/full')]
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -0,0 +1,45 @@
__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
jezebel.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class Jezebel(BasicNewsRecipe):
title = 'Jezebel'
__author__ = 'NA'
description = "Jezebel, Celebrity, Sex, Fashion for Women. Without Airbrushing."
publisher = 'jezebel.com'
category = 'news, cars, spyshots'
oldest_article = 2
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://cache.gawkerassets.com/assets/jezebel.com/img/logo.png'
extra_css = '''
body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
img{margin-bottom: 1em}
h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
h2{font-family :Arial,Helvetica,sans-serif; font-size:x-small}
'''
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
remove_attributes = ['width','height']
keep_only_tags = [dict(attrs={'class':'content permalink'})]
remove_tags_before = dict(name='h1')
remove_tags = [dict(attrs={'class':'contactinfo'})]
remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/jezebel/full')]
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -0,0 +1,44 @@
__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
kotaku.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class Kotaku(BasicNewsRecipe):
title = 'Kotaku'
__author__ = 'NA'
description = "Kotaku, the Gamer's Guide."
publisher = 'kotaku.com'
category = 'news, games, Internet, xbox 360, playstation 3, tips and tricks'
oldest_article = 2
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://cache.gawkerassets.com/assets/kotaku.com/img/logo.png'
extra_css = '''
body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
img{margin-bottom: 1em}
h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
'''
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
remove_attributes = ['width','height']
keep_only_tags = [dict(attrs={'class':'content permalink'})]
remove_tags_before = dict(name='h1')
remove_tags = [dict(attrs={'class':'contactinfo'})]
remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/kotaku/full')]
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -0,0 +1,45 @@
__license__ = 'GPL v3'
__copyright__ = '2010, NA'
'''
lifehacker.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class Lifehacker(BasicNewsRecipe):
title = 'Lifehacker'
__author__ = 'NA'
description = "Computers make us more productive. Yeah, right. Lifehacker recommends the software downloads and web sites that actually save time. Don't live to geek; geek to live."
publisher = 'lifehacker.com'
category = 'news, IT, Internet, gadgets, tips and tricks, howto, diy'
oldest_article = 2
max_articles_per_feed = 100
no_stylesheets = True
encoding = 'utf-8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://cache.gawkerassets.com/assets/lifehacker.com/img/logo.png'
extra_css = '''
body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif}
img{margin-bottom: 1em}
h1{font-family :Arial,Helvetica,sans-serif; font-size:large}
h2{font-family :Arial,Helvetica,sans-serif; font-size:x-small}
'''
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
remove_attributes = ['width','height']
keep_only_tags = [dict(attrs={'class':'content permalink'})]
remove_tags_before = dict(name='h1')
remove_tags = [dict(attrs={'class':'contactinfo'})]
remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/lifehacker/full')]
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -373,6 +373,7 @@ class Py2App(object):
CFBundleName=APPNAME,
CFBundleIdentifier='net.kovidgoyal.calibre',
CFBundleVersion=VERSION,
CFBundleShortVersionString=VERSION,
CFBundlePackageType='APPL',
CFBundleSignature='????',
CFBundleExecutable='calibre',

View File

@ -8,7 +8,7 @@ from calibre.constants import numeric_version
from calibre.ptempfile import PersistentTemporaryFile
class Plugin(object):
class Plugin(object): # {{{
'''
A calibre plugin. Useful members include:
@ -147,9 +147,9 @@ class Plugin(object):
if hasattr(it, '__exit__'):
it.__exit__(*args)
# }}}
class FileTypePlugin(Plugin):
class FileTypePlugin(Plugin): # {{{
'''
A plugin that is associated with a particular set of file types.
'''
@ -191,7 +191,9 @@ class FileTypePlugin(Plugin):
# Default implementation does nothing
return path_to_ebook
class MetadataReaderPlugin(Plugin):
# }}}
class MetadataReaderPlugin(Plugin): # {{{
'''
A plugin that implements reading metadata from a set of file types.
'''
@ -219,8 +221,9 @@ class MetadataReaderPlugin(Plugin):
:return: A :class:`calibre.ebooks.metadata.MetaInformation` object
'''
return None
# }}}
class MetadataWriterPlugin(Plugin):
class MetadataWriterPlugin(Plugin): # {{{
'''
A plugin that implements reading metadata from a set of file types.
'''
@ -249,7 +252,9 @@ class MetadataWriterPlugin(Plugin):
'''
pass
class CatalogPlugin(Plugin):
# }}}
class CatalogPlugin(Plugin): # {{{
'''
A plugin that implements a catalog generator.
'''
@ -352,7 +357,9 @@ class CatalogPlugin(Plugin):
raise NotImplementedError('CatalogPlugin.generate_catalog() default '
'method, should be overridden in subclass')
class InterfaceActionBase(Plugin):
# }}}
class InterfaceActionBase(Plugin): # {{{
supported_platforms = ['windows', 'osx', 'linux']
author = 'Kovid Goyal'
@ -360,3 +367,44 @@ class InterfaceActionBase(Plugin):
can_be_disabled = False
actual_plugin = None
# }}}
class PreferencesPlugin(Plugin): # {{{
supported_platforms = ['windows', 'osx', 'linux']
author = 'Kovid Goyal'
type = _('Preferences')
can_be_disabled = False
#: Import path to module that contains a class named ConfigWidget
#: which implements the ConfigWidgetInterface. Used by
#: :meth:`create_widget`.
config_widget = None
#: Where in the list of categories the :attr:`category` of this plugin should be.
category_order = 100
#: Where in the list of names in a category, the :attr:`gui_name` of this
#: plugin should be
name_order = 100
#: The category this plugin should be in
category = None
#: The name displayed to the user for this plugin
gui_name = None
def create_widget(self, parent=None):
'''
Create and return the actual Qt widget used for setting this group of
preferences. The widget must implement the ConfigWidgetInterface.
The default implementation uses :attr:`config_widget` to instantiate
the widget.
'''
base = __import__(self.config_widget, fromlist=[1])
widget = base.ConfigWidget(parent)
return widget
# }}}

View File

@ -7,7 +7,8 @@ from contextlib import closing
from calibre.customize import Plugin, CatalogPlugin, FileTypePlugin, \
MetadataReaderPlugin, MetadataWriterPlugin, \
InterfaceActionBase as InterfaceAction
InterfaceActionBase as InterfaceAction, \
PreferencesPlugin
from calibre.customize.conversion import InputFormatPlugin, OutputFormatPlugin
from calibre.customize.profiles import InputProfile, OutputProfile
from calibre.customize.builtins import plugins as builtin_plugins
@ -257,6 +258,17 @@ def interface_actions():
yield plugin
# }}}
# Preferences Plugins # {{{
def preferences_plugins():
customization = config['plugin_customization']
for plugin in _initialized_plugins:
if isinstance(plugin, PreferencesPlugin):
if not is_disabled(plugin):
plugin.site_customization = customization.get(plugin.name, '')
yield plugin
# }}}
# Metadata read/write {{{
_metadata_readers = {}
_metadata_writers = {}

View File

@ -20,7 +20,7 @@ class ANDROID(USBMS):
VENDOR_ID = {
# HTC
0x0bb4 : { 0x0c02 : [0x100, 0x0227], 0x0c01 : [0x100, 0x0227], 0x0ff9
: [0x0100, 0x0227, 0x0226]},
: [0x0100, 0x0227, 0x0226], 0x0c87: [0x0100, 0x0227, 0x0226]},
# Motorola
0x22b8 : { 0x41d9 : [0x216], 0x2d67 : [0x100], 0x41db : [0x216],

View File

@ -16,7 +16,7 @@ class FOLDER_DEVICE_FOR_CONFIG(USBMS):
description = _('Use an arbitrary folder as a device.')
author = 'John Schember/Charles Haley'
supported_platforms = ['windows', 'osx', 'linux']
FORMATS = ['epub', 'fb2', 'mobi', 'lrf', 'tcr', 'pmlz', 'lit', 'rtf', 'rb', 'pdf', 'oeb', 'txt', 'pdb']
FORMATS = ['epub', 'fb2', 'mobi', 'azw', 'lrf', 'tcr', 'pmlz', 'lit', 'rtf', 'rb', 'pdf', 'oeb', 'txt', 'pdb']
VENDOR_ID = 0xffff
PRODUCT_ID = 0xffff
BCD = 0xffff
@ -30,7 +30,7 @@ class FOLDER_DEVICE(USBMS):
description = _('Use an arbitrary folder as a device.')
author = 'John Schember/Charles Haley'
supported_platforms = ['windows', 'osx', 'linux']
FORMATS = ['epub', 'fb2', 'mobi', 'lrf', 'tcr', 'pmlz', 'lit', 'rtf', 'rb', 'pdf', 'oeb', 'txt', 'pdb']
FORMATS = ['epub', 'fb2', 'mobi', 'azw', 'lrf', 'tcr', 'pmlz', 'lit', 'rtf', 'rb', 'pdf', 'oeb', 'txt', 'pdb']
VENDOR_ID = 0xffff
PRODUCT_ID = 0xffff

View File

@ -354,19 +354,22 @@ class XMLCache(object):
root = self.record_roots[i]
lpath_map = self.build_lpath_map(root)
gtz_count = ltz_count = 0
use_tz_var = False
for book in booklist:
path = os.path.join(self.prefixes[i], *(book.lpath.split('/')))
record = lpath_map.get(book.lpath, None)
if record is None:
record = self.create_text_record(root, i, book.lpath)
(gtz_count, ltz_count) = self.update_text_record(record, book,
path, i, gtz_count, ltz_count)
(gtz_count, ltz_count, use_tz_var) = \
self.update_text_record(record, book, path, i,
gtz_count, ltz_count, use_tz_var)
# Ensure the collections in the XML database are recorded for
# this book
if book.device_collections is None:
book.device_collections = []
book.device_collections = playlist_map.get(book.lpath, [])
debug_print('Timezone votes: %d GMT, %d LTZ'%(gtz_count, ltz_count))
debug_print('Timezone votes: %d GMT, %d LTZ, use_tz_var='%
(gtz_count, ltz_count, use_tz_var))
self.update_playlists(i, root, booklist, collections_attributes)
# Update the device collections because update playlist could have added
# some new ones.
@ -464,21 +467,27 @@ class XMLCache(object):
root.append(ans)
return ans
def update_text_record(self, record, book, path, bl_index, gtz_count, ltz_count):
def update_text_record(self, record, book, path, bl_index,
gtz_count, ltz_count, use_tz_var):
'''
Update the Sony database from the book. This is done if the timestamp in
the db differs from the timestamp on the file.
'''
# It seems that a Sony device can sometimes know what timezone it is in,
# and apparently converts the dates to GMT when it writes them to the
# db. Unfortunately, we can't tell when it does this, so we use a
# horrible heuristic. First, set dates only for new books, trying to
# avoid upsetting the sony. Use the timezone determined through the
# voting described next. Second, voting: if a book is not new, compare
# its Sony DB date against localtime and gmtime. Count the matches. When
# we must set a date, use the one with the most matches. Use localtime
# if the case of a tie, and hope it is right.
# and apparently converts the dates to GMT when it writes them to its
# DB. We can detect that a device is timezone-aware because there is a
# 'tz' variable in the Sony DB, which we can set to "0" to tell the
# device to ignore its own timezone when comparing mtime to the date in
# the DB.
# Unfortunately, if there is no tz variable in the DB, then we can't
# tell when the device applies a timezone conversion. We use a horrible
# heuristic to work around this problem. First, set dates only for new
# books, trying to avoid upsetting the sony. Second, voting: if a book
# is not new, compare its Sony DB date against localtime and gmtime.
# Count the matches. When we must set a date, use the one with the most
# matches. Use localtime if the case of a tie, and hope it is right.
timestamp = os.path.getmtime(path)
rec_date = record.get('date', None)
@ -489,20 +498,25 @@ class XMLCache(object):
return x
if not getattr(book, '_new_book', False): # book is not new
if record.get('tz', None) is not None:
use_tz_var = True
if strftime(timestamp, zone=time.gmtime) == rec_date:
gtz_count += 1
elif strftime(timestamp, zone=time.localtime) == rec_date:
ltz_count += 1
else: # book is new. Set the time using the current votes
if ltz_count >= gtz_count:
if use_tz_var:
tz = time.localtime
debug_print("Using localtime TZ for new book", book.lpath)
record.set('tz', '0')
debug_print("Use localtime TZ and tz='0' for new book", book.lpath)
elif ltz_count >= gtz_count:
tz = time.localtime
debug_print("Use localtime TZ for new book", book.lpath)
else:
tz = time.gmtime
debug_print("Using GMT TZ for new book", book.lpath)
debug_print("Use GMT TZ for new book", book.lpath)
date = strftime(timestamp, zone=tz)
record.set('date', clean(date))
record.set('size', clean(str(os.stat(path).st_size)))
title = book.title if book.title else _('Unknown')
record.set('title', clean(title))
@ -532,7 +546,7 @@ class XMLCache(object):
if 'id' not in record.attrib:
num = self.max_id(record.getroottree().getroot())
record.set('id', str(num+1))
return (gtz_count, ltz_count)
return (gtz_count, ltz_count, use_tz_var)
# }}}
# Writing the XML files {{{

View File

@ -491,7 +491,7 @@ class HTMLInput(InputFormatPlugin):
return (None, raw)
def preprocess_html(self, html):
print "********* Preprocessing HTML *********\n"
self.log("********* Preprocessing HTML *********")
# Detect Chapters to match the xpath in the GUI
chapdetect = re.compile(r'(?=</?(br|p|span))(</?(br|p|span)[^>]*>)?\s*(?P<chap>(<(i|b)><(i|b)>|<(i|b)>)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(</(i|b)></(i|b)>|</(i|b)>)?)(</?(p|br|span)[^>]*>)', re.IGNORECASE)
html = chapdetect.sub('<h2>'+'\g<chap>'+'</h2>\n', html)
@ -500,7 +500,7 @@ class HTMLInput(InputFormatPlugin):
# Insert extra line feeds so the line length regex functions properly
html = re.sub(r"</p>", "</p>\n", html)
length = line_length('html', html, 0.4)
print "*** Median length is " + str(length) + " ***\n"
self.log.debug("*** Median length is " + str(length) + " ***")
unwrap = re.compile(r"(?<=.{%i}[a-z,;:\IA])\s*</(span|p|div)>\s*(</(p|span|div)>)?\s*(?P<up2threeblanks><(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*</(span|p|div)>\s*)</(span|p|div)>\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE)
if length < 150:
html = unwrap.sub(' ', html)

View File

@ -22,6 +22,7 @@ class LITInput(InputFormatPlugin):
accelerators):
from calibre.ebooks.lit.reader import LitReader
from calibre.ebooks.conversion.plumber import create_oebbook
self.log = log
return create_oebbook(log, stream, options, self, reader=LitReader)
def postprocess_book(self, oeb, opts, log):
@ -54,7 +55,7 @@ class LITInput(InputFormatPlugin):
def preprocess_html(self, html):
print "********* Preprocessing HTML *********\n"
self.log("********* Preprocessing HTML *********")
# Detect Chapters to match the xpath in the GUI
chapdetect = re.compile(r'(?=</?(br|p|span))(</?(br|p|span)[^>]*>)?\s*(?P<chap>(<(i|b)><(i|b)>|<(i|b)>)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(</(i|b)></(i|b)>|</(i|b)>)?)(</?(p|br|span)[^>]*>)', re.IGNORECASE)
html = chapdetect.sub('<h2>'+'\g<chap>'+'</h2>\n', html)
@ -63,7 +64,7 @@ class LITInput(InputFormatPlugin):
# Insert extra line feeds so the line length regex functions properly
html = re.sub(r"</p>", "</p>\n", html)
length = line_length('html', html, 0.4)
print "*** Median length is " + str(length) + " ***\n"
self.log("*** Median length is " + str(length) + " ***")
unwrap = re.compile(r"(?<=.{%i}[a-z,;:\IA])\s*</(span|p|div)>\s*(</(p|span|div)>)?\s*(?P<up2threeblanks><(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*</(span|p|div)>\s*)</(span|p|div)>\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE)
if length < 150:
html = unwrap.sub(' ', html)

View File

@ -46,8 +46,12 @@ def authors_to_sort_string(authors):
return ' & '.join(map(author_to_author_sort, authors))
_title_pat = re.compile('^(A|The|An)\s+', re.IGNORECASE)
_ignore_starts = u'\'"'+u''.join(unichr(x) for x in range(0x2018, 0x201e)+[0x2032, 0x2033])
def title_sort(title):
title = title.strip()
if title and title[0] in _ignore_starts:
title = title[1:]
match = _title_pat.search(title)
if match:
prep = match.group(1)

View File

@ -168,12 +168,18 @@ class Stylizer(object):
item.href))
continue
stylesheets.append(sitem.data)
for x in (extra_css, user_css):
csses = {'extra_css':extra_css, 'user_css':user_css}
for w, x in csses.items():
if x:
try:
text = XHTML_CSS_NAMESPACE + x
stylesheet = parser.parseString(text, href=cssname)
stylesheet.namespaces['h'] = XHTML_NS
stylesheets.append(stylesheet)
except:
self.logger.exception('Failed to parse %s, ignoring.'%w)
self.logger.debug('Bad css: ')
self.logger.debug(x)
rules = []
index = 0
self.stylesheets = set()

View File

@ -229,13 +229,13 @@ class RTFInput(InputFormatPlugin):
res = transform.tostring(result)
res = res[:100].replace('xmlns:html', 'xmlns') + res[100:]
if self.options.preprocess_html:
print "********* Preprocessing HTML *********\n"
self.log("********* Preprocessing HTML *********")
# Detect Chapters to match the xpath in the GUI
chapdetect = re.compile(r'<p[^>]*>\s*<span[^>]*>\s*(?P<chap>(<(i|b)>(<(i|b)>)?)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(</(i|b)>(<(/i|b)>)?)?)\s*</span>\s*</p>', re.IGNORECASE)
res = chapdetect.sub('<h2>'+'\g<chap>'+'</h2>\n', res)
# Unwrap lines using punctation if the median length of all lines is less than 150
length = line_length('html', res, 0.4)
print "*** Median length is " + str(length) + " ***\n"
self.log("*** Median length is " + str(length) + " ***")
unwrap = re.compile(r"(?<=.{%i}[a-z,;:\IA])\s*</span>\s*</p>\s*(?P<up2threeblanks><p[^>]*>\s*(<span[^>]*>\s*</span>\s*)</p>\s*){0,3}\s*<p[^>]*>\s*<span[^>]*>\s*" % length, re.UNICODE)
if length < 150:
res = unwrap.sub(' ', res)

View File

@ -19,8 +19,35 @@ from calibre.ebooks.metadata.meta import get_metadata, metadata_from_formats
from calibre.ebooks.metadata import MetaInformation
from calibre.utils.date import UNDEFINED_DATE
# Setup gprefs {{{
gprefs = JSONConfig('gui')
gprefs.defaults['action-layout-toolbar'] = (
'Add Books', 'Edit Metadata', None, 'Convert Books', 'View', None,
'Choose Library', 'Donate', None, 'Fetch News', 'Save To Disk',
'Connect Share', None, 'Remove Books', None, 'Help', 'Preferences',
)
gprefs.defaults['action-layout-toolbar-device'] = (
'Add Books', 'Edit Metadata', None, 'Convert Books', 'View',
'Send To Device', None, None, 'Location Manager', None, None,
'Fetch News', 'Save To Disk', 'Connect Share', None,
'Remove Books', None, 'Help', 'Preferences',
)
gprefs.defaults['action-layout-context-menu'] = (
'Edit Metadata', 'Send To Device', 'Save To Disk',
'Connect Share', 'Copy To Library', None,
'Convert Books', 'View', 'Open Folder', 'Show Book Details',
'Similar Books', None, 'Remove Books',
)
gprefs.defaults['action-layout-context-menu-device'] = (
'View', 'Save To Disk', None, 'Remove Books', None,
'Add To Library', 'Edit Collections',
)
# }}}
NONE = QVariant() #: Null value to return from the data function of item models
UNDEFINED_QDATE = QDate(UNDEFINED_DATE)
@ -66,8 +93,6 @@ def _config():
c.add_opt('default_send_to_device_action', default=None,
help=_('Default action to perform when send to device button is '
'clicked'))
c.add_opt('show_donate_button', default=True,
help='Show donation button')
c.add_opt('asked_library_thing_password', default=False,
help='Asked library thing password at least once.')
c.add_opt('search_as_you_type', default=True,

View File

@ -60,6 +60,17 @@ class InterfaceAction(QObject):
#: shortcut must be a translated string if not None
action_spec = ('text', 'icon', None, None)
#: Set of locations to which this action must not be added.
#: See :attr:`all_locations` for a list of possible locations
dont_add_to = frozenset([])
#: Set of locations from which this action must not be removed.
#: See :attr:`all_locations` for a list of possible locations
dont_remove_from = frozenset([])
all_locations = frozenset(['toolbar', 'toolbar-device', 'context-menu',
'context-menu-device'])
def __init__(self, parent, site_customization):
QObject.__init__(self, parent)
self.setObjectName(self.name)

View File

@ -22,7 +22,9 @@ from calibre.gui2.actions import InterfaceAction
class AddAction(InterfaceAction):
name = 'Add Books'
action_spec = (_('Add books'), 'add_book.svg', None, _('A'))
action_spec = (_('Add books'), 'add_book.svg',
_('Add books to the calibre library/device from files on your computer')
, _('A'))
def genesis(self):
self._add_filesystem_book = self.Dispatcher(self.__add_filesystem_book)

View File

@ -10,7 +10,9 @@ from calibre.gui2.actions import InterfaceAction
class AddToLibraryAction(InterfaceAction):
name = 'Add To Library'
action_spec = (_('Add books to library'), 'add_book.svg', None, None)
action_spec = (_('Add books to library'), 'add_book.svg',
_('Add books to your calibre library from the connected device'), None)
dont_add_to = frozenset(['toolbar', 'context-menu'])
def location_selected(self, loc):
enabled = loc != 'library'

View File

@ -18,6 +18,7 @@ class GenerateCatalogAction(InterfaceAction):
name = 'Generate Catalog'
action_spec = (_('Create catalog of books in your calibre library'), None, None, None)
dont_add_to = frozenset(['toolbar-device', 'context-menu-device'])
def generate_catalog(self):
rows = self.gui.library_view.selectionModel().selectedRows()

View File

@ -8,12 +8,12 @@ __docformat__ = 'restructuredtext en'
import os
from functools import partial
from PyQt4.Qt import QMenu
from PyQt4.Qt import QMenu, Qt
from calibre import isbytestring
from calibre.constants import filesystem_encoding
from calibre.utils.config import prefs
from calibre.gui2 import gprefs, warning_dialog
from calibre.gui2 import gprefs, warning_dialog, Dispatcher
from calibre.gui2.actions import InterfaceAction
class LibraryUsageStats(object):
@ -72,15 +72,18 @@ class ChooseLibraryAction(InterfaceAction):
name = 'Choose Library'
action_spec = (_('%d books'), 'lt.png',
_('Choose calibre library to work with'), None)
dont_add_to = frozenset(['toolbar-device', 'context-menu-device'])
def genesis(self):
self.count_changed(0)
self.qaction.triggered.connect(self.choose_library)
self.qaction.triggered.connect(self.choose_library,
type=Qt.QueuedConnection)
self.stats = LibraryUsageStats()
self.create_action(spec=(_('Switch to library...'), 'lt.png', None,
None), attr='action_choose')
self.action_choose.triggered.connect(self.choose_library)
self.action_choose.triggered.connect(self.choose_library,
type=Qt.QueuedConnection)
self.choose_menu = QMenu(self.gui)
self.choose_menu.addAction(self.action_choose)
self.qaction.setMenu(self.choose_menu)
@ -94,7 +97,8 @@ class ChooseLibraryAction(InterfaceAction):
attr='switch_action%d'%i)
self.switch_actions.append(ac)
ac.setVisible(False)
ac.triggered.connect(partial(self.qs_requested, i))
ac.triggered.connect(partial(self.qs_requested, i),
type=Qt.QueuedConnection)
self.choose_menu.addAction(ac)
def library_name(self):
@ -120,8 +124,8 @@ class ChooseLibraryAction(InterfaceAction):
self.quick_menu.clear()
self.qs_locations = [i[1] for i in locations]
for name, loc in locations:
self.quick_menu.addAction(name, partial(self.switch_requested,
loc))
self.quick_menu.addAction(name, Dispatcher(partial(self.switch_requested,
loc)))
for i, x in enumerate(locations[:len(self.switch_actions)]):
name, loc = x

View File

@ -20,6 +20,7 @@ class ConvertAction(InterfaceAction):
name = 'Convert Books'
action_spec = (_('Convert books'), 'convert.svg', None, _('C'))
dont_add_to = frozenset(['toolbar-device', 'context-menu-device'])
def genesis(self):
cm = QMenu()

View File

@ -63,6 +63,7 @@ class CopyToLibraryAction(InterfaceAction):
action_spec = (_('Copy to library'), 'lt.png',
_('Copy selected books to the specified library'), None)
popup_type = QToolButton.InstantPopup
dont_add_to = frozenset(['toolbar-device', 'context-menu-device'])
def genesis(self):
self.menu = QMenu(self.gui)

View File

@ -19,6 +19,7 @@ class ShareConnMenu(QMenu): # {{{
connect_to_itunes = pyqtSignal()
config_email = pyqtSignal()
toggle_server = pyqtSignal()
dont_add_to = frozenset(['toolbar-device', 'context-menu-device'])
def __init__(self, parent=None):
QMenu.__init__(self, parent)
@ -95,6 +96,8 @@ class SendToDeviceAction(InterfaceAction):
name = 'Send To Device'
action_spec = (_('Send to device'), 'sync.svg', None, _('D'))
dont_remove_from = frozenset(['toolbar-device'])
dont_add_to = frozenset(['toolbar', 'context-menu'])
def genesis(self):
self.qaction.triggered.connect(self.do_sync)

View File

@ -10,7 +10,9 @@ from calibre.gui2.actions import InterfaceAction
class EditCollectionsAction(InterfaceAction):
name = 'Edit Collections'
action_spec = (_('Manage collections'), None, None, None)
action_spec = (_('Manage collections'), None,
_('Manage the collections on this device'), None)
dont_add_to = frozenset(['toolbar', 'context-menu'])
def location_selected(self, loc):
enabled = loc != 'library'

View File

@ -13,6 +13,7 @@ class OpenFolderAction(InterfaceAction):
name = 'Open Folder'
action_spec = (_('Open containing folder'), 'document_open.svg', None,
_('O'))
dont_add_to = frozenset(['toolbar-device', 'context-menu-device'])
def genesis(self):
self.qaction.triggered.connect(self.gui.iactions['View'].view_folder)

View File

@ -15,6 +15,7 @@ class PreferencesAction(InterfaceAction):
name = 'Preferences'
action_spec = (_('Preferences'), 'config.svg', None, _('Ctrl+P'))
dont_remove_from = frozenset(['toolbar'])
def genesis(self):
pm = QMenu()
@ -55,6 +56,8 @@ class PreferencesAction(InterfaceAction):
self.gui.tags_view.recount()
self.gui.create_device_menu()
self.gui.set_device_menu_items_state(bool(self.gui.device_connected))
self.gui.tool_bar.build_bar()
self.gui.build_context_menus()
self.gui.tool_bar.apply_settings()

View File

@ -15,6 +15,7 @@ class ShowBookDetailsAction(InterfaceAction):
name = 'Show Book Details'
action_spec = (_('Show book details'), 'dialog_information.svg', None,
_('I'))
dont_add_to = frozenset(['toolbar-device', 'context-menu-device'])
def genesis(self):
self.qaction.triggered.connect(self.show_book_info)

View File

@ -550,9 +550,7 @@ class BulkText(BulkBase):
remove_all, adding, rtext = self.gui_val
remove = set()
if remove_all:
for book_id in book_ids:
remove |= set(self.db.get_custom(book_id, num=self.col_id,
index_is_id=True))
remove = set(self.db.all_custom(num=self.col_id))
else:
txt = rtext
if txt:

View File

@ -14,6 +14,7 @@ from PyQt4.Qt import QDialog, QListWidgetItem, QIcon, \
from calibre.constants import iswindows, isosx
from calibre.gui2.dialogs.config.config_ui import Ui_Dialog
from calibre.gui2.dialogs.config.create_custom_column import CreateCustomColumn
from calibre.gui2.dialogs.config.toolbar import ToolbarLayout
from calibre.gui2 import error_dialog, config, gprefs, \
open_url, open_local_file, \
ALL_COLUMNS, NONE, info_dialog, choose_files, \
@ -503,7 +504,6 @@ class ConfigDialog(ResizableDialog, Ui_Dialog):
idx = w.findText(self.db.prefs.get(x+'_restriction', ''))
w.setCurrentIndex(0 if idx < 0 else idx)
self.opt_disable_animations.setChecked(config['disable_animations'])
self.opt_show_donate_button.setChecked(config['show_donate_button'])
idx = 0
for i, x in enumerate([(_('Small'), 'small'), (_('Medium'), 'medium'),
(_('Large'), 'large')]):
@ -524,6 +524,9 @@ class ConfigDialog(ResizableDialog, Ui_Dialog):
self.current_tweaks.setPlainText(curt.decode('utf-8'))
self.default_tweaks.setPlainText(deft.decode('utf-8'))
self.restore_tweaks_to_default_button.clicked.connect(self.restore_tweaks_to_default)
self.toolbar_cm_widget = ToolbarLayout(parent, parent)
self.toolbar_cm_tab.addTab(self.toolbar_cm_widget,
_('Toolbars/Context menus'))
self.category_view.setCurrentIndex(self.category_view.model().index_for_name(initial_category))
@ -888,6 +891,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog):
wl = self.opt_worker_limit.value()
if wl%2 != 0:
wl += 1
self.toolbar_cm_widget.commit()
config['worker_limit'] = wl
config['use_roman_numerals_for_series_number'] = bool(self.roman_numerals.isChecked())
@ -923,7 +927,6 @@ class ConfigDialog(ResizableDialog, Ui_Dialog):
config['overwrite_author_title_metadata'] = self.opt_overwrite_author_title_metadata.isChecked()
config['enforce_cpu_limit'] = bool(self.opt_enforce_cpu_limit.isChecked())
config['disable_animations'] = bool(self.opt_disable_animations.isChecked())
config['show_donate_button'] = bool(self.opt_show_donate_button.isChecked())
gprefs['show_splash_screen'] = bool(self.show_splash_screen.isChecked())
for x in ('toolbar_icon_size', 'toolbar_text'):
w = getattr(self, 'opt_'+x)

View File

@ -294,82 +294,38 @@
</layout>
</widget>
<widget class="QWidget" name="page">
<layout class="QGridLayout" name="gridLayout_12">
<item row="0" column="0">
<widget class="QTabWidget" name="toolbar_cm_tab">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>&amp;Miscellaneous</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_8">
<item row="2" column="0">
<widget class="QCheckBox" name="roman_numerals">
<item row="0" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Use &amp;Roman numerals for series number</string>
<string>User Interface &amp;layout (needs restart):</string>
</property>
<property name="checked">
<bool>true</bool>
<property name="buddy">
<cstring>opt_gui_layout</cstring>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="systray_icon">
<property name="text">
<string>Enable system &amp;tray icon (needs restart)</string>
<item row="0" column="1">
<widget class="QComboBox" name="opt_gui_layout">
<property name="maximumSize">
<size>
<width>250</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="systray_notifications">
<property name="text">
<string>Show &amp;notifications in system tray</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="show_splash_screen">
<property name="text">
<string>Show &amp;splash screen at startup</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QCheckBox" name="separate_cover_flow">
<property name="text">
<string>Show cover &amp;browser in a separate window (needs restart)</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QCheckBox" name="show_avg_rating">
<property name="text">
<string>Show &amp;average ratings in the tags browser</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="search_as_you_type">
<property name="text">
<string>Search as you type</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="9" column="0" colspan="2">
<widget class="QCheckBox" name="sync_news">
<property name="text">
<string>Automatically send downloaded &amp;news to ebook reader</string>
</property>
</widget>
</item>
<item row="10" column="0" colspan="2">
<widget class="QCheckBox" name="delete_news">
<property name="text">
<string>&amp;Delete news from library when it is automatically sent to reader</string>
</property>
</widget>
</item>
<item row="11" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>&amp;Number of covers to show in browse mode (needs restart):</string>
@ -379,10 +335,89 @@
</property>
</widget>
</item>
<item>
<item row="1" column="1">
<widget class="QSpinBox" name="cover_browse"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_170">
<property name="text">
<string>Restriction to apply when the current library is opened:</string>
</property>
<property name="buddy">
<cstring>opt_gui_restriction</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="opt_gui_restriction">
<property name="maximumSize">
<size>
<width>250</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>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. </string>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
</property>
<property name="minimumContentsLength">
<number>15</number>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="opt_disable_animations">
<property name="toolTip">
<string>Disable all animations. Useful if you have a slow/old computer.</string>
</property>
<property name="text">
<string>Disable &amp;animations</string>
</property>
</widget>
</item>
<item row="11" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>&amp;Toolbar</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QComboBox" name="opt_toolbar_icon_size"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>&amp;Icon size:</string>
</property>
<property name="buddy">
<cstring>opt_toolbar_icon_size</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="opt_toolbar_text"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Show &amp;text under icons:</string>
</property>
<property name="buddy">
<cstring>opt_toolbar_text</cstring>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="10" column="0" colspan="2">
<widget class="QCheckBox" name="delete_news">
<property name="text">
<string>&amp;Delete news from library when it is automatically sent to reader</string>
</property>
</widget>
</item>
<item row="12" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_7">
@ -550,106 +585,74 @@
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_17">
<item row="6" column="1">
<widget class="QCheckBox" name="search_as_you_type">
<property name="text">
<string>User Interface &amp;layout (needs restart):</string>
<string>Search as you type</string>
</property>
<property name="buddy">
<cstring>opt_gui_layout</cstring>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="opt_gui_layout">
<property name="maximumSize">
<size>
<width>250</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_170">
<item row="5" column="1">
<widget class="QCheckBox" name="roman_numerals">
<property name="text">
<string>Restriction to apply when the current library is opened:</string>
<string>Use &amp;Roman numerals for series</string>
</property>
<property name="buddy">
<cstring>opt_gui_restriction</cstring>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="opt_gui_restriction">
<property name="maximumSize">
<size>
<width>250</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>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. </string>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
</property>
<property name="minimumContentsLength">
<number>20</number>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="opt_disable_animations">
<property name="toolTip">
<string>Disable all animations. Useful if you have a slow/old computer.</string>
</property>
<item row="3" column="0">
<widget class="QCheckBox" name="systray_icon">
<property name="text">
<string>Disable &amp;animations</string>
<string>Enable system &amp;tray icon (needs restart)</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="show_avg_rating">
<property name="text">
<string>Show &amp;average ratings in the tags browser</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="sync_news">
<property name="text">
<string>Automatically send downloaded &amp;news to ebook reader</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="opt_show_donate_button">
<widget class="QCheckBox" name="show_splash_screen">
<property name="text">
<string>Show &amp;donate button (restart)</string>
<string>Show &amp;splash screen at startup</string>
</property>
</widget>
</item>
<item row="8" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>&amp;Toolbar</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QComboBox" name="opt_toolbar_icon_size"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<item row="9" column="0" colspan="2">
<widget class="QCheckBox" name="separate_cover_flow">
<property name="text">
<string>&amp;Icon size:</string>
</property>
<property name="buddy">
<cstring>opt_toolbar_icon_size</cstring>
<string>Show cover &amp;browser in a separate window (needs restart)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="opt_toolbar_text"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<item row="5" column="0">
<widget class="QCheckBox" name="systray_notifications">
<property name="text">
<string>Show &amp;text under icons:</string>
</property>
<property name="buddy">
<cstring>opt_toolbar_text</cstring>
<string>Show &amp;notifications in system tray</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>

View File

@ -11,41 +11,29 @@ from PyQt4.Qt import QWidget, QAbstractListModel, Qt, QIcon, \
QVariant, QItemSelectionModel
from calibre.gui2.dialogs.config.toolbar_ui import Ui_Form
from calibre.gui2.layout import TOOLBAR_NO_DEVICE, TOOLBAR_DEVICE
from calibre.gui2.init import LIBRARY_CONTEXT_MENU, DEVICE_CONTEXT_MENU
from calibre.gui2 import gprefs, NONE
from calibre.gui2 import gprefs, NONE, warning_dialog
DEFAULTS = {
'toolbar': TOOLBAR_NO_DEVICE,
'toolbar-device': TOOLBAR_DEVICE,
'context-menu': LIBRARY_CONTEXT_MENU,
'context-menu-device': DEVICE_CONTEXT_MENU,
}
UNREMOVABLE = {
'toolbar': ['Preferences'],
'toolbar-device': ['Send To Device', 'Location Manager'],
}
UNADDABLE = {
'toolbar': ['Location Manager'],
'context-menu': ['Location Manager'],
'context-menu-device': ['Location Manager'],
}
class FakeAction(object):
def __init__(self, name, icon, tooltip=None):
def __init__(self, name, icon, tooltip=None,
dont_add_to=frozenset([]), dont_remove_from=frozenset([])):
self.name = name
self.action_spec = (name, icon, tooltip, None)
self.dont_remove_from = dont_remove_from
self.dont_add_to = dont_add_to
class BaseModel(QAbstractListModel):
def name_to_action(self, name, gui):
if name == 'Donate':
return FakeAction(name, 'donate.svg')
return FakeAction(name, 'donate.svg',
dont_add_to=frozenset(['context-menu',
'context-menu-device']))
if name == 'Location Manager':
return FakeAction(name, None)
return FakeAction(name, None,
_('Switch between library and device views'),
dont_remove_from=set(['toolbar-device']))
if name is None:
return FakeAction('--- '+_('Separator')+' ---', None)
return gui.iactions[name]
@ -86,19 +74,25 @@ class AllModel(BaseModel):
def __init__(self, key, gui):
BaseModel.__init__(self)
current = gprefs.get('action-layout-'+key, DEFAULTS[key])
all = list(gui.iactions.keys()) + ['Donate']
all = [x for x in all if x not in current] + [None]
all = [self.name_to_action(x, gui) for x in all]
all.sort()
self.gprefs_name = 'action-layout-'+key
current = gprefs[self.gprefs_name]
self.gui = gui
self.key = key
self._data = self.get_all_actions(current)
self._data = all
def get_all_actions(self, current):
all = list(self.gui.iactions.keys()) + ['Donate']
all = [x for x in all if x not in current] + [None]
all = [self.name_to_action(x, self.gui) for x in all]
all = [x for x in all if self.key not in x.dont_add_to]
all.sort()
return all
def add(self, names):
actions = []
for name in actions:
for name in names:
if name is None or name.startswith('---'): continue
actions.append(self.name_to_action(name))
actions.append(self.name_to_action(name, self.gui))
self._data.extend(actions)
self._data.sort()
self.reset()
@ -118,14 +112,20 @@ class AllModel(BaseModel):
self._data = ndata
self.reset()
def restore_defaults(self):
current = gprefs.defaults[self.gprefs_name]
self._data = self.get_all_actions(current)
self.reset()
class CurrentModel(BaseModel):
def __init__(self, key, gui):
BaseModel.__init__(self)
current = gprefs.get('action-layout-'+key, DEFAULTS[key])
self.gprefs_name = 'action-layout-'+key
current = gprefs[self.gprefs_name]
self._data = [self.name_to_action(x, gui) for x in current]
self.key = key
self.gui = gui
def move(self, idx, delta):
row = idx.row()
@ -145,11 +145,12 @@ class CurrentModel(BaseModel):
def add(self, names):
actions = []
reject = set([])
for name in actions:
if name in UNADDABLE[self.key]:
reject.add(name)
continue
actions.append(self.name_to_action(name))
for name in names:
ac = self.name_to_action(name, self.gui)
if self.key in ac.dont_add_to:
reject.add(ac)
else:
actions.append(ac)
self._data.extend(actions)
self.reset()
@ -157,19 +158,41 @@ class CurrentModel(BaseModel):
def remove(self, indices):
rows = [i.row() for i in indices]
r = UNREMOVABLE[self.key]
remove, removed = set([]), set([])
remove, rejected = set([]), set([])
for row in rows:
ac = self._data[row]
if ac.name in r: continue
if self.key in ac.dont_remove_from:
rejected.add(ac)
continue
remove.add(row)
removed.add(ac.name)
ndata = []
for i, ac in enumerate(self._data):
if i not in remove:
ndata.append(ac)
self._data = ndata
self.reset()
return rejected
def commit(self):
old = gprefs[self.gprefs_name]
new = []
for x in self._data:
n = x.name
if n.startswith('---'):
n = None
new.append(n)
new = tuple(new)
if new != old:
defaults = gprefs.defaults[self.gprefs_name]
if defaults == new:
del gprefs[self.gprefs_name]
else:
gprefs[self.gprefs_name] = new
def restore_defaults(self):
current = gprefs.defaults[self.gprefs_name]
self._data = [self.name_to_action(x, self.gui) for x in current]
self.reset()
class ToolbarLayout(QWidget, Ui_Form):
@ -199,6 +222,7 @@ class ToolbarLayout(QWidget, Ui_Form):
self.add_action_button.clicked.connect(self.add_action)
self.remove_action_button.clicked.connect(self.remove_action)
self.restore_defaults_button.clicked.connect(self.restore_defaults)
self.action_up_button.clicked.connect(partial(self.move, -1))
self.action_down_button.clicked.connect(partial(self.move, 1))
@ -212,15 +236,32 @@ class ToolbarLayout(QWidget, Ui_Form):
names = self.all_actions.model().names(x)
if names:
not_added = self.current_actions.model().add(names)
added = set(names) - not_added
ns = set([x.name for x in not_added])
added = set(names) - ns
self.all_actions.model().remove(x, added)
if not_added:
warning_dialog(self, _('Cannot add'),
_('Cannot add the actions %s to this location') %
','.join([a.action_spec[0] for a in not_added]),
show=True)
if added:
ca = self.current_actions
idx = ca.model().index(ca.model().rowCount(None)-1)
ca.scrollTo(idx)
def remove_action(self, *args):
x = self.current_actions.selectionModel().selectedIndexes()
names = self.current_actions.model().names(x)
if names:
self.current_actions.model().remove(x)
self.all_actions.model().add(names)
not_removed = self.current_actions.model().remove(x)
ns = set([x.name for x in not_removed])
removed = set(names) - ns
self.all_actions.model().add(removed)
if not_removed:
warning_dialog(self, _('Cannot remove'),
_('Cannot remove the actions %s from this location') %
','.join([a.action_spec[0] for a in not_removed]),
show=True)
def move(self, delta, *args):
ci = self.current_actions.currentIndex()
@ -232,6 +273,16 @@ class ToolbarLayout(QWidget, Ui_Form):
self.current_actions.selectionModel().select(ni,
QItemSelectionModel.ClearAndSelect)
def commit(self):
for am, cm in self.models.values():
cm.commit()
def restore_defaults(self, *args):
for am, cm in self.models.values():
cm.restore_defaults()
am.restore_defaults()
if __name__ == '__main__':
from PyQt4.Qt import QApplication
from calibre.gui2.ui import Main
@ -240,4 +291,5 @@ if __name__ == '__main__':
a = ToolbarLayout(m)
a.show()
app.exec_()
a.commit()

View File

@ -207,6 +207,13 @@
</item>
</layout>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="restore_defaults_button">
<property name="text">
<string>Restore to &amp;default</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources>

View File

@ -199,6 +199,9 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
for w in getattr(self, 'custom_column_widgets', []):
w.gui_val
if self.remove_all_tags.isChecked():
remove = self.db.all_tags()
else:
remove = unicode(self.remove_tags.text()).strip().split(',')
add = unicode(self.tags.text()).strip().split(',')
au = unicode(self.authors.text())

View File

@ -140,7 +140,7 @@
</property>
</widget>
</item>
<item row="4" column="1">
<item row="4" column="1" colspan="2">
<widget class="EnComboBox" name="publisher">
<property name="editable">
<bool>true</bool>
@ -191,14 +191,23 @@
</property>
</widget>
</item>
<item row="6" column="1" colspan="2">
<item row="6" column="1">
<widget class="TagsLineEdit" name="remove_tags">
<property name="toolTip">
<string>Comma separated list of tags to remove from the books. </string>
</property>
</widget>
</item>
<item row="7" column="0">
<item row="6" column="2">
<widget class="QCheckBox" name="remove_all_tags">
<property name="text">
<string>Remove all</string>
</property>
<property name="toolTip">
<string>Check this box to remove all tags from the books.</string>
</property>
</widget>
</item><item row="7" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>&amp;Series:</string>

View File

@ -613,12 +613,9 @@
</widget>
</item>
<item>
<widget class="QToolButton" name="cover_button">
<property name="toolTip">
<string>Browse for an image to use as the cover of this book.</string>
</property>
<widget class="QPushButton" name="cover_button">
<property name="text">
<string>...</string>
<string>&amp;Browse</string>
</property>
<property name="icon">
<iconset resource="../../../../resources/images.qrc">
@ -750,7 +747,6 @@
<tabstop>button_set_metadata</tabstop>
<tabstop>formats</tabstop>
<tabstop>cover_path</tabstop>
<tabstop>cover_button</tabstop>
<tabstop>reset_cover</tabstop>
<tabstop>fetch_cover_button</tabstop>
<tabstop>generate_cover_button</tabstop>

View File

@ -13,7 +13,7 @@ from PyQt4.Qt import Qt, QStackedWidget, QMenu, \
from calibre.utils.config import prefs
from calibre.constants import isosx, __appname__, preferred_encoding, \
__version__
from calibre.gui2 import config, is_widescreen
from calibre.gui2 import config, is_widescreen, gprefs
from calibre.gui2.library.views import BooksView, DeviceBooksView
from calibre.gui2.widgets import Splitter
from calibre.gui2.tag_view import TagBrowserWidget
@ -27,35 +27,10 @@ def partial(*args, **kwargs):
_keep_refs.append(ans)
return ans
LIBRARY_CONTEXT_MENU = (
'Edit Metadata', 'Send To Device', 'Save To Disk',
'Connect Share', 'Copy To Library', None,
'Convert Books', 'View', 'Open Folder', 'Show Book Details',
'Similar Books', None, 'Remove Books',
)
DEVICE_CONTEXT_MENU = ('View', 'Save To Disk', None, 'Remove Books', None,
'Add To Library', 'Edit Collections',
)
class LibraryViewMixin(object): # {{{
def __init__(self, db):
lm = QMenu(self)
def populate_menu(m, items):
for what in items:
if what is None:
m.addSeparator()
elif what in self.iactions:
m.addAction(self.iactions[what].qaction)
populate_menu(lm, LIBRARY_CONTEXT_MENU)
dm = QMenu(self)
populate_menu(dm, DEVICE_CONTEXT_MENU)
ec = self.iactions['Edit Collections'].qaction
self.library_view.set_context_menu(lm, ec)
for v in (self.memory_view, self.card_a_view, self.card_b_view):
v.set_context_menu(dm, ec)
self.library_view.files_dropped.connect(self.iactions['Add Books'].files_dropped, type=Qt.QueuedConnection)
for func, args in [
('connect_to_search_box', (self.search,
@ -85,6 +60,23 @@ class LibraryViewMixin(object): # {{{
view = getattr(self, view+'_view')
view.verticalHeader().sectionDoubleClicked.connect(self.iactions['View'].view_specific_book)
self.build_context_menus()
def build_context_menus(self):
lm = QMenu(self)
def populate_menu(m, items):
for what in items:
if what is None:
m.addSeparator()
elif what in self.iactions:
m.addAction(self.iactions[what].qaction)
populate_menu(lm, gprefs['action-layout-context-menu'])
dm = QMenu(self)
populate_menu(dm, gprefs['action-layout-context-menu-device'])
ec = self.iactions['Edit Collections'].qaction
self.library_view.set_context_menu(lm, ec)
for v in (self.memory_view, self.card_a_view, self.card_b_view):
v.set_context_menu(dm, ec)
def search_done(self, view, ok):

View File

@ -15,23 +15,10 @@ from PyQt4.Qt import QIcon, Qt, QWidget, QToolBar, QSize, \
from calibre.constants import __appname__
from calibre.gui2.search_box import SearchBox2, SavedSearchBox
from calibre.gui2.throbber import ThrobbingButton
from calibre.gui2 import config, gprefs
from calibre.gui2 import gprefs
from calibre.gui2.widgets import ComboBoxWithHelp
from calibre import human_readable
TOOLBAR_NO_DEVICE = (
'Add Books', 'Edit Metadata', None, 'Convert Books', 'View', None,
'Choose Library', 'Donate', None, 'Fetch News', 'Save To Disk',
'Connect Share', None, 'Remove Books', None, 'Help', 'Preferences',
)
TOOLBAR_DEVICE = (
'Add Books', 'Edit Metadata', None, 'Convert Books', 'View',
'Send To Device', None, None, 'Location Manager', None, None,
'Fetch News', 'Save To Disk', 'Connect Share', None,
'Remove Books', None, 'Help', 'Preferences',
)
class LocationManager(QObject): # {{{
locations_changed = pyqtSignal()
@ -110,6 +97,7 @@ class LocationManager(QObject): # {{{
self.free[2] = fs[2] if fs[2] is not None and cpb is not None else -1
self.update_tooltips()
if self.has_device != had_device:
self.location_library.setChecked(True)
self.locations_changed.emit()
if not self.has_device:
self.location_library.trigger()
@ -220,14 +208,11 @@ class ToolBar(QToolBar): # {{{
self.setOrientation(Qt.Horizontal)
self.setAllowedAreas(Qt.TopToolBarArea|Qt.BottomToolBarArea)
self.setStyleSheet('QToolButton:checked { font-weight: bold }')
self.donate = donate
self.donate_button = donate
self.apply_settings()
self.location_manager = location_manager
self.location_manager.locations_changed.connect(self.build_bar)
self.d_widget = QWidget()
self.d_widget.setLayout(QVBoxLayout())
self.d_widget.layout().addWidget(donate)
donate.setAutoRaise(True)
donate.setCursor(Qt.PointingHandCursor)
self.build_bar()
@ -241,14 +226,15 @@ class ToolBar(QToolBar): # {{{
if gprefs.get('toolbar_text', 'auto') == 'never':
style = Qt.ToolButtonIconOnly
self.setToolButtonStyle(style)
self.donate.set_normal_icon_size(sz, sz)
self.donate_button.set_normal_icon_size(sz, sz)
def contextMenuEvent(self, *args):
pass
def build_bar(self):
showing_device = self.location_manager.has_device
actions = TOOLBAR_DEVICE if showing_device else TOOLBAR_NO_DEVICE
actions = '-device' if showing_device else ''
actions = gprefs['action-layout-toolbar'+actions]
self.clear()
@ -259,7 +245,10 @@ class ToolBar(QToolBar): # {{{
for ac in self.location_manager.available_actions:
self.addAction(ac)
self.setup_tool_button(ac, QToolButton.MenuButtonPopup)
elif what == 'Donate' and config['show_donate_button']:
elif what == 'Donate':
self.d_widget = QWidget()
self.d_widget.setLayout(QVBoxLayout())
self.d_widget.layout().addWidget(self.donate_button)
self.addWidget(self.d_widget)
elif what in self.gui.iactions:
action = self.gui.iactions[what]
@ -290,7 +279,7 @@ class ToolBar(QToolBar): # {{{
# }}}
class MainWindowMixin(object):
class MainWindowMixin(object): # {{{
def __init__(self, db):
self.setObjectName('MainWindow')
@ -316,7 +305,7 @@ class MainWindowMixin(object):
l = self.centralwidget.layout()
l.addWidget(self.search_bar)
# }}}

View File

@ -98,14 +98,14 @@ class DateDelegate(QStyledItemDelegate): # {{{
d = val.toDate()
if d <= UNDEFINED_QDATE:
return ''
return format_date(d.toPyDate(), 'dd MMM yyyy')
format = tweaks['gui_timestamp_display_format']
if format is None:
format = 'dd MMM yyyy'
return format_date(d.toPyDate(), format)
def createEditor(self, parent, option, index):
qde = QStyledItemDelegate.createEditor(self, parent, option, index)
stdformat = unicode(qde.displayFormat())
if 'yyyy' not in stdformat:
stdformat = stdformat.replace('yy', 'yyyy')
qde.setDisplayFormat(stdformat)
qde.setDisplayFormat('dd MMM yyyy')
qde.setMinimumDate(UNDEFINED_QDATE)
qde.setSpecialValueText(_('Undefined'))
qde.setCalendarPopup(True)

View File

@ -0,0 +1,73 @@
#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
from PyQt4.Qt import QWidget, pyqtSignal
from calibre.customize.ui import preferences_plugins
class ConfigWidgetInterface(object):
changed_signal = None
def genesis(self, gui):
raise NotImplementedError()
def restore_defaults(self):
pass
def commit(self):
pass
class ConfigWidgetBase(QWidget, ConfigWidgetInterface):
changed_signal = pyqtSignal()
def __init__(self, parent=None):
QWidget.__init__(self, parent)
if hasattr(self, 'setupUi'):
self.setupUi(self)
def get_plugin(category, name):
for plugin in preferences_plugins():
if plugin.category == category and plugin.name == name:
return plugin
raise ValueError(
'No Preferences PLugin with category: %s and name: %s found' %
(category, name))
def test_widget(category, name, gui=None): # {{{
from PyQt4.Qt import QDialog, QVBoxLayout, QDialogButtonBox
pl = get_plugin(category, name)
d = QDialog()
d.resize(750, 550)
bb = QDialogButtonBox(d)
bb.setStandardButtons(bb.Apply|bb.Cancel|bb.RestoreDefaults)
bb.accepted.connect(d.accept)
bb.rejected.connect(d.reject)
w = pl.create_widget(d)
bb.button(bb.RestoreDefaults).clicked.connect(w.restore_defaults)
bb.button(bb.Apply).setEnabled(False)
w.changed_signal.connect(lambda : bb.button(bb.Apply).setEnable(True))
l = QVBoxLayout()
pl.setLayout(l)
l.addWidget(w)
if gui is None:
from calibre.gui2.ui import Main
from calibre.gui2.main import option_parser
from calibre.library.db import db
parser = option_parser()
opts, args = parser.parse_args([])
actions = tuple(Main.create_application_menubar())
db = db()
gui = Main(opts)
gui.initialize(db.library_path, db, None, actions)
w.genesis(gui)
if d.exec_() == QDialog.Accepted:
w.commit()
# }}}

View File

@ -50,6 +50,8 @@ class Listener(Thread): # {{{
self.start()
def run(self):
if self.listener is None:
return
while self._run:
try:
conn = self.listener.accept()

View File

@ -112,6 +112,6 @@ class cmd_commit(_cmd_commit):
server = xmlrpclib.ServerProxy(url)
server.ticket.update(int(bug), msg,
{'status':'closed', 'resolution':'fixed'},
False)
True)
bzrlib.commands.register_command(cmd_commit)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n"
"PO-Revision-Date: 2010-08-19 19:17+0000\n"
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-21 08:43+0000\n"
"Last-Translator: Glenn <Unknown>\n"
"Language-Team: Danish <da@li.org>\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-20 03:34+0000\n"
"X-Launchpad-Export-Date: 2010-08-22 03:44+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -27,7 +27,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:506
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:507
#: /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
@ -136,10 +136,10 @@ msgstr "Gør absolut ingenting"
#: /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:1885
#: /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:134
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /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/utils/podofo/__init__.py:46
@ -763,7 +763,11 @@ msgstr "Kommunikér med Booq Avant"
msgid "Communicate with the Sweex MM300"
msgstr "Kommunikér med Sweex MM300"
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:78
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
msgid "Communicate with the Kogan"
msgstr "Kommunikér med Kogan"
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
msgid "Communicate with the Pandigital Novel"
msgstr "Kommunikér med Pandigital Novel"
@ -807,7 +811,7 @@ msgstr ""
"Komma separeret liste af metadata felter som oversættes til collections på "
"enheden. Muligheder omfatter: "
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:144
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed"
msgstr "Unavngivet"
@ -1671,7 +1675,11 @@ msgstr "Udfører transformationer på e-bog..."
msgid "Creating"
msgstr "Opretter"
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:18
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
msgid "Failed to parse: %s with error: %s"
msgstr "Fejlede med at parse: %s med fejl: %s"
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
msgid "ePub Fixer"
msgstr "ePub-fixer"
@ -1692,7 +1700,7 @@ msgstr ""
"Dette kan forårsage omfattende ændringer til din epub, klag til epubcheck-"
"projektet."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:19
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:21
msgid ""
"%prog [options] file.epub\n"
"\n"
@ -1710,7 +1718,7 @@ msgstr ""
"By default, no fixing is done and messages are printed out for each error "
"detected. Use the options to control which errors are automatically fixed."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:50
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:52
msgid "You must specify an epub file"
msgstr "Du skal angive en epub-fil"
@ -2103,7 +2111,7 @@ msgstr "Tegneserie"
#: /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:550
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569
msgid "Title"
msgstr "Titel"
@ -3151,7 +3159,7 @@ msgid ""
"directory, assumes every ebook file is the same book in a different format)"
msgstr ""
"Tilføj bøger fra mapper, inklusiv undermapper (Én e-bog per mappe, formoder "
"hver e-bogsfil er den samme e-bog i forskellge formater)"
"hver e-bogsfil er den samme e-bog i forskellige formater)"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36
msgid ""
@ -3293,6 +3301,7 @@ msgstr "Kun brugernoter genereret fra arbejdsbibliotek"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98
#: /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
@ -3368,7 +3377,8 @@ msgid "Select destination for %s.%s"
msgstr "Gem destination for %s.%s"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:108
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:62
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d books"
msgstr "%d bøger"
@ -3435,14 +3445,45 @@ msgstr "Kan ikke konvertere"
msgid "Starting conversion of %d book(s)"
msgstr "Starter konvertering af %d bog/bøger"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:15
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63
msgid "Copy to library"
msgstr "Kopiér til bibliotek"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64
msgid "Copy selected books to the specified library"
msgstr "Kopiér udvalgte bøger til det angivne bibliotek"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97
msgid "Cannot copy"
msgstr "Kan ikke kopiere"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102
msgid "No library"
msgstr "Intet bibliotek"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103
msgid "No library found at %s"
msgstr "Intet bibliotek fundet ved %s"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110
msgid "Copying"
msgstr "Kopiérer"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
msgid "Could not copy books: "
msgstr "Kunne ikke kopiere bøger: "
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr "Fejlede"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123
msgid "Copied %d books to %s"
msgstr "Kopiéret %d bøger til %s"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del"
msgstr "Slet"
@ -3875,35 +3916,35 @@ msgstr "Ingen detaljeret information tilgængelig om bøger på enheden."
msgid "Similar books..."
msgstr "Lignende bøger..."
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Alt+A"
msgstr "Alt+A"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Books by same author"
msgstr "Bøger af samme forfatter"
#: /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+S"
msgstr "Alt+S"
#: /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 in this series"
msgstr "Bøger i denne serie"
#: /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 "Alt+P"
msgstr "Alt+P"
#: /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 by this publisher"
msgstr "Bøger fra denne udgiver"
#: /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+T"
msgstr "Alt+T"
#: /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 "Books with the same tags"
msgstr "Bøger med samme mærker"
@ -4121,6 +4162,10 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636
#: /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:690
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100
#: /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:105
#: /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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
@ -4286,6 +4331,7 @@ msgstr "output"
#: /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:93
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107
@ -5559,11 +5605,6 @@ msgstr "Kommunikationsfejl med enheden"
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:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr "Fejlede"
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device"
msgstr "Fejl ved kommunikation med enhed"
@ -6746,7 +6787,7 @@ msgstr "Tal"
#: /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:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Date"
msgstr "Dato"
@ -6940,6 +6981,63 @@ msgstr "Tilgængelige variable:"
msgid "Downloading social metadata, please wait..."
msgstr "Downloader sociale metadata, vent venligst..."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50
msgid "Separator"
msgstr "Separator"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63
msgid "Choose library"
msgstr "Vælg bibliotek"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113
msgid "The main toolbar"
msgstr "Hovedværktøjslinjen"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114
msgid "The main toolbar when a device is connected"
msgstr "Hovedværktøjslinjen når en enhed er forbundet"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115
msgid "The context menu for the books in the calibre library"
msgstr "Kontekstmenuen til bøgerne i calibre-biblioteket"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117
msgid "The context menu for the books on the device"
msgstr "Kontekstmenuen til bøgerne i enheden"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94
msgid "Customize the actions in:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95
msgid "A&vailable actions"
msgstr "&Tilgængelige aktioner"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96
msgid "&Current actions"
msgstr "&Aktuelle aktioner"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97
msgid "Move selected action up"
msgstr "Flyt udvalgte aktion op"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99
msgid "Move selected action down"
msgstr "Flyt udvalgte aktion ned"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
msgid "Ctrl+S"
msgstr "Ctrl+S"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102
msgid "Add selected actions to toolbar"
msgstr "Tilføj udvalgte aktioner til værktøjslinjen"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104
msgid "Remove selected actions from toolbar"
msgstr "Fjern udvalgte aktioner fra værktøjslinjen"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again"
msgstr "&Vis denne advarsel igen"
@ -7911,10 +8009,6 @@ msgstr ""
msgid "Rename the item in every book where it is used."
msgstr "Omdøb emnet i bøger hvor det er brugt."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
msgid "Ctrl+S"
msgstr "Ctrl+S"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings"
msgstr "Test e-mail indstillinger"
@ -8228,48 +8322,48 @@ msgstr "ISBN:"
msgid "Regular expression (?P<isbn>)"
msgstr "Regulært udtryk (?P<isbn>)"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105
msgid "Cover Browser"
msgstr "omslags-browser"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110
msgid "Shift+Alt+B"
msgstr "Shift+Alt+B"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124
msgid "Tag Browser"
msgstr "Mærke-browser"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126
msgid "Shift+Alt+T"
msgstr "Shift+Alt+T"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
msgid "version"
msgstr "version"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147
msgid "created by Kovid Goyal"
msgstr "skabt af Kovid Goyal"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:164
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:165
msgid "Connected "
msgstr "Forbundet "
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:173
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:174
msgid "Update found"
msgstr "Opdatering fundet"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details"
msgstr "bog detaljer"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:219
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220
msgid "Alt+D"
msgstr "Alt+D"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:229
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230
msgid "Shift+Alt+D"
msgstr "Shift+Alt+D"
@ -8341,7 +8435,7 @@ msgid "Eject this device"
msgstr "Skub denne enhed ud"
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:194
msgid "Library"
msgstr "Bibliotek"
@ -10604,7 +10698,52 @@ msgstr "Spørger/spørg ikke efter bekræftelse"
msgid "Error: You must specify a column label"
msgstr "Fejl: Du skal specificere en kolonne label"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:809
#: /home/kovid/work/calibre/src/calibre/library/cli.py:803
msgid ""
"\n"
" %prog saved_searches [options] list\n"
" %prog saved_searches add name search\n"
" %prog saved_searches remove name\n"
"\n"
" Manage the saved searches stored in this database.\n"
" If you try to add a query with a name that already exists, it will be\n"
" replaced.\n"
" "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
msgid "Error: You must specify an action (add|remove|list)"
msgstr "Fejl: Du skal angive en aktion (tilføj|fjern|liste)"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:829
msgid "Name:"
msgstr "Navn:"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:830
msgid "Search string:"
msgstr "Søgestreng:"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:836
msgid "Error: You must specify a name and a search string"
msgstr "Fejl: Du skal angive et navn og en søgestreng"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:839
msgid "added"
msgstr "tilføjet"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:844
msgid "Error: You must specify a name"
msgstr "Fejl: Du skal angive et navn"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:847
msgid "removed"
msgstr "fjernet"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:851
msgid "Error: Action %s not recognized, must be one of: (add|remove|list)"
msgstr "Fejl: Aktion %s ikke genkendt, skal være en af: (tilføj|fjern|liste)"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:865
msgid ""
"%%prog command [options] [arguments]\n"
"\n"
@ -10644,27 +10783,27 @@ msgstr "%sMiddel vurderingen er %3.1f"
msgid "Main"
msgstr "Main/hjem/primær"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1911
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1915
msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "<p>Flytter gammel database til e-bogsbibliotek i %s<br><center>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1940
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1944
msgid "Copying <b>%s</b>"
msgstr "Kopierer <b>%s</b>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1957
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1961
msgid "Compacting database"
msgstr "Komprimerer database"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2050
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2054
msgid "Checking SQL integrity..."
msgstr "Checker SQL integritet..."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2091
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2095
msgid "Checking for missing files."
msgstr "Checker for manglende filer."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2113
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2117
msgid "Checked id"
msgstr "Checket id"
@ -10897,35 +11036,39 @@ msgstr ""
"Angiv en restriktion som skal anvendes til denne aktivering. Denne mulighed "
"overstyrer enhver per-biblioteksindstilling angivet i GUI-en"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d book"
msgstr "%d bog"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:129
msgid "%d items"
msgstr "%d emner"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:146
msgid "RATING: %s<br />"
msgstr "VURDERING: %s<br />"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:149
msgid "TAGS: %s<br />"
msgstr "MÆRKATER: %s<br />"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:153
msgid "SERIES: %s [%s]<br />"
msgstr "SERIER: %s [%s]<br />"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:233
msgid "Books in your library"
msgstr "Bøger i dit bibliotek"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:239
msgid "By "
msgstr "Af/efter "
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:240
msgid "Books sorted by "
msgstr "Bøger sorteret efter "
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Newest"
msgstr "Nyeste"

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n"
"PO-Revision-Date: 2010-08-20 02:58+0000\n"
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-20 22:07+0000\n"
"Last-Translator: Eleftherios Kosmas <elkosmas@gmail.com>\n"
"Language-Team: Greek <el@li.org>\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-20 03:34+0000\n"
"X-Launchpad-Export-Date: 2010-08-22 03:44+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -27,7 +27,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:506
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:507
#: /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
@ -136,10 +136,10 @@ msgstr "Δεν κάνει τίποτα"
#: /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:1885
#: /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:134
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /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/utils/podofo/__init__.py:46
@ -755,7 +755,11 @@ msgstr "Επικοινωνία με το Booq Avant"
msgid "Communicate with the Sweex MM300"
msgstr "Επικοινωνία με το Sweex MM300"
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:78
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
msgid "Communicate with the Kogan"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
msgid "Communicate with the Pandigital Novel"
msgstr "Επικοινωνία με το Pandigital Novel"
@ -799,7 +803,7 @@ msgstr ""
"Κατάλογος πεδίων συνδεδομένων, χωρισμένων με κόμμα, στη συσκευή, προς "
"μετατροπή σε συλλογές. Οι πιθανότητες συμπεριλαμβάνουν: "
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:144
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed"
msgstr "Χωρίς όνομα"
@ -1636,7 +1640,11 @@ msgstr ""
msgid "Creating"
msgstr "Δημιουργία"
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:18
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
msgid "Failed to parse: %s with error: %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
msgid "ePub Fixer"
msgstr ""
@ -1652,7 +1660,7 @@ msgid ""
"cause significant changes to your epub, complain to the epubcheck project."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:19
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:21
msgid ""
"%prog [options] file.epub\n"
"\n"
@ -1663,7 +1671,7 @@ msgid ""
"detected. Use the options to control which errors are automatically fixed."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:50
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:52
msgid "You must specify an epub file"
msgstr ""
@ -1994,7 +2002,7 @@ msgstr ""
#: /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:550
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569
msgid "Title"
msgstr ""
@ -3037,6 +3045,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98
#: /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
@ -3110,7 +3119,8 @@ 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/library/server/opds.py:108
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:62
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d books"
msgstr ""
@ -3175,14 +3185,45 @@ msgstr ""
msgid "Starting conversion of %d book(s)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:15
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63
msgid "Copy to library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64
msgid "Copy selected books to the specified library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97
msgid "Cannot copy"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102
msgid "No library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103
msgid "No library found at %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110
msgid "Copying"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
msgid "Could not copy books: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr "Απέτυχε"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123
msgid "Copied %d books to %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del"
msgstr "Διαγραφή"
@ -3596,35 +3637,35 @@ msgstr ""
msgid "Similar books..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Alt+A"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Books by same author"
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+S"
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 in this series"
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 "Alt+P"
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 by this publisher"
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+T"
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 "Books with the same tags"
msgstr ""
@ -3825,6 +3866,10 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636
#: /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:690
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100
#: /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:105
#: /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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
@ -3987,6 +4032,7 @@ msgstr "έξοδος"
#: /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:93
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107
@ -5198,11 +5244,6 @@ msgstr ""
msgid "Select folder to open as device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr "Απέτυχε"
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device"
msgstr ""
@ -6295,7 +6336,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:889
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Date"
msgstr "Ημερομηνία"
@ -6473,6 +6514,63 @@ msgstr ""
msgid "Downloading social metadata, please wait..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50
msgid "Separator"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63
msgid "Choose library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113
msgid "The main toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114
msgid "The main toolbar when a device is connected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115
msgid "The context menu for the books in the calibre library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117
msgid "The context menu for the books on the device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94
msgid "Customize the actions in:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95
msgid "A&vailable actions"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96
msgid "&Current actions"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97
msgid "Move selected action up"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99
msgid "Move selected action down"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
msgid "Ctrl+S"
msgstr "Ctrl+Ε"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102
msgid "Add selected actions to toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104
msgid "Remove selected actions from toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again"
msgstr ""
@ -7396,10 +7494,6 @@ msgstr ""
msgid "Rename the item in every book where it is used."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
msgid "Ctrl+S"
msgstr "Ctrl+Ε"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings"
msgstr ""
@ -7678,48 +7772,48 @@ msgstr ""
msgid "Regular expression (?P<isbn>)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105
msgid "Cover Browser"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110
msgid "Shift+Alt+B"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124
msgid "Tag Browser"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126
msgid "Shift+Alt+T"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
msgid "version"
msgstr "έκδοση"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147
msgid "created by Kovid Goyal"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:164
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:165
msgid "Connected "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:173
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:174
msgid "Update found"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:219
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220
msgid "Alt+D"
msgstr "Alt+Π"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:229
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230
msgid "Shift+Alt+D"
msgstr ""
@ -7791,7 +7885,7 @@ msgid "Eject this device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:194
msgid "Library"
msgstr "Βιβλιοθήκη"
@ -9780,7 +9874,52 @@ msgstr ""
msgid "Error: You must specify a column label"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:809
#: /home/kovid/work/calibre/src/calibre/library/cli.py:803
msgid ""
"\n"
" %prog saved_searches [options] list\n"
" %prog saved_searches add name search\n"
" %prog saved_searches remove name\n"
"\n"
" Manage the saved searches stored in this database.\n"
" If you try to add a query with a name that already exists, it will be\n"
" replaced.\n"
" "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
msgid "Error: You must specify an action (add|remove|list)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:829
msgid "Name:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:830
msgid "Search string:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:836
msgid "Error: You must specify a name and a search string"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:839
msgid "added"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:844
msgid "Error: You must specify a name"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:847
msgid "removed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:851
msgid "Error: Action %s not recognized, must be one of: (add|remove|list)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:865
msgid ""
"%%prog command [options] [arguments]\n"
"\n"
@ -9810,27 +9949,27 @@ msgstr ""
msgid "Main"
msgstr "Κύριο"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1911
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1915
msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1940
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1944
msgid "Copying <b>%s</b>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1957
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1961
msgid "Compacting database"
msgstr "Συμπίεση βάσης δεδομένων"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2050
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2054
msgid "Checking SQL integrity..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2091
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2095
msgid "Checking for missing files."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2113
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2117
msgid "Checked id"
msgstr ""
@ -10026,35 +10165,39 @@ msgid ""
"overrides any per-library settings specified in the GUI"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d book"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:129
msgid "%d items"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:146
msgid "RATING: %s<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:149
msgid "TAGS: %s<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:153
msgid "SERIES: %s [%s]<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:233
msgid "Books in your library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:239
msgid "By "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:240
msgid "Books sorted by "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Newest"
msgstr "Νεώτερη"

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n"
"PO-Revision-Date: 2010-08-19 22:29+0000\n"
"Last-Translator: Bingen Markes <Unknown>\n"
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-20 21:29+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Basque <eu@li.org>\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-20 03:34+0000\n"
"X-Launchpad-Export-Date: 2010-08-21 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -27,7 +27,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:506
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:507
#: /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
@ -136,10 +136,10 @@ msgstr "Ez du ezer egiten"
#: /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:1885
#: /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:134
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /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/utils/podofo/__init__.py:46
@ -772,7 +772,11 @@ msgstr "Jar zaitez harremanetan \"Booq Avant\" horrekin."
msgid "Communicate with the Sweex MM300"
msgstr "Jar zaitez harremanetan \"Sweex MM300\" horrekin."
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:78
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
msgid "Communicate with the Kogan"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
msgid "Communicate with the Pandigital Novel"
msgstr "Jar zaitez harremanetan \"Pandigital Novel\" horrekin."
@ -816,7 +820,7 @@ msgstr ""
"Komez bereiziriko meta-datuen eremuen zerrenda gailuan bildumak bihurtzeko "
"modukoak. Aukeren artean hauek: "
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:144
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed"
msgstr "Identifikatu gabea"
@ -1756,7 +1760,11 @@ msgstr ""
msgid "Creating"
msgstr "Sortzen"
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:18
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
msgid "Failed to parse: %s with error: %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
msgid "ePub Fixer"
msgstr "ePub Fixer (ePUB formatuan doitzeko tresna)"
@ -1778,7 +1786,7 @@ msgstr ""
"fitxategiari aldaketa nabarmenak ekar liezazkioke... Horrela izan bada, "
"kexak \"ePUB Project\" horretara bideratu."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:19
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:21
msgid ""
"%prog [options] file.epub\n"
"\n"
@ -1797,7 +1805,7 @@ msgstr ""
"detektaturiko akats bakoitzari buruzko mezu bana. Erabil itzazu aukerak "
"kontrolatzeko zeintzuk akats izan dira automatikoki eraldatuak."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:50
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:52
msgid "You must specify an epub file"
msgstr "ePUB fitxategi bat zehaztu beharko duzu"
@ -2129,6 +2137,7 @@ msgstr ""
"%prog [options] mybook.lrf\n"
"\n"
"\n"
"\n"
"Erakutsi/Editatu metadatuak LRF fitxategian.\n"
"\n"
@ -2219,7 +2228,7 @@ msgstr "Komikia"
#: /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:550
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569
msgid "Title"
msgstr "Izenburua"
@ -3442,6 +3451,7 @@ msgstr "Liburutegi nagusian erabiltzaileak sortu dituen oharrak bakarrik"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98
#: /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
@ -3517,7 +3527,8 @@ msgid "Select destination for %s.%s"
msgstr "Aukeratu helburua honentzat: %s.%s"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:108
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:62
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d books"
msgstr "%d books"
@ -3586,14 +3597,45 @@ msgstr "Ezin da bihurtu"
msgid "Starting conversion of %d book(s)"
msgstr "%d liburu(ar)en bihurketa abiatzen"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:15
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63
msgid "Copy to library"
msgstr "Liburutegira kopiatu."
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64
msgid "Copy selected books to the specified library"
msgstr "Kopiatu hautatutako liburuak adierazitako liburutegian"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97
msgid "Cannot copy"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102
msgid "No library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103
msgid "No library found at %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110
msgid "Copying"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
msgid "Could not copy books: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr "Huts egin du"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123
msgid "Copied %d books to %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del"
msgstr "Del"
@ -4028,35 +4070,35 @@ msgstr "No detailed information is available for books on the device."
msgid "Similar books..."
msgstr "Similar books..."
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Alt+A"
msgstr "Alt+A"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Books by same author"
msgstr "Books by same author"
#: /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+S"
msgstr "Alt+S"
#: /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 in this series"
msgstr "Books in this series"
#: /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 "Alt+P"
msgstr "Alt+P"
#: /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 by this publisher"
msgstr "Books by this publisher"
#: /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+T"
msgstr "Alt+T"
#: /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 "Books with the same tags"
msgstr "Books with the same tags"
@ -4278,6 +4320,10 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636
#: /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:690
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100
#: /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:105
#: /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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
@ -4445,6 +4491,7 @@ msgstr "outputa, helburua"
#: /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:93
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107
@ -5727,11 +5774,6 @@ msgstr "Irakurgailuarekin komunikatzeko saioak huts egin du"
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:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr "Huts egin du"
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device"
msgstr "Akatsen bat irakurgailuarekin komunikatzerakoan"
@ -6899,7 +6941,7 @@ msgstr "Number"
#: /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:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Date"
msgstr "Date"
@ -7092,6 +7134,63 @@ msgstr "Available variables:"
msgid "Downloading social metadata, please wait..."
msgstr "Downloading social metadata, please wait..."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50
msgid "Separator"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63
msgid "Choose library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113
msgid "The main toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114
msgid "The main toolbar when a device is connected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115
msgid "The context menu for the books in the calibre library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117
msgid "The context menu for the books on the device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94
msgid "Customize the actions in:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95
msgid "A&vailable actions"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96
msgid "&Current actions"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97
msgid "Move selected action up"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99
msgid "Move selected action down"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
msgid "Ctrl+S"
msgstr "Ctrl+S"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102
msgid "Add selected actions to toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104
msgid "Remove selected actions from toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again"
msgstr "&Show this warning again"
@ -8057,10 +8156,6 @@ msgstr ""
msgid "Rename the item in every book where it is used."
msgstr "Rename the item in every book where it is used."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
msgid "Ctrl+S"
msgstr "Ctrl+S"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings"
msgstr "Test email settings"
@ -8371,48 +8466,48 @@ msgstr "ISBN:"
msgid "Regular expression (?P<isbn>)"
msgstr "Regular expression (?P<isbn>)"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105
msgid "Cover Browser"
msgstr "Cover Browser"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110
msgid "Shift+Alt+B"
msgstr "Shift+Alt+B"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124
msgid "Tag Browser"
msgstr "Tag Browser"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126
msgid "Shift+Alt+T"
msgstr "Shift+Alt+T"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
msgid "version"
msgstr "version"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147
msgid "created by Kovid Goyal"
msgstr "created by Kovid Goyal"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:164
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:165
msgid "Connected "
msgstr "Connected "
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:173
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:174
msgid "Update found"
msgstr "Update found"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details"
msgstr "Book Details"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:219
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220
msgid "Alt+D"
msgstr "Alt+D"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:229
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230
msgid "Shift+Alt+D"
msgstr "Shift+Alt+D"
@ -8484,7 +8579,7 @@ msgid "Eject this device"
msgstr "Eject this device"
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:194
msgid "Library"
msgstr "Library"
@ -10744,7 +10839,52 @@ msgstr "Do not ask for confirmation"
msgid "Error: You must specify a column label"
msgstr "Error: You must specify a column label"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:809
#: /home/kovid/work/calibre/src/calibre/library/cli.py:803
msgid ""
"\n"
" %prog saved_searches [options] list\n"
" %prog saved_searches add name search\n"
" %prog saved_searches remove name\n"
"\n"
" Manage the saved searches stored in this database.\n"
" If you try to add a query with a name that already exists, it will be\n"
" replaced.\n"
" "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
msgid "Error: You must specify an action (add|remove|list)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:829
msgid "Name:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:830
msgid "Search string:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:836
msgid "Error: You must specify a name and a search string"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:839
msgid "added"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:844
msgid "Error: You must specify a name"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:847
msgid "removed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:851
msgid "Error: Action %s not recognized, must be one of: (add|remove|list)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:865
msgid ""
"%%prog command [options] [arguments]\n"
"\n"
@ -10784,27 +10924,27 @@ msgstr "%sAverage rating is %3.1f"
msgid "Main"
msgstr "Main"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1911
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1915
msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "<p>Migrating old database to ebook library in %s<br><center>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1940
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1944
msgid "Copying <b>%s</b>"
msgstr "Copying <b>%s</b>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1957
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1961
msgid "Compacting database"
msgstr "Compacting database"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2050
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2054
msgid "Checking SQL integrity..."
msgstr "Checking SQL integrity..."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2091
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2095
msgid "Checking for missing files."
msgstr "Checking for missing files."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2113
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2117
msgid "Checked id"
msgstr "Checked id"
@ -11036,35 +11176,39 @@ msgid ""
"overrides any per-library settings specified in the GUI"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d book"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:129
msgid "%d items"
msgstr "%d items"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:146
msgid "RATING: %s<br />"
msgstr "RATING: %s<br />"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:149
msgid "TAGS: %s<br />"
msgstr "TAGS: %s<br />"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:153
msgid "SERIES: %s [%s]<br />"
msgstr "SERIES: %s [%s]<br />"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:233
msgid "Books in your library"
msgstr "Books in your library"
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:239
msgid "By "
msgstr "By "
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:240
msgid "Books sorted by "
msgstr "Books sorted by "
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Newest"
msgstr "Newest"

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n"
"PO-Revision-Date: 2010-08-20 00:46+0000\n"
"Last-Translator: Marcos X. <Unknown>\n"
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-20 22:29+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Galician <gl@li.org>\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-20 03:34+0000\n"
"X-Launchpad-Export-Date: 2010-08-22 03:44+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -27,7 +27,7 @@ msgstr "Non facer nada"
#: /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:506
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:507
#: /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
@ -136,10 +136,10 @@ msgstr "Non facer nada"
#: /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:1885
#: /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:134
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /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/utils/podofo/__init__.py:46
@ -762,7 +762,11 @@ msgstr "Comunicar co Booq Avant"
msgid "Communicate with the Sweex MM300"
msgstr "Conectar co Sweex MM300"
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:78
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
msgid "Communicate with the Kogan"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
msgid "Communicate with the Pandigital Novel"
msgstr "Conectar co Pandigital Novel"
@ -806,7 +810,7 @@ msgstr ""
"Lista separada por comas de campos de metadatos para convertelos en "
"coleccións no dispositivo. As posibilidades son: "
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:144
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed"
msgstr "Sen nome"
@ -1690,7 +1694,11 @@ msgstr "Aplicando transformacións ao libro electrónico..."
msgid "Creating"
msgstr "A crear"
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:18
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
msgid "Failed to parse: %s with error: %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
msgid "ePub Fixer"
msgstr "Corrector de ePub"
@ -1711,7 +1719,7 @@ msgstr ""
"provoar mudanzas significantes no epub. Dirixa as súas queixas ao proxecto "
"epubcheck."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:19
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:21
msgid ""
"%prog [options] file.epub\n"
"\n"
@ -1722,7 +1730,7 @@ msgid ""
"detected. Use the options to control which errors are automatically fixed."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:50
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:52
msgid "You must specify an epub file"
msgstr "Debe especificar un ficheiro de epub"
@ -2115,7 +2123,7 @@ msgstr "Cómic"
#: /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:550
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569
msgid "Title"
msgstr "Título"
@ -3324,6 +3332,7 @@ msgstr "Usar as anotacións xeradas só dende a biblioteca principal"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98
#: /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
@ -3399,7 +3408,8 @@ msgid "Select destination for %s.%s"
msgstr "Escoller o destino para %s %s"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:108
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:62
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d books"
msgstr "%d libros"
@ -3466,14 +3476,45 @@ msgstr "Non se pode converter"
msgid "Starting conversion of %d book(s)"
msgstr "Esta a comezar a conversión de %d libros(s)"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:15
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63
msgid "Copy to library"
msgstr "Copiar á biblioteca"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64
msgid "Copy selected books to the specified library"
msgstr "Copiar os libros seleccionados á biblioteca especificada"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97
msgid "Cannot copy"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102
msgid "No library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103
msgid "No library found at %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110
msgid "Copying"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
msgid "Could not copy books: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr "Fallou"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123
msgid "Copied %d books to %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del"
msgstr "Supr"
@ -3902,35 +3943,35 @@ msgstr "Non hai dispoñíbel información detallada dos libros no dispositivo."
msgid "Similar books..."
msgstr "Libros semellantes..."
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Alt+A"
msgstr "Alt+A"
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Books by same author"
msgstr "Libros coa mesma autoría"
#: /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+S"
msgstr "Alt+S"
#: /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 in this series"
msgstr "Libros con esta serie"
#: /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 "Alt+P"
msgstr "Alt+P"
#: /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 by this publisher"
msgstr "Libros por editorial"
#: /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+T"
msgstr "Alt+T"
#: /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 "Books with the same tags"
msgstr "Libros coas mesmas etiquetas"
@ -4150,6 +4191,10 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636
#: /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:690
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100
#: /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:105
#: /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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
@ -4316,6 +4361,7 @@ msgstr "saída"
#: /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:93
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107
@ -5561,11 +5607,6 @@ msgstr "Erro ao conectar co dispositivo"
msgid "Select folder to open as device"
msgstr "Escoller o cartafol para abrir co como dispositivo"
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr "Fallou"
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device"
msgstr "Erro ao conectar co dispositivo"
@ -6749,7 +6790,7 @@ msgstr "Número"
#: /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:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Date"
msgstr "Data"
@ -6941,6 +6982,63 @@ msgstr "Variábeis dispoñíbeis"
msgid "Downloading social metadata, please wait..."
msgstr "A descargar os metadatos sociais, agarde..."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50
msgid "Separator"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63
msgid "Choose library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113
msgid "The main toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114
msgid "The main toolbar when a device is connected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115
msgid "The context menu for the books in the calibre library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117
msgid "The context menu for the books on the device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94
msgid "Customize the actions in:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95
msgid "A&vailable actions"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96
msgid "&Current actions"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97
msgid "Move selected action up"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99
msgid "Move selected action down"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
msgid "Ctrl+S"
msgstr "Ctrl + S"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102
msgid "Add selected actions to toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104
msgid "Remove selected actions from toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again"
msgstr "&Amosar este aviso outra vez"
@ -7913,10 +8011,6 @@ msgstr ""
msgid "Rename the item in every book where it is used."
msgstr "Cambiar o nome ao elemento en cada libro que o emprega."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
msgid "Ctrl+S"
msgstr "Ctrl + S"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings"
msgstr "Probar a configuración do correo de proba"
@ -8231,48 +8325,48 @@ msgstr "ISBN:"
msgid "Regular expression (?P<isbn>)"
msgstr "Expresión regular (?P<isbn>)"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105
msgid "Cover Browser"
msgstr "Navegador de capas"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110
msgid "Shift+Alt+B"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124
msgid "Tag Browser"
msgstr "Navegador de etiquetas"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126
msgid "Shift+Alt+T"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
msgid "version"
msgstr "versión"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147
msgid "created by Kovid Goyal"
msgstr "creado por Kovid Goyal"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:164
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:165
msgid "Connected "
msgstr "Conectado "
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:173
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:174
msgid "Update found"
msgstr "Actualización atopada"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details"
msgstr "Detalles do libro"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:219
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220
msgid "Alt+D"
msgstr "Alt+D"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:229
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230
msgid "Shift+Alt+D"
msgstr ""
@ -8344,7 +8438,7 @@ msgid "Eject this device"
msgstr "Extraer o dispositivo"
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:194
msgid "Library"
msgstr "Biblioteca"
@ -10360,7 +10454,52 @@ msgstr ""
msgid "Error: You must specify a column label"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:809
#: /home/kovid/work/calibre/src/calibre/library/cli.py:803
msgid ""
"\n"
" %prog saved_searches [options] list\n"
" %prog saved_searches add name search\n"
" %prog saved_searches remove name\n"
"\n"
" Manage the saved searches stored in this database.\n"
" If you try to add a query with a name that already exists, it will be\n"
" replaced.\n"
" "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
msgid "Error: You must specify an action (add|remove|list)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:829
msgid "Name:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:830
msgid "Search string:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:836
msgid "Error: You must specify a name and a search string"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:839
msgid "added"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:844
msgid "Error: You must specify a name"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:847
msgid "removed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:851
msgid "Error: Action %s not recognized, must be one of: (add|remove|list)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:865
msgid ""
"%%prog command [options] [arguments]\n"
"\n"
@ -10390,27 +10529,27 @@ msgstr ""
msgid "Main"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1911
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1915
msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1940
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1944
msgid "Copying <b>%s</b>"
msgstr "A copiar <b>%s</b>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1957
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1961
msgid "Compacting database"
msgstr "A compactar a base de datos"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2050
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2054
msgid "Checking SQL integrity..."
msgstr "A comprobar a integridade SQL..."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2091
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2095
msgid "Checking for missing files."
msgstr "A comprobar os ficheiros perdidos."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2113
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2117
msgid "Checked id"
msgstr "id comprobada"
@ -10606,35 +10745,39 @@ msgid ""
"overrides any per-library settings specified in the GUI"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d book"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:129
msgid "%d items"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:146
msgid "RATING: %s<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:149
msgid "TAGS: %s<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:153
msgid "SERIES: %s [%s]<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:233
msgid "Books in your library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:239
msgid "By "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:240
msgid "Books sorted by "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Newest"
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

10449
src/calibre/translations/mr.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n"
"PO-Revision-Date: 2010-08-19 10:53+0000\n"
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-20 22:26+0000\n"
"Last-Translator: ppanhh <ppanhh@gmail.com>\n"
"Language-Team: Vietnamese <vi@li.org>\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-20 03:34+0000\n"
"X-Launchpad-Export-Date: 2010-08-22 03:46+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -27,7 +27,7 @@ msgstr "hoàn toàn không thực thi"
#: /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:506
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:507
#: /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
@ -136,10 +136,10 @@ msgstr "hoàn toàn không thực thi"
#: /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:1885
#: /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:134
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /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/utils/podofo/__init__.py:46
@ -750,7 +750,11 @@ msgstr ""
msgid "Communicate with the Sweex MM300"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:78
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
msgid "Communicate with the Kogan"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
msgid "Communicate with the Pandigital Novel"
msgstr ""
@ -792,7 +796,7 @@ msgid ""
"device. Possibilities include: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:144
#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:145
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed"
msgstr "Chưa được đặt tên"
@ -1539,7 +1543,11 @@ msgstr ""
msgid "Creating"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:18
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
msgid "Failed to parse: %s with error: %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
msgid "ePub Fixer"
msgstr ""
@ -1555,7 +1563,7 @@ msgid ""
"cause significant changes to your epub, complain to the epubcheck project."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:19
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:21
msgid ""
"%prog [options] file.epub\n"
"\n"
@ -1566,7 +1574,7 @@ msgid ""
"detected. Use the options to control which errors are automatically fixed."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:50
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:52
msgid "You must specify an epub file"
msgstr ""
@ -1899,7 +1907,7 @@ msgstr ""
#: /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:550
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569
msgid "Title"
msgstr "Tựa"
@ -2965,6 +2973,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:85
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98
#: /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
@ -3038,7 +3047,8 @@ 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/library/server/opds.py:108
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:62
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d books"
msgstr ""
@ -3103,14 +3113,45 @@ msgstr ""
msgid "Starting conversion of %d book(s)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:15
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63
msgid "Copy to library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64
msgid "Copy selected books to the specified library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97
msgid "Cannot copy"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102
msgid "No library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103
msgid "No library found at %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110
msgid "Copying"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
msgid "Could not copy books: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123
msgid "Copied %d books to %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del"
msgstr ""
@ -3524,35 +3565,35 @@ msgstr ""
msgid "Similar books..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Alt+A"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:22
#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:23
msgid "Books by same author"
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+S"
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 in this series"
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 "Alt+P"
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 by this publisher"
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+T"
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 "Books with the same tags"
msgstr ""
@ -3753,6 +3794,10 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636
#: /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:690
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:98
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:100
#: /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:105
#: /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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
@ -3915,6 +3960,7 @@ msgstr ""
#: /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:93
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107
@ -5126,11 +5172,6 @@ msgstr ""
msgid "Select folder to open as device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:231
msgid "Failed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device"
msgstr ""
@ -6223,7 +6264,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:889
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Date"
msgstr ""
@ -6401,6 +6442,63 @@ msgstr ""
msgid "Downloading social metadata, please wait..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50
msgid "Separator"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63
msgid "Choose library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113
msgid "The main toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114
msgid "The main toolbar when a device is connected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115
msgid "The context menu for the books in the calibre library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117
msgid "The context menu for the books on the device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94
msgid "Customize the actions in:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95
msgid "A&vailable actions"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96
msgid "&Current actions"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97
msgid "Move selected action up"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99
msgid "Move selected action down"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101
#: /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:102
msgid "Add selected actions to toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104
msgid "Remove selected actions from toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again"
msgstr ""
@ -7325,10 +7423,6 @@ msgstr ""
msgid "Rename the item in every book where it is used."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
msgid "Ctrl+S"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings"
msgstr ""
@ -7607,48 +7701,48 @@ msgstr ""
msgid "Regular expression (?P<isbn>)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105
msgid "Cover Browser"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110
msgid "Shift+Alt+B"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:124
msgid "Tag Browser"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:126
msgid "Shift+Alt+T"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
msgid "version"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:147
msgid "created by Kovid Goyal"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:164
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:165
msgid "Connected "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:173
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:174
msgid "Update found"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:219
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:220
msgid "Alt+D"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:229
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:230
msgid "Shift+Alt+D"
msgstr ""
@ -7720,7 +7814,7 @@ msgid "Eject this device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:192
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:194
msgid "Library"
msgstr ""
@ -9709,7 +9803,52 @@ msgstr ""
msgid "Error: You must specify a column label"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:809
#: /home/kovid/work/calibre/src/calibre/library/cli.py:803
msgid ""
"\n"
" %prog saved_searches [options] list\n"
" %prog saved_searches add name search\n"
" %prog saved_searches remove name\n"
"\n"
" Manage the saved searches stored in this database.\n"
" If you try to add a query with a name that already exists, it will be\n"
" replaced.\n"
" "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
msgid "Error: You must specify an action (add|remove|list)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:829
msgid "Name:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:830
msgid "Search string:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:836
msgid "Error: You must specify a name and a search string"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:839
msgid "added"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:844
msgid "Error: You must specify a name"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:847
msgid "removed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:851
msgid "Error: Action %s not recognized, must be one of: (add|remove|list)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:865
msgid ""
"%%prog command [options] [arguments]\n"
"\n"
@ -9739,27 +9878,27 @@ msgstr ""
msgid "Main"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1911
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1915
msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1940
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1944
msgid "Copying <b>%s</b>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1957
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1961
msgid "Compacting database"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2050
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2054
msgid "Checking SQL integrity..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2091
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2095
msgid "Checking for missing files."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2113
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2117
msgid "Checked id"
msgstr ""
@ -9955,35 +10094,39 @@ msgid ""
"overrides any per-library settings specified in the GUI"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:127
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
msgid "%d book"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:129
msgid "%d items"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:144
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:146
msgid "RATING: %s<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:147
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:149
msgid "TAGS: %s<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:151
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:153
msgid "SERIES: %s [%s]<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:231
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:233
msgid "Books in your library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:237
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:239
msgid "By "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:238
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:240
msgid "Books sorted by "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:549
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
msgid "Newest"
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -496,6 +496,7 @@ class DynamicConfig(dict):
def __init__(self, name='dynamic'):
dict.__init__(self, {})
self.name = name
self.defaults = {}
self.file_path = os.path.join(config_dir, name+'.pickle')
self.refresh()
@ -520,7 +521,13 @@ class DynamicConfig(dict):
try:
return dict.__getitem__(self, key)
except KeyError:
return None
return self.defaults.get(key, None)
def get(self, key, default=None):
try:
return dict.__getitem__(self, key)
except KeyError:
return self.defaults.get(key, default)
def __setitem__(self, key, val):
dict.__setitem__(self, key, val)
@ -555,6 +562,7 @@ class XMLConfig(dict):
def __init__(self, rel_path_to_cf_file):
dict.__init__(self)
self.defaults = {}
self.file_path = os.path.join(config_dir,
*(rel_path_to_cf_file.split('/')))
self.file_path = os.path.abspath(self.file_path)
@ -592,7 +600,16 @@ class XMLConfig(dict):
ans = ans.data
return ans
except KeyError:
return None
return self.defaults.get(key, None)
def get(self, key, default=None):
try:
ans = dict.__getitem__(self, key)
if isinstance(ans, plistlib.Data):
ans = ans.data
return ans
except KeyError:
return self.defaults.get(key, default)
def __setitem__(self, key, val):
if isinstance(val, (bytes, str)):
@ -604,6 +621,7 @@ class XMLConfig(dict):
self.__setitem__(key, val)
def __delitem__(self, key):
if dict.has_key(self, key):
dict.__delitem__(self, key)
self.commit()
@ -648,7 +666,16 @@ class JSONConfig(XMLConfig):
return json.dumps(self, indent=2, default=to_json)
def __getitem__(self, key):
try:
return dict.__getitem__(self, key)
except KeyError:
return self.defaults[key]
def get(self, key, default=None):
try:
return dict.__getitem__(self, key)
except KeyError:
return self.defaults.get(key, default)
def __setitem__(self, key, val):
dict.__setitem__(self, key, val)