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. # title within authors.
sort_columns_at_startup = None 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 # A string controlling how the publication date is displayed in the GUI
# d the day as number without a leading zero (1 to 31) # d the day as number without a leading zero (1 to 31)
# dd the day as number with a leading zero (01 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 # 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 # MMM yyyy ==> Jan 2010 yyyy ==> 2010 dd MMM yyyy ==> 09 Jan 2010
# MM/yyyy ==> 01/2010 d/M/yy ==> 9/1/10 yy ==> 10 # 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_pubdate_display_format = 'MMM yyyy'
gui_timestamp_display_format = 'dd MMM yyyy'
# Control title and series sorting in the library view. # Control title and series sorting in the library view.
# If set to 'library_order', Leading articles such as The and A will be ignored. # If set to '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, CFBundleName=APPNAME,
CFBundleIdentifier='net.kovidgoyal.calibre', CFBundleIdentifier='net.kovidgoyal.calibre',
CFBundleVersion=VERSION, CFBundleVersion=VERSION,
CFBundleShortVersionString=VERSION,
CFBundlePackageType='APPL', CFBundlePackageType='APPL',
CFBundleSignature='????', CFBundleSignature='????',
CFBundleExecutable='calibre', CFBundleExecutable='calibre',

View File

@ -8,7 +8,7 @@ from calibre.constants import numeric_version
from calibre.ptempfile import PersistentTemporaryFile from calibre.ptempfile import PersistentTemporaryFile
class Plugin(object): class Plugin(object): # {{{
''' '''
A calibre plugin. Useful members include: A calibre plugin. Useful members include:
@ -147,9 +147,9 @@ class Plugin(object):
if hasattr(it, '__exit__'): if hasattr(it, '__exit__'):
it.__exit__(*args) it.__exit__(*args)
# }}}
class FileTypePlugin(Plugin): # {{{
class FileTypePlugin(Plugin):
''' '''
A plugin that is associated with a particular set of file types. A plugin that is associated with a particular set of file types.
''' '''
@ -191,7 +191,9 @@ class FileTypePlugin(Plugin):
# Default implementation does nothing # Default implementation does nothing
return path_to_ebook return path_to_ebook
class MetadataReaderPlugin(Plugin): # }}}
class MetadataReaderPlugin(Plugin): # {{{
''' '''
A plugin that implements reading metadata from a set of file types. 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: A :class:`calibre.ebooks.metadata.MetaInformation` object
''' '''
return None return None
# }}}
class MetadataWriterPlugin(Plugin): class MetadataWriterPlugin(Plugin): # {{{
''' '''
A plugin that implements reading metadata from a set of file types. A plugin that implements reading metadata from a set of file types.
''' '''
@ -249,7 +252,9 @@ class MetadataWriterPlugin(Plugin):
''' '''
pass pass
class CatalogPlugin(Plugin): # }}}
class CatalogPlugin(Plugin): # {{{
''' '''
A plugin that implements a catalog generator. A plugin that implements a catalog generator.
''' '''
@ -352,7 +357,9 @@ class CatalogPlugin(Plugin):
raise NotImplementedError('CatalogPlugin.generate_catalog() default ' raise NotImplementedError('CatalogPlugin.generate_catalog() default '
'method, should be overridden in subclass') 'method, should be overridden in subclass')
class InterfaceActionBase(Plugin): # }}}
class InterfaceActionBase(Plugin): # {{{
supported_platforms = ['windows', 'osx', 'linux'] supported_platforms = ['windows', 'osx', 'linux']
author = 'Kovid Goyal' author = 'Kovid Goyal'
@ -360,3 +367,44 @@ class InterfaceActionBase(Plugin):
can_be_disabled = False can_be_disabled = False
actual_plugin = None 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, \ from calibre.customize import Plugin, CatalogPlugin, FileTypePlugin, \
MetadataReaderPlugin, MetadataWriterPlugin, \ MetadataReaderPlugin, MetadataWriterPlugin, \
InterfaceActionBase as InterfaceAction InterfaceActionBase as InterfaceAction, \
PreferencesPlugin
from calibre.customize.conversion import InputFormatPlugin, OutputFormatPlugin from calibre.customize.conversion import InputFormatPlugin, OutputFormatPlugin
from calibre.customize.profiles import InputProfile, OutputProfile from calibre.customize.profiles import InputProfile, OutputProfile
from calibre.customize.builtins import plugins as builtin_plugins from calibre.customize.builtins import plugins as builtin_plugins
@ -257,6 +258,17 @@ def interface_actions():
yield plugin 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 read/write {{{
_metadata_readers = {} _metadata_readers = {}
_metadata_writers = {} _metadata_writers = {}

View File

@ -20,7 +20,7 @@ class ANDROID(USBMS):
VENDOR_ID = { VENDOR_ID = {
# HTC # HTC
0x0bb4 : { 0x0c02 : [0x100, 0x0227], 0x0c01 : [0x100, 0x0227], 0x0ff9 0x0bb4 : { 0x0c02 : [0x100, 0x0227], 0x0c01 : [0x100, 0x0227], 0x0ff9
: [0x0100, 0x0227, 0x0226]}, : [0x0100, 0x0227, 0x0226], 0x0c87: [0x0100, 0x0227, 0x0226]},
# Motorola # Motorola
0x22b8 : { 0x41d9 : [0x216], 0x2d67 : [0x100], 0x41db : [0x216], 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.') description = _('Use an arbitrary folder as a device.')
author = 'John Schember/Charles Haley' author = 'John Schember/Charles Haley'
supported_platforms = ['windows', 'osx', 'linux'] 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 VENDOR_ID = 0xffff
PRODUCT_ID = 0xffff PRODUCT_ID = 0xffff
BCD = 0xffff BCD = 0xffff
@ -30,7 +30,7 @@ class FOLDER_DEVICE(USBMS):
description = _('Use an arbitrary folder as a device.') description = _('Use an arbitrary folder as a device.')
author = 'John Schember/Charles Haley' author = 'John Schember/Charles Haley'
supported_platforms = ['windows', 'osx', 'linux'] 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 VENDOR_ID = 0xffff
PRODUCT_ID = 0xffff PRODUCT_ID = 0xffff

View File

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

View File

@ -491,7 +491,7 @@ class HTMLInput(InputFormatPlugin):
return (None, raw) return (None, raw)
def preprocess_html(self, html): def preprocess_html(self, html):
print "********* Preprocessing HTML *********\n" self.log("********* Preprocessing HTML *********")
# Detect Chapters to match the xpath in the GUI # 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) 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) 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 # Insert extra line feeds so the line length regex functions properly
html = re.sub(r"</p>", "</p>\n", html) html = re.sub(r"</p>", "</p>\n", html)
length = line_length('html', html, 0.4) 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) 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: if length < 150:
html = unwrap.sub(' ', html) html = unwrap.sub(' ', html)

View File

@ -22,6 +22,7 @@ class LITInput(InputFormatPlugin):
accelerators): accelerators):
from calibre.ebooks.lit.reader import LitReader from calibre.ebooks.lit.reader import LitReader
from calibre.ebooks.conversion.plumber import create_oebbook from calibre.ebooks.conversion.plumber import create_oebbook
self.log = log
return create_oebbook(log, stream, options, self, reader=LitReader) return create_oebbook(log, stream, options, self, reader=LitReader)
def postprocess_book(self, oeb, opts, log): def postprocess_book(self, oeb, opts, log):
@ -54,7 +55,7 @@ class LITInput(InputFormatPlugin):
def preprocess_html(self, html): def preprocess_html(self, html):
print "********* Preprocessing HTML *********\n" self.log("********* Preprocessing HTML *********")
# Detect Chapters to match the xpath in the GUI # 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) 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) 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 # Insert extra line feeds so the line length regex functions properly
html = re.sub(r"</p>", "</p>\n", html) html = re.sub(r"</p>", "</p>\n", html)
length = line_length('html', html, 0.4) 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) 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: if length < 150:
html = unwrap.sub(' ', html) html = unwrap.sub(' ', html)

View File

@ -46,8 +46,12 @@ def authors_to_sort_string(authors):
return ' & '.join(map(author_to_author_sort, authors)) return ' & '.join(map(author_to_author_sort, authors))
_title_pat = re.compile('^(A|The|An)\s+', re.IGNORECASE) _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): def title_sort(title):
title = title.strip()
if title and title[0] in _ignore_starts:
title = title[1:]
match = _title_pat.search(title) match = _title_pat.search(title)
if match: if match:
prep = match.group(1) prep = match.group(1)

View File

@ -168,12 +168,18 @@ class Stylizer(object):
item.href)) item.href))
continue continue
stylesheets.append(sitem.data) 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: if x:
text = XHTML_CSS_NAMESPACE + x try:
stylesheet = parser.parseString(text, href=cssname) text = XHTML_CSS_NAMESPACE + x
stylesheet.namespaces['h'] = XHTML_NS stylesheet = parser.parseString(text, href=cssname)
stylesheets.append(stylesheet) 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 = [] rules = []
index = 0 index = 0
self.stylesheets = set() self.stylesheets = set()

View File

@ -229,13 +229,13 @@ class RTFInput(InputFormatPlugin):
res = transform.tostring(result) res = transform.tostring(result)
res = res[:100].replace('xmlns:html', 'xmlns') + res[100:] res = res[:100].replace('xmlns:html', 'xmlns') + res[100:]
if self.options.preprocess_html: if self.options.preprocess_html:
print "********* Preprocessing HTML *********\n" self.log("********* Preprocessing HTML *********")
# Detect Chapters to match the xpath in the GUI # 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) 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) res = chapdetect.sub('<h2>'+'\g<chap>'+'</h2>\n', res)
# Unwrap lines using punctation if the median length of all lines is less than 150 # Unwrap lines using punctation if the median length of all lines is less than 150
length = line_length('html', res, 0.4) 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) 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: if length < 150:
res = unwrap.sub(' ', res) 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.ebooks.metadata import MetaInformation
from calibre.utils.date import UNDEFINED_DATE from calibre.utils.date import UNDEFINED_DATE
# Setup gprefs {{{
gprefs = JSONConfig('gui') 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 NONE = QVariant() #: Null value to return from the data function of item models
UNDEFINED_QDATE = QDate(UNDEFINED_DATE) UNDEFINED_QDATE = QDate(UNDEFINED_DATE)
@ -66,8 +93,6 @@ def _config():
c.add_opt('default_send_to_device_action', default=None, c.add_opt('default_send_to_device_action', default=None,
help=_('Default action to perform when send to device button is ' help=_('Default action to perform when send to device button is '
'clicked')) 'clicked'))
c.add_opt('show_donate_button', default=True,
help='Show donation button')
c.add_opt('asked_library_thing_password', default=False, c.add_opt('asked_library_thing_password', default=False,
help='Asked library thing password at least once.') help='Asked library thing password at least once.')
c.add_opt('search_as_you_type', default=True, 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 #: shortcut must be a translated string if not None
action_spec = ('text', 'icon', None, 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): def __init__(self, parent, site_customization):
QObject.__init__(self, parent) QObject.__init__(self, parent)
self.setObjectName(self.name) self.setObjectName(self.name)

View File

@ -22,7 +22,9 @@ from calibre.gui2.actions import InterfaceAction
class AddAction(InterfaceAction): class AddAction(InterfaceAction):
name = 'Add Books' 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): def genesis(self):
self._add_filesystem_book = self.Dispatcher(self.__add_filesystem_book) 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): class AddToLibraryAction(InterfaceAction):
name = 'Add To Library' 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): def location_selected(self, loc):
enabled = loc != 'library' enabled = loc != 'library'

View File

@ -18,6 +18,7 @@ class GenerateCatalogAction(InterfaceAction):
name = 'Generate Catalog' name = 'Generate Catalog'
action_spec = (_('Create catalog of books in your calibre library'), None, None, None) 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): def generate_catalog(self):
rows = self.gui.library_view.selectionModel().selectedRows() rows = self.gui.library_view.selectionModel().selectedRows()

View File

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

View File

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

View File

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

View File

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

View File

@ -10,7 +10,9 @@ from calibre.gui2.actions import InterfaceAction
class EditCollectionsAction(InterfaceAction): class EditCollectionsAction(InterfaceAction):
name = 'Edit Collections' 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): def location_selected(self, loc):
enabled = loc != 'library' enabled = loc != 'library'

View File

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

View File

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

View File

@ -15,6 +15,7 @@ class ShowBookDetailsAction(InterfaceAction):
name = 'Show Book Details' name = 'Show Book Details'
action_spec = (_('Show book details'), 'dialog_information.svg', None, action_spec = (_('Show book details'), 'dialog_information.svg', None,
_('I')) _('I'))
dont_add_to = frozenset(['toolbar-device', 'context-menu-device'])
def genesis(self): def genesis(self):
self.qaction.triggered.connect(self.show_book_info) 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_all, adding, rtext = self.gui_val
remove = set() remove = set()
if remove_all: if remove_all:
for book_id in book_ids: remove = set(self.db.all_custom(num=self.col_id))
remove |= set(self.db.get_custom(book_id, num=self.col_id,
index_is_id=True))
else: else:
txt = rtext txt = rtext
if txt: if txt:

View File

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

View File

@ -294,361 +294,364 @@
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="page"> <widget class="QWidget" name="page">
<layout class="QGridLayout" name="gridLayout_8"> <layout class="QGridLayout" name="gridLayout_12">
<item row="2" column="0"> <item row="0" column="0">
<widget class="QCheckBox" name="roman_numerals"> <widget class="QTabWidget" name="toolbar_cm_tab">
<property name="text"> <property name="currentIndex">
<string>Use &amp;Roman numerals for series number</string> <number>0</number>
</property> </property>
<property name="checked"> <widget class="QWidget" name="tab_3">
<bool>true</bool> <attribute name="title">
</property> <string>&amp;Miscellaneous</string>
</widget> </attribute>
</item> <layout class="QGridLayout" name="gridLayout_8">
<item row="3" column="0"> <item row="0" column="0">
<widget class="QCheckBox" name="systray_icon"> <widget class="QLabel" name="label_17">
<property name="text"> <property name="text">
<string>Enable system &amp;tray icon (needs restart)</string> <string>User Interface &amp;layout (needs restart):</string>
</property> </property>
</widget> <property name="buddy">
</item> <cstring>opt_gui_layout</cstring>
<item row="3" column="1"> </property>
<widget class="QCheckBox" name="systray_notifications"> </widget>
<property name="text"> </item>
<string>Show &amp;notifications in system tray</string> <item row="0" column="1">
</property> <widget class="QComboBox" name="opt_gui_layout">
</widget> <property name="maximumSize">
</item> <size>
<item row="4" column="0"> <width>250</width>
<widget class="QCheckBox" name="show_splash_screen"> <height>16777215</height>
<property name="text"> </size>
<string>Show &amp;splash screen at startup</string> </property>
</property> </widget>
</widget> </item>
</item> <item row="1" column="0">
<item row="5" column="0" colspan="2"> <widget class="QLabel" name="label_6">
<widget class="QCheckBox" name="separate_cover_flow"> <property name="text">
<property name="text"> <string>&amp;Number of covers to show in browse mode (needs restart):</string>
<string>Show cover &amp;browser in a separate window (needs restart)</string> </property>
</property> <property name="buddy">
</widget> <cstring>cover_browse</cstring>
</item> </property>
<item row="6" column="0" colspan="2"> </widget>
<widget class="QCheckBox" name="show_avg_rating"> </item>
<property name="text"> <item row="1" column="1">
<string>Show &amp;average ratings in the tags browser</string> <widget class="QSpinBox" name="cover_browse"/>
</property> </item>
<property name="checked"> <item row="2" column="0">
<bool>true</bool> <widget class="QLabel" name="label_170">
</property> <property name="text">
</widget> <string>Restriction to apply when the current library is opened:</string>
</item> </property>
<item row="7" column="0"> <property name="buddy">
<widget class="QCheckBox" name="search_as_you_type"> <cstring>opt_gui_restriction</cstring>
<property name="text"> </property>
<string>Search as you type</string> </widget>
</property> </item>
<property name="checked"> <item row="2" column="1">
<bool>true</bool> <widget class="QComboBox" name="opt_gui_restriction">
</property> <property name="maximumSize">
</widget> <size>
</item> <width>250</width>
<item row="9" column="0" colspan="2"> <height>16777215</height>
<widget class="QCheckBox" name="sync_news"> </size>
<property name="text"> </property>
<string>Automatically send downloaded &amp;news to ebook reader</string> <property name="toolTip">
</property> <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>
</widget> </property>
</item> <property name="sizeAdjustPolicy">
<item row="10" column="0" colspan="2"> <enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
<widget class="QCheckBox" name="delete_news"> </property>
<property name="text"> <property name="minimumContentsLength">
<string>&amp;Delete news from library when it is automatically sent to reader</string> <number>15</number>
</property> </property>
</widget> </widget>
</item> </item>
<item row="11" column="0" colspan="2"> <item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout"> <widget class="QCheckBox" name="opt_disable_animations">
<item> <property name="toolTip">
<widget class="QLabel" name="label_6"> <string>Disable all animations. Useful if you have a slow/old computer.</string>
<property name="text"> </property>
<string>&amp;Number of covers to show in browse mode (needs restart):</string> <property name="text">
</property> <string>Disable &amp;animations</string>
<property name="buddy"> </property>
<cstring>cover_browse</cstring> </widget>
</property> </item>
</widget> <item row="11" column="0" colspan="2">
</item> <widget class="QGroupBox" name="groupBox_2">
<item> <property name="title">
<widget class="QSpinBox" name="cover_browse"/> <string>&amp;Toolbar</string>
</item> </property>
</layout> <layout class="QGridLayout" name="gridLayout">
</item> <item row="0" column="1">
<item row="12" column="0" colspan="2"> <widget class="QComboBox" name="opt_toolbar_icon_size"/>
<layout class="QHBoxLayout" name="horizontalLayout_7"> </item>
<item> <item row="0" column="0">
<widget class="QGroupBox" name="groupBox"> <widget class="QLabel" name="label">
<property name="title"> <property name="text">
<string>Select visible &amp;columns in library view</string> <string>&amp;Icon size:</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QListWidget" name="columns">
<property name="alternatingRowColors">
<bool>true</bool>
</property> </property>
<property name="selectionBehavior"> <property name="buddy">
<enum>QAbstractItemView::SelectRows</enum> <cstring>opt_toolbar_icon_size</cstring>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout_3"> <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">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Select visible &amp;columns in library view</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item> <item>
<widget class="QToolButton" name="column_up"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="text"> <item>
<string>...</string> <widget class="QListWidget" name="columns">
</property> <property name="alternatingRowColors">
<property name="icon"> <bool>true</bool>
<iconset resource="../../../../../resources/images.qrc"> </property>
<normaloff>:/images/arrow-up.svg</normaloff>:/images/arrow-up.svg</iconset> <property name="selectionBehavior">
</property> <enum>QAbstractItemView::SelectRows</enum>
</widget> </property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QToolButton" name="column_up">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/arrow-up.svg</normaloff>:/images/arrow-up.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="del_custcol_button">
<property name="toolTip">
<string>Remove a user-defined column</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/minus.svg</normaloff>:/images/minus.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="add_custcol_button">
<property name="toolTip">
<string>Add a user-defined column</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/plus.svg</normaloff>:/images/plus.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="edit_custcol_button">
<property name="toolTip">
<string>Edit settings of a user-defined column</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/edit_input.svg</normaloff>:/images/edit_input.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="column_down">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/arrow-down.svg</normaloff>:/images/arrow-down.svg</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item> </item>
<item> </layout>
<spacer name="verticalSpacer_2"> </widget>
<property name="orientation"> </item>
<enum>Qt::Vertical</enum> <item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Use internal &amp;viewer for:</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QListWidget" name="viewer">
<property name="alternatingRowColors">
<bool>true</bool>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="selectionMode">
<size> <enum>QAbstractItemView::NoSelection</enum>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="del_custcol_button">
<property name="toolTip">
<string>Remove a user-defined column</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/minus.svg</normaloff>:/images/minus.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="add_custcol_button">
<property name="toolTip">
<string>Add a user-defined column</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/plus.svg</normaloff>:/images/plus.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="edit_custcol_button">
<property name="toolTip">
<string>Edit settings of a user-defined column</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/edit_input.svg</normaloff>:/images/edit_input.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="column_down">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../../resources/images.qrc">
<normaloff>:/images/arrow-down.svg</normaloff>:/images/arrow-down.svg</iconset>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </widget>
</layout> </item>
</item> </layout>
</layout> </item>
</widget> <item row="6" column="1">
</item> <widget class="QCheckBox" name="search_as_you_type">
<item> <property name="text">
<widget class="QGroupBox" name="groupBox_3"> <string>Search as you type</string>
<property name="title"> </property>
<string>Use internal &amp;viewer for:</string> <property name="checked">
</property> <bool>true</bool>
<layout class="QGridLayout" name="gridLayout_4"> </property>
<item row="0" column="0"> </widget>
<widget class="QListWidget" name="viewer"> </item>
<property name="alternatingRowColors"> <item row="5" column="1">
<bool>true</bool> <widget class="QCheckBox" name="roman_numerals">
</property> <property name="text">
<property name="selectionMode"> <string>Use &amp;Roman numerals for series</string>
<enum>QAbstractItemView::NoSelection</enum> </property>
</property> <property name="checked">
</widget> <bool>true</bool>
</item> </property>
</layout> </widget>
</widget> </item>
</item> <item row="3" column="0">
</layout> <widget class="QCheckBox" name="systray_icon">
</item> <property name="text">
<item row="0" column="0"> <string>Enable system &amp;tray icon (needs restart)</string>
<widget class="QLabel" name="label_17"> </property>
<property name="text"> </widget>
<string>User Interface &amp;layout (needs restart):</string> </item>
</property> <item row="4" column="0">
<property name="buddy"> <widget class="QCheckBox" name="show_avg_rating">
<cstring>opt_gui_layout</cstring> <property name="text">
</property> <string>Show &amp;average ratings in the tags browser</string>
</widget> </property>
</item> <property name="checked">
<item row="0" column="1"> <bool>true</bool>
<widget class="QComboBox" name="opt_gui_layout"> </property>
<property name="maximumSize"> </widget>
<size> </item>
<width>250</width> <item row="6" column="0">
<height>16777215</height> <widget class="QCheckBox" name="sync_news">
</size> <property name="text">
</property> <string>Automatically send downloaded &amp;news to ebook reader</string>
</widget> </property>
</item> </widget>
<item row="1" column="0"> </item>
<widget class="QLabel" name="label_170"> <item row="4" column="1">
<property name="text"> <widget class="QCheckBox" name="show_splash_screen">
<string>Restriction to apply when the current library is opened:</string> <property name="text">
</property> <string>Show &amp;splash screen at startup</string>
<property name="buddy"> </property>
<cstring>opt_gui_restriction</cstring> </widget>
</property> </item>
</widget> <item row="9" column="0" colspan="2">
</item> <widget class="QCheckBox" name="separate_cover_flow">
<item row="1" column="1"> <property name="text">
<widget class="QComboBox" name="opt_gui_restriction"> <string>Show cover &amp;browser in a separate window (needs restart)</string>
<property name="maximumSize"> </property>
<size> </widget>
<width>250</width> </item>
<height>16777215</height> <item row="5" column="0">
</size> <widget class="QCheckBox" name="systray_notifications">
</property> <property name="text">
<property name="toolTip"> <string>Show &amp;notifications in system tray</string>
<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> </widget>
<property name="sizeAdjustPolicy"> </item>
<enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum> </layout>
</property> </widget>
<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>
<property name="text">
<string>Disable &amp;animations</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="opt_show_donate_button">
<property name="text">
<string>Show &amp;donate button (restart)</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">
<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> </widget>
</item> </item>
</layout> </layout>

View File

@ -11,41 +11,29 @@ from PyQt4.Qt import QWidget, QAbstractListModel, Qt, QIcon, \
QVariant, QItemSelectionModel QVariant, QItemSelectionModel
from calibre.gui2.dialogs.config.toolbar_ui import Ui_Form from calibre.gui2.dialogs.config.toolbar_ui import Ui_Form
from calibre.gui2.layout import TOOLBAR_NO_DEVICE, TOOLBAR_DEVICE from calibre.gui2 import gprefs, NONE, warning_dialog
from calibre.gui2.init import LIBRARY_CONTEXT_MENU, DEVICE_CONTEXT_MENU
from calibre.gui2 import gprefs, NONE
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): 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.name = name
self.action_spec = (name, icon, tooltip, None) self.action_spec = (name, icon, tooltip, None)
self.dont_remove_from = dont_remove_from
self.dont_add_to = dont_add_to
class BaseModel(QAbstractListModel): class BaseModel(QAbstractListModel):
def name_to_action(self, name, gui): def name_to_action(self, name, gui):
if name == 'Donate': 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': 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: if name is None:
return FakeAction('--- '+_('Separator')+' ---', None) return FakeAction('--- '+_('Separator')+' ---', None)
return gui.iactions[name] return gui.iactions[name]
@ -86,19 +74,25 @@ class AllModel(BaseModel):
def __init__(self, key, gui): def __init__(self, key, gui):
BaseModel.__init__(self) BaseModel.__init__(self)
current = gprefs.get('action-layout-'+key, DEFAULTS[key]) self.gprefs_name = 'action-layout-'+key
all = list(gui.iactions.keys()) + ['Donate'] current = gprefs[self.gprefs_name]
all = [x for x in all if x not in current] + [None] self.gui = gui
all = [self.name_to_action(x, gui) for x in all] self.key = key
all.sort() 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): def add(self, names):
actions = [] actions = []
for name in actions: for name in names:
if name is None or name.startswith('---'): continue 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.extend(actions)
self._data.sort() self._data.sort()
self.reset() self.reset()
@ -118,14 +112,20 @@ class AllModel(BaseModel):
self._data = ndata self._data = ndata
self.reset() self.reset()
def restore_defaults(self):
current = gprefs.defaults[self.gprefs_name]
self._data = self.get_all_actions(current)
self.reset()
class CurrentModel(BaseModel): class CurrentModel(BaseModel):
def __init__(self, key, gui): def __init__(self, key, gui):
BaseModel.__init__(self) 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._data = [self.name_to_action(x, gui) for x in current]
self.key = key self.key = key
self.gui = gui
def move(self, idx, delta): def move(self, idx, delta):
row = idx.row() row = idx.row()
@ -145,11 +145,12 @@ class CurrentModel(BaseModel):
def add(self, names): def add(self, names):
actions = [] actions = []
reject = set([]) reject = set([])
for name in actions: for name in names:
if name in UNADDABLE[self.key]: ac = self.name_to_action(name, self.gui)
reject.add(name) if self.key in ac.dont_add_to:
continue reject.add(ac)
actions.append(self.name_to_action(name)) else:
actions.append(ac)
self._data.extend(actions) self._data.extend(actions)
self.reset() self.reset()
@ -157,19 +158,41 @@ class CurrentModel(BaseModel):
def remove(self, indices): def remove(self, indices):
rows = [i.row() for i in indices] rows = [i.row() for i in indices]
r = UNREMOVABLE[self.key] remove, rejected = set([]), set([])
remove, removed = set([]), set([])
for row in rows: for row in rows:
ac = self._data[row] 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) remove.add(row)
removed.add(ac.name)
ndata = [] ndata = []
for i, ac in enumerate(self._data): for i, ac in enumerate(self._data):
if i not in remove: if i not in remove:
ndata.append(ac) ndata.append(ac)
self._data = ndata self._data = ndata
self.reset() 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): class ToolbarLayout(QWidget, Ui_Form):
@ -199,6 +222,7 @@ class ToolbarLayout(QWidget, Ui_Form):
self.add_action_button.clicked.connect(self.add_action) self.add_action_button.clicked.connect(self.add_action)
self.remove_action_button.clicked.connect(self.remove_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_up_button.clicked.connect(partial(self.move, -1))
self.action_down_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) names = self.all_actions.model().names(x)
if names: if names:
not_added = self.current_actions.model().add(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) 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): def remove_action(self, *args):
x = self.current_actions.selectionModel().selectedIndexes() x = self.current_actions.selectionModel().selectedIndexes()
names = self.current_actions.model().names(x) names = self.current_actions.model().names(x)
if names: if names:
self.current_actions.model().remove(x) not_removed = self.current_actions.model().remove(x)
self.all_actions.model().add(names) 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): def move(self, delta, *args):
ci = self.current_actions.currentIndex() ci = self.current_actions.currentIndex()
@ -232,6 +273,16 @@ class ToolbarLayout(QWidget, Ui_Form):
self.current_actions.selectionModel().select(ni, self.current_actions.selectionModel().select(ni,
QItemSelectionModel.ClearAndSelect) 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__': if __name__ == '__main__':
from PyQt4.Qt import QApplication from PyQt4.Qt import QApplication
from calibre.gui2.ui import Main from calibre.gui2.ui import Main
@ -240,4 +291,5 @@ if __name__ == '__main__':
a = ToolbarLayout(m) a = ToolbarLayout(m)
a.show() a.show()
app.exec_() app.exec_()
a.commit()

View File

@ -207,6 +207,13 @@
</item> </item>
</layout> </layout>
</item> </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> </layout>
</widget> </widget>
<resources> <resources>

View File

@ -199,7 +199,10 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
for w in getattr(self, 'custom_column_widgets', []): for w in getattr(self, 'custom_column_widgets', []):
w.gui_val w.gui_val
remove = unicode(self.remove_tags.text()).strip().split(',') 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(',') add = unicode(self.tags.text()).strip().split(',')
au = unicode(self.authors.text()) au = unicode(self.authors.text())
aus = unicode(self.author_sort.text()) aus = unicode(self.author_sort.text())

View File

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

View File

@ -613,12 +613,9 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QToolButton" name="cover_button"> <widget class="QPushButton" name="cover_button">
<property name="toolTip">
<string>Browse for an image to use as the cover of this book.</string>
</property>
<property name="text"> <property name="text">
<string>...</string> <string>&amp;Browse</string>
</property> </property>
<property name="icon"> <property name="icon">
<iconset resource="../../../../resources/images.qrc"> <iconset resource="../../../../resources/images.qrc">
@ -750,7 +747,6 @@
<tabstop>button_set_metadata</tabstop> <tabstop>button_set_metadata</tabstop>
<tabstop>formats</tabstop> <tabstop>formats</tabstop>
<tabstop>cover_path</tabstop> <tabstop>cover_path</tabstop>
<tabstop>cover_button</tabstop>
<tabstop>reset_cover</tabstop> <tabstop>reset_cover</tabstop>
<tabstop>fetch_cover_button</tabstop> <tabstop>fetch_cover_button</tabstop>
<tabstop>generate_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.utils.config import prefs
from calibre.constants import isosx, __appname__, preferred_encoding, \ from calibre.constants import isosx, __appname__, preferred_encoding, \
__version__ __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.library.views import BooksView, DeviceBooksView
from calibre.gui2.widgets import Splitter from calibre.gui2.widgets import Splitter
from calibre.gui2.tag_view import TagBrowserWidget from calibre.gui2.tag_view import TagBrowserWidget
@ -27,35 +27,10 @@ def partial(*args, **kwargs):
_keep_refs.append(ans) _keep_refs.append(ans)
return 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): # {{{ class LibraryViewMixin(object): # {{{
def __init__(self, db): 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) self.library_view.files_dropped.connect(self.iactions['Add Books'].files_dropped, type=Qt.QueuedConnection)
for func, args in [ for func, args in [
('connect_to_search_box', (self.search, ('connect_to_search_box', (self.search,
@ -85,6 +60,23 @@ class LibraryViewMixin(object): # {{{
view = getattr(self, view+'_view') view = getattr(self, view+'_view')
view.verticalHeader().sectionDoubleClicked.connect(self.iactions['View'].view_specific_book) 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): 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.constants import __appname__
from calibre.gui2.search_box import SearchBox2, SavedSearchBox from calibre.gui2.search_box import SearchBox2, SavedSearchBox
from calibre.gui2.throbber import ThrobbingButton 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.gui2.widgets import ComboBoxWithHelp
from calibre import human_readable 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): # {{{ class LocationManager(QObject): # {{{
locations_changed = pyqtSignal() 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.free[2] = fs[2] if fs[2] is not None and cpb is not None else -1
self.update_tooltips() self.update_tooltips()
if self.has_device != had_device: if self.has_device != had_device:
self.location_library.setChecked(True)
self.locations_changed.emit() self.locations_changed.emit()
if not self.has_device: if not self.has_device:
self.location_library.trigger() self.location_library.trigger()
@ -220,14 +208,11 @@ class ToolBar(QToolBar): # {{{
self.setOrientation(Qt.Horizontal) self.setOrientation(Qt.Horizontal)
self.setAllowedAreas(Qt.TopToolBarArea|Qt.BottomToolBarArea) self.setAllowedAreas(Qt.TopToolBarArea|Qt.BottomToolBarArea)
self.setStyleSheet('QToolButton:checked { font-weight: bold }') self.setStyleSheet('QToolButton:checked { font-weight: bold }')
self.donate = donate self.donate_button = donate
self.apply_settings() self.apply_settings()
self.location_manager = location_manager self.location_manager = location_manager
self.location_manager.locations_changed.connect(self.build_bar) 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.setAutoRaise(True)
donate.setCursor(Qt.PointingHandCursor) donate.setCursor(Qt.PointingHandCursor)
self.build_bar() self.build_bar()
@ -241,14 +226,15 @@ class ToolBar(QToolBar): # {{{
if gprefs.get('toolbar_text', 'auto') == 'never': if gprefs.get('toolbar_text', 'auto') == 'never':
style = Qt.ToolButtonIconOnly style = Qt.ToolButtonIconOnly
self.setToolButtonStyle(style) self.setToolButtonStyle(style)
self.donate.set_normal_icon_size(sz, sz) self.donate_button.set_normal_icon_size(sz, sz)
def contextMenuEvent(self, *args): def contextMenuEvent(self, *args):
pass pass
def build_bar(self): def build_bar(self):
showing_device = self.location_manager.has_device 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() self.clear()
@ -259,7 +245,10 @@ class ToolBar(QToolBar): # {{{
for ac in self.location_manager.available_actions: for ac in self.location_manager.available_actions:
self.addAction(ac) self.addAction(ac)
self.setup_tool_button(ac, QToolButton.MenuButtonPopup) 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) self.addWidget(self.d_widget)
elif what in self.gui.iactions: elif what in self.gui.iactions:
action = self.gui.iactions[what] action = self.gui.iactions[what]
@ -290,7 +279,7 @@ class ToolBar(QToolBar): # {{{
# }}} # }}}
class MainWindowMixin(object): class MainWindowMixin(object): # {{{
def __init__(self, db): def __init__(self, db):
self.setObjectName('MainWindow') self.setObjectName('MainWindow')
@ -316,7 +305,7 @@ class MainWindowMixin(object):
l = self.centralwidget.layout() l = self.centralwidget.layout()
l.addWidget(self.search_bar) l.addWidget(self.search_bar)
# }}}

View File

@ -98,14 +98,14 @@ class DateDelegate(QStyledItemDelegate): # {{{
d = val.toDate() d = val.toDate()
if d <= UNDEFINED_QDATE: if d <= UNDEFINED_QDATE:
return '' 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): def createEditor(self, parent, option, index):
qde = QStyledItemDelegate.createEditor(self, parent, option, index) qde = QStyledItemDelegate.createEditor(self, parent, option, index)
stdformat = unicode(qde.displayFormat()) qde.setDisplayFormat('dd MMM yyyy')
if 'yyyy' not in stdformat:
stdformat = stdformat.replace('yy', 'yyyy')
qde.setDisplayFormat(stdformat)
qde.setMinimumDate(UNDEFINED_QDATE) qde.setMinimumDate(UNDEFINED_QDATE)
qde.setSpecialValueText(_('Undefined')) qde.setSpecialValueText(_('Undefined'))
qde.setCalendarPopup(True) 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() self.start()
def run(self): def run(self):
if self.listener is None:
return
while self._run: while self._run:
try: try:
conn = self.listener.accept() conn = self.listener.accept()

View File

@ -112,6 +112,6 @@ class cmd_commit(_cmd_commit):
server = xmlrpclib.ServerProxy(url) server = xmlrpclib.ServerProxy(url)
server.ticket.update(int(bug), msg, server.ticket.update(int(bug), msg,
{'status':'closed', 'resolution':'fixed'}, {'status':'closed', 'resolution':'fixed'},
False) True)
bzrlib.commands.register_command(cmd_commit) 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 "" msgstr ""
"Project-Id-Version: calibre\n" "Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n" "POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-19 19:17+0000\n" "PO-Revision-Date: 2010-08-21 08:43+0000\n"
"Last-Translator: Glenn <Unknown>\n" "Last-Translator: Glenn <Unknown>\n"
"Language-Team: Danish <da@li.org>\n" "Language-Team: Danish <da@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 #: /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:70
#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /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/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/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:97
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /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:1076
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1760 #: /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: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/mobile.py:201
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /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/library/server/xml.py:70
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:117
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /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" msgid "Communicate with the Sweex MM300"
msgstr "Kommunikér med 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" msgid "Communicate with the Pandigital Novel"
msgstr "Kommunikér med 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å " "Komma separeret liste af metadata felter som oversættes til collections på "
"enheden. Muligheder omfatter: " "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 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed" msgid "Unnamed"
msgstr "Unavngivet" msgstr "Unavngivet"
@ -1671,7 +1675,11 @@ msgstr "Udfører transformationer på e-bog..."
msgid "Creating" msgid "Creating"
msgstr "Opretter" 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" msgid "ePub Fixer"
msgstr "ePub-fixer" msgstr "ePub-fixer"
@ -1692,7 +1700,7 @@ msgstr ""
"Dette kan forårsage omfattende ændringer til din epub, klag til epubcheck-" "Dette kan forårsage omfattende ændringer til din epub, klag til epubcheck-"
"projektet." "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 "" msgid ""
"%prog [options] file.epub\n" "%prog [options] file.epub\n"
"\n" "\n"
@ -1710,7 +1718,7 @@ msgstr ""
"By default, no fixing is done and messages are printed out for each error " "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." "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" msgid "You must specify an epub file"
msgstr "Du skal angive en epub-fil" 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:65
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py: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" msgid "Title"
msgstr "Titel" msgstr "Titel"
@ -3151,7 +3159,7 @@ msgid ""
"directory, assumes every ebook file is the same book in a different format)" "directory, assumes every ebook file is the same book in a different format)"
msgstr "" msgstr ""
"Tilføj bøger fra mapper, inklusiv undermapper (Én e-bog per mappe, formoder " "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 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36
msgid "" 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/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 #: /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/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:74
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176
@ -3368,7 +3377,8 @@ msgid "Select destination for %s.%s"
msgstr "Gem 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/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" msgid "%d books"
msgstr "%d bøger" msgstr "%d bøger"
@ -3435,14 +3445,45 @@ msgstr "Kan ikke konvertere"
msgid "Starting conversion of %d book(s)" msgid "Starting conversion of %d book(s)"
msgstr "Starter konvertering af %d bog/bøger" 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" msgid "Copy to library"
msgstr "Kopiér til bibliotek" 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" msgid "Copy selected books to the specified library"
msgstr "Kopiér udvalgte bøger til det angivne bibliotek" 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 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del" msgid "Del"
msgstr "Slet" msgstr "Slet"
@ -3875,35 +3916,35 @@ msgstr "Ingen detaljeret information tilgængelig om bøger på enheden."
msgid "Similar books..." msgid "Similar books..."
msgstr "Lignende bøger..." 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" msgid "Alt+A"
msgstr "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" msgid "Books by same author"
msgstr "Bøger af samme forfatter" 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" msgid "Alt+S"
msgstr "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" msgid "Books in this series"
msgstr "Bøger i denne serie" 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" msgid "Alt+P"
msgstr "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" msgid "Books by this publisher"
msgstr "Bøger fra denne udgiver" 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" msgid "Alt+T"
msgstr "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" msgid "Books with the same tags"
msgstr "Bøger med samme mærker" 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: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:637
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 #: /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: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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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/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/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/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/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 #: /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" msgid "Select folder to open as device"
msgstr "Vælg mappe til at åbne som enhed" 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 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device" msgid "Error talking to device"
msgstr "Fejl ved kommunikation med enhed" 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/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:69
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 #: /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" msgid "Date"
msgstr "Dato" msgstr "Dato"
@ -6940,6 +6981,63 @@ msgstr "Tilgængelige variable:"
msgid "Downloading social metadata, please wait..." msgid "Downloading social metadata, please wait..."
msgstr "Downloader sociale metadata, vent venligst..." 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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again" msgid "&Show this warning again"
msgstr "&Vis denne advarsel igen" msgstr "&Vis denne advarsel igen"
@ -7911,10 +8009,6 @@ msgstr ""
msgid "Rename the item in every book where it is used." msgid "Rename the item in every book where it is used."
msgstr "Omdøb emnet i bøger hvor det er brugt." 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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings" msgid "Test email settings"
msgstr "Test e-mail indstillinger" msgstr "Test e-mail indstillinger"
@ -8228,48 +8322,48 @@ msgstr "ISBN:"
msgid "Regular expression (?P<isbn>)" msgid "Regular expression (?P<isbn>)"
msgstr "Regulært udtryk (?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" msgid "Cover Browser"
msgstr "omslags-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" msgid "Shift+Alt+B"
msgstr "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" msgid "Tag Browser"
msgstr "Mærke-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" msgid "Shift+Alt+T"
msgstr "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" msgid "version"
msgstr "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" msgid "created by Kovid Goyal"
msgstr "skabt af 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 " msgid "Connected "
msgstr "Forbundet " 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" msgid "Update found"
msgstr "Opdatering fundet" msgstr "Opdatering fundet"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details" msgid "Book Details"
msgstr "bog detaljer" 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" msgid "Alt+D"
msgstr "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" msgid "Shift+Alt+D"
msgstr "Shift+Alt+D" msgstr "Shift+Alt+D"
@ -8341,7 +8435,7 @@ msgid "Eject this device"
msgstr "Skub denne enhed ud" msgstr "Skub denne enhed ud"
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75 #: /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" msgid "Library"
msgstr "Bibliotek" msgstr "Bibliotek"
@ -10604,7 +10698,52 @@ msgstr "Spørger/spørg ikke efter bekræftelse"
msgid "Error: You must specify a column label" msgid "Error: You must specify a column label"
msgstr "Fejl: Du skal specificere en kolonne 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 "" msgid ""
"%%prog command [options] [arguments]\n" "%%prog command [options] [arguments]\n"
"\n" "\n"
@ -10644,27 +10783,27 @@ msgstr "%sMiddel vurderingen er %3.1f"
msgid "Main" msgid "Main"
msgstr "Main/hjem/primær" 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>" msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "<p>Flytter gammel database til e-bogsbibliotek i %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>" msgid "Copying <b>%s</b>"
msgstr "Kopierer <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" msgid "Compacting database"
msgstr "Komprimerer 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..." msgid "Checking SQL integrity..."
msgstr "Checker SQL integritet..." 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." msgid "Checking for missing files."
msgstr "Checker for manglende filer." 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" msgid "Checked id"
msgstr "Checket id" msgstr "Checket id"
@ -10897,35 +11036,39 @@ msgstr ""
"Angiv en restriktion som skal anvendes til denne aktivering. Denne mulighed " "Angiv en restriktion som skal anvendes til denne aktivering. Denne mulighed "
"overstyrer enhver per-biblioteksindstilling angivet i GUI-en" "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" msgid "%d items"
msgstr "%d emner" 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 />" msgid "RATING: %s<br />"
msgstr "VURDERING: %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 />" msgid "TAGS: %s<br />"
msgstr "MÆRKATER: %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 />" msgid "SERIES: %s [%s]<br />"
msgstr "SERIER: %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" msgid "Books in your library"
msgstr "Bøger i dit bibliotek" 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 " msgid "By "
msgstr "Af/efter " 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 " msgid "Books sorted by "
msgstr "Bøger sorteret efter " 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" msgid "Newest"
msgstr "Nyeste" msgstr "Nyeste"

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre\n" "Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n" "POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-20 02:58+0000\n" "PO-Revision-Date: 2010-08-20 22:07+0000\n"
"Last-Translator: Eleftherios Kosmas <elkosmas@gmail.com>\n" "Last-Translator: Eleftherios Kosmas <elkosmas@gmail.com>\n"
"Language-Team: Greek <el@li.org>\n" "Language-Team: Greek <el@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 #: /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:70
#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /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/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/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:97
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /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:1076
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1760 #: /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: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/mobile.py:201
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /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/library/server/xml.py:70
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:117
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46
@ -755,7 +755,11 @@ msgstr "Επικοινωνία με το Booq Avant"
msgid "Communicate with the Sweex MM300" msgid "Communicate with the Sweex MM300"
msgstr "Επικοινωνία με το 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" msgid "Communicate with the Pandigital Novel"
msgstr "Επικοινωνία με το 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 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed" msgid "Unnamed"
msgstr "Χωρίς όνομα" msgstr "Χωρίς όνομα"
@ -1636,7 +1640,11 @@ msgstr ""
msgid "Creating" msgid "Creating"
msgstr "Δημιουργία" 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" msgid "ePub Fixer"
msgstr "" msgstr ""
@ -1652,7 +1660,7 @@ msgid ""
"cause significant changes to your epub, complain to the epubcheck project." "cause significant changes to your epub, complain to the epubcheck project."
msgstr "" 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 "" msgid ""
"%prog [options] file.epub\n" "%prog [options] file.epub\n"
"\n" "\n"
@ -1663,7 +1671,7 @@ msgid ""
"detected. Use the options to control which errors are automatically fixed." "detected. Use the options to control which errors are automatically fixed."
msgstr "" 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" msgid "You must specify an epub file"
msgstr "" 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:65
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py: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" msgid "Title"
msgstr "" 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/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 #: /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/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:74
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176
@ -3110,7 +3119,8 @@ msgid "Select destination for %s.%s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73 #: /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" msgid "%d books"
msgstr "" msgstr ""
@ -3175,14 +3185,45 @@ msgstr ""
msgid "Starting conversion of %d book(s)" msgid "Starting conversion of %d book(s)"
msgstr "" 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" msgid "Copy to library"
msgstr "" 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" msgid "Copy selected books to the specified library"
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del" msgid "Del"
msgstr "Διαγραφή" msgstr "Διαγραφή"
@ -3596,35 +3637,35 @@ msgstr ""
msgid "Similar books..." msgid "Similar books..."
msgstr "" 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" msgid "Alt+A"
msgstr "" 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" msgid "Books by same author"
msgstr "" 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" msgid "Alt+S"
msgstr "" 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" msgid "Books in this series"
msgstr "" 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" msgid "Alt+P"
msgstr "" 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" msgid "Books by this publisher"
msgstr "" 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" msgid "Alt+T"
msgstr "" 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" msgid "Books with the same tags"
msgstr "" 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: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:637
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 #: /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: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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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/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/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/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/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 #: /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" msgid "Select folder to open as device"
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device" msgid "Error talking to device"
msgstr "" 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/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:69
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 #: /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" msgid "Date"
msgstr "Ημερομηνία" msgstr "Ημερομηνία"
@ -6473,6 +6514,63 @@ msgstr ""
msgid "Downloading social metadata, please wait..." msgid "Downloading social metadata, please wait..."
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again" msgid "&Show this warning again"
msgstr "" msgstr ""
@ -7396,10 +7494,6 @@ msgstr ""
msgid "Rename the item in every book where it is used." msgid "Rename the item in every book where it is used."
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings" msgid "Test email settings"
msgstr "" msgstr ""
@ -7678,48 +7772,48 @@ msgstr ""
msgid "Regular expression (?P<isbn>)" msgid "Regular expression (?P<isbn>)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:105
msgid "Cover Browser" msgid "Cover Browser"
msgstr "" 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" msgid "Shift+Alt+B"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:124
msgid "Tag Browser" msgid "Tag Browser"
msgstr "" 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" msgid "Shift+Alt+T"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
msgid "version" msgid "version"
msgstr "έκδοση" 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" msgid "created by Kovid Goyal"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:165
msgid "Connected " msgid "Connected "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:174
msgid "Update found" msgid "Update found"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details" msgid "Book Details"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:220
msgid "Alt+D" msgid "Alt+D"
msgstr "Alt+Π" 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" msgid "Shift+Alt+D"
msgstr "" msgstr ""
@ -7791,7 +7885,7 @@ msgid "Eject this device"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75 #: /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" msgid "Library"
msgstr "Βιβλιοθήκη" msgstr "Βιβλιοθήκη"
@ -9780,7 +9874,52 @@ msgstr ""
msgid "Error: You must specify a column label" msgid "Error: You must specify a column label"
msgstr "" 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 "" msgid ""
"%%prog command [options] [arguments]\n" "%%prog command [options] [arguments]\n"
"\n" "\n"
@ -9810,27 +9949,27 @@ msgstr ""
msgid "Main" msgid "Main"
msgstr "Κύριο" 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>" msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "" 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>" msgid "Copying <b>%s</b>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1957 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1961
msgid "Compacting database" msgid "Compacting database"
msgstr "Συμπίεση βάσης δεδομένων" 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..." msgid "Checking SQL integrity..."
msgstr "" 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." msgid "Checking for missing files."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2113 #: /home/kovid/work/calibre/src/calibre/library/database2.py:2117
msgid "Checked id" msgid "Checked id"
msgstr "" msgstr ""
@ -10026,35 +10165,39 @@ msgid ""
"overrides any per-library settings specified in the GUI" "overrides any per-library settings specified in the GUI"
msgstr "" 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" msgid "%d items"
msgstr "" 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 />" msgid "RATING: %s<br />"
msgstr "" 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 />" msgid "TAGS: %s<br />"
msgstr "" 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 />" msgid "SERIES: %s [%s]<br />"
msgstr "" 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" msgid "Books in your library"
msgstr "" 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 " msgid "By "
msgstr "" 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 " msgid "Books sorted by "
msgstr "" 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" msgid "Newest"
msgstr "Νεώτερη" msgstr "Νεώτερη"

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre\n" "Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n" "POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-19 22:29+0000\n" "PO-Revision-Date: 2010-08-20 21:29+0000\n"
"Last-Translator: Bingen Markes <Unknown>\n" "Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Basque <eu@li.org>\n" "Language-Team: Basque <eu@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 #: /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:70
#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /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/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/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:97
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /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:1076
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1760 #: /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: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/mobile.py:201
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /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/library/server/xml.py:70
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:117
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /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" msgid "Communicate with the Sweex MM300"
msgstr "Jar zaitez harremanetan \"Sweex MM300\" horrekin." 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" msgid "Communicate with the Pandigital Novel"
msgstr "Jar zaitez harremanetan \"Pandigital Novel\" horrekin." msgstr "Jar zaitez harremanetan \"Pandigital Novel\" horrekin."
@ -816,7 +820,7 @@ msgstr ""
"Komez bereiziriko meta-datuen eremuen zerrenda gailuan bildumak bihurtzeko " "Komez bereiziriko meta-datuen eremuen zerrenda gailuan bildumak bihurtzeko "
"modukoak. Aukeren artean hauek: " "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 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed" msgid "Unnamed"
msgstr "Identifikatu gabea" msgstr "Identifikatu gabea"
@ -1756,7 +1760,11 @@ msgstr ""
msgid "Creating" msgid "Creating"
msgstr "Sortzen" 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" msgid "ePub Fixer"
msgstr "ePub Fixer (ePUB formatuan doitzeko tresna)" msgstr "ePub Fixer (ePUB formatuan doitzeko tresna)"
@ -1778,7 +1786,7 @@ msgstr ""
"fitxategiari aldaketa nabarmenak ekar liezazkioke... Horrela izan bada, " "fitxategiari aldaketa nabarmenak ekar liezazkioke... Horrela izan bada, "
"kexak \"ePUB Project\" horretara bideratu." "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 "" msgid ""
"%prog [options] file.epub\n" "%prog [options] file.epub\n"
"\n" "\n"
@ -1797,7 +1805,7 @@ msgstr ""
"detektaturiko akats bakoitzari buruzko mezu bana. Erabil itzazu aukerak " "detektaturiko akats bakoitzari buruzko mezu bana. Erabil itzazu aukerak "
"kontrolatzeko zeintzuk akats izan dira automatikoki eraldatuak." "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" msgid "You must specify an epub file"
msgstr "ePUB fitxategi bat zehaztu beharko duzu" msgstr "ePUB fitxategi bat zehaztu beharko duzu"
@ -2129,6 +2137,7 @@ msgstr ""
"%prog [options] mybook.lrf\n" "%prog [options] mybook.lrf\n"
"\n" "\n"
"\n" "\n"
"\n"
"Erakutsi/Editatu metadatuak LRF fitxategian.\n" "Erakutsi/Editatu metadatuak LRF fitxategian.\n"
"\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:65
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py: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" msgid "Title"
msgstr "Izenburua" 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/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 #: /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/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:74
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176
@ -3517,7 +3527,8 @@ msgid "Select destination for %s.%s"
msgstr "Aukeratu helburua honentzat: %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/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" msgid "%d books"
msgstr "%d books" msgstr "%d books"
@ -3586,14 +3597,45 @@ msgstr "Ezin da bihurtu"
msgid "Starting conversion of %d book(s)" msgid "Starting conversion of %d book(s)"
msgstr "%d liburu(ar)en bihurketa abiatzen" 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" msgid "Copy to library"
msgstr "Liburutegira kopiatu." 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" msgid "Copy selected books to the specified library"
msgstr "Kopiatu hautatutako liburuak adierazitako liburutegian" 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 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del" msgid "Del"
msgstr "Del" msgstr "Del"
@ -4028,35 +4070,35 @@ msgstr "No detailed information is available for books on the device."
msgid "Similar books..." msgid "Similar books..."
msgstr "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" msgid "Alt+A"
msgstr "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" msgid "Books by same author"
msgstr "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" msgid "Alt+S"
msgstr "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" msgid "Books in this series"
msgstr "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" msgid "Alt+P"
msgstr "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" msgid "Books by this publisher"
msgstr "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" msgid "Alt+T"
msgstr "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" msgid "Books with the same tags"
msgstr "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: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:637
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 #: /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: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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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/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/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/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/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 #: /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" msgid "Select folder to open as device"
msgstr "Aukeratu karpeta bat irakurgailua izango balitz bezala zabaltzeko" 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 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device" msgid "Error talking to device"
msgstr "Akatsen bat irakurgailuarekin komunikatzerakoan" 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/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:69
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 #: /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" msgid "Date"
msgstr "Date" msgstr "Date"
@ -7092,6 +7134,63 @@ msgstr "Available variables:"
msgid "Downloading social metadata, please wait..." msgid "Downloading social metadata, please wait..."
msgstr "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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again" msgid "&Show this warning again"
msgstr "&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." msgid "Rename the item in every book where it is used."
msgstr "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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings" msgid "Test email settings"
msgstr "Test email settings" msgstr "Test email settings"
@ -8371,48 +8466,48 @@ msgstr "ISBN:"
msgid "Regular expression (?P<isbn>)" msgid "Regular expression (?P<isbn>)"
msgstr "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" msgid "Cover Browser"
msgstr "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" msgid "Shift+Alt+B"
msgstr "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" msgid "Tag Browser"
msgstr "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" msgid "Shift+Alt+T"
msgstr "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" msgid "version"
msgstr "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" msgid "created by Kovid Goyal"
msgstr "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 " msgid "Connected "
msgstr "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" msgid "Update found"
msgstr "Update found" msgstr "Update found"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details" msgid "Book Details"
msgstr "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" msgid "Alt+D"
msgstr "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" msgid "Shift+Alt+D"
msgstr "Shift+Alt+D" msgstr "Shift+Alt+D"
@ -8484,7 +8579,7 @@ msgid "Eject this device"
msgstr "Eject this device" msgstr "Eject this device"
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75 #: /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" msgid "Library"
msgstr "Library" msgstr "Library"
@ -10744,7 +10839,52 @@ msgstr "Do not ask for confirmation"
msgid "Error: You must specify a column label" msgid "Error: You must specify a column label"
msgstr "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 "" msgid ""
"%%prog command [options] [arguments]\n" "%%prog command [options] [arguments]\n"
"\n" "\n"
@ -10784,27 +10924,27 @@ msgstr "%sAverage rating is %3.1f"
msgid "Main" msgid "Main"
msgstr "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>" msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "<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>" msgid "Copying <b>%s</b>"
msgstr "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" msgid "Compacting database"
msgstr "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..." msgid "Checking SQL integrity..."
msgstr "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." msgid "Checking for missing files."
msgstr "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" msgid "Checked id"
msgstr "Checked id" msgstr "Checked id"
@ -11036,35 +11176,39 @@ msgid ""
"overrides any per-library settings specified in the GUI" "overrides any per-library settings specified in the GUI"
msgstr "" 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" msgid "%d items"
msgstr "%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 />" msgid "RATING: %s<br />"
msgstr "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 />" msgid "TAGS: %s<br />"
msgstr "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 />" msgid "SERIES: %s [%s]<br />"
msgstr "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" msgid "Books in your library"
msgstr "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 " msgid "By "
msgstr "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 " msgid "Books sorted by "
msgstr "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" msgid "Newest"
msgstr "Newest" msgstr "Newest"

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre\n" "Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n" "POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-20 00:46+0000\n" "PO-Revision-Date: 2010-08-20 22:29+0000\n"
"Last-Translator: Marcos X. <Unknown>\n" "Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Galician <gl@li.org>\n" "Language-Team: Galician <gl@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 #: /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:70
#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /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/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/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:97
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /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:1076
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1760 #: /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: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/mobile.py:201
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /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/library/server/xml.py:70
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:117
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /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" msgid "Communicate with the Sweex MM300"
msgstr "Conectar co 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" msgid "Communicate with the Pandigital Novel"
msgstr "Conectar co Pandigital Novel" msgstr "Conectar co Pandigital Novel"
@ -806,7 +810,7 @@ msgstr ""
"Lista separada por comas de campos de metadatos para convertelos en " "Lista separada por comas de campos de metadatos para convertelos en "
"coleccións no dispositivo. As posibilidades son: " "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 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed" msgid "Unnamed"
msgstr "Sen nome" msgstr "Sen nome"
@ -1690,7 +1694,11 @@ msgstr "Aplicando transformacións ao libro electrónico..."
msgid "Creating" msgid "Creating"
msgstr "A crear" 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" msgid "ePub Fixer"
msgstr "Corrector de ePub" msgstr "Corrector de ePub"
@ -1711,7 +1719,7 @@ msgstr ""
"provoar mudanzas significantes no epub. Dirixa as súas queixas ao proxecto " "provoar mudanzas significantes no epub. Dirixa as súas queixas ao proxecto "
"epubcheck." "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 "" msgid ""
"%prog [options] file.epub\n" "%prog [options] file.epub\n"
"\n" "\n"
@ -1722,7 +1730,7 @@ msgid ""
"detected. Use the options to control which errors are automatically fixed." "detected. Use the options to control which errors are automatically fixed."
msgstr "" 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" msgid "You must specify an epub file"
msgstr "Debe especificar un ficheiro de epub" 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:65
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py: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" msgid "Title"
msgstr "Título" 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/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 #: /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/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:74
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176
@ -3399,7 +3408,8 @@ msgid "Select destination for %s.%s"
msgstr "Escoller o destino para %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/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" msgid "%d books"
msgstr "%d libros" msgstr "%d libros"
@ -3466,14 +3476,45 @@ msgstr "Non se pode converter"
msgid "Starting conversion of %d book(s)" msgid "Starting conversion of %d book(s)"
msgstr "Esta a comezar a conversión de %d libros(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" msgid "Copy to library"
msgstr "Copiar á biblioteca" 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" msgid "Copy selected books to the specified library"
msgstr "Copiar os libros seleccionados á biblioteca especificada" 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 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del" msgid "Del"
msgstr "Supr" msgstr "Supr"
@ -3902,35 +3943,35 @@ msgstr "Non hai dispoñíbel información detallada dos libros no dispositivo."
msgid "Similar books..." msgid "Similar books..."
msgstr "Libros semellantes..." 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" msgid "Alt+A"
msgstr "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" msgid "Books by same author"
msgstr "Libros coa mesma autoría" 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" msgid "Alt+S"
msgstr "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" msgid "Books in this series"
msgstr "Libros con esta serie" 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" msgid "Alt+P"
msgstr "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" msgid "Books by this publisher"
msgstr "Libros por editorial" 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" msgid "Alt+T"
msgstr "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" msgid "Books with the same tags"
msgstr "Libros coas mesmas etiquetas" 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: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:637
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 #: /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: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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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/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/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/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/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 #: /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" msgid "Select folder to open as device"
msgstr "Escoller o cartafol para abrir co como dispositivo" 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 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device" msgid "Error talking to device"
msgstr "Erro ao conectar co dispositivo" 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/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:69
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 #: /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" msgid "Date"
msgstr "Data" msgstr "Data"
@ -6941,6 +6982,63 @@ msgstr "Variábeis dispoñíbeis"
msgid "Downloading social metadata, please wait..." msgid "Downloading social metadata, please wait..."
msgstr "A descargar os metadatos sociais, agarde..." 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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again" msgid "&Show this warning again"
msgstr "&Amosar este aviso outra vez" msgstr "&Amosar este aviso outra vez"
@ -7913,10 +8011,6 @@ msgstr ""
msgid "Rename the item in every book where it is used." msgid "Rename the item in every book where it is used."
msgstr "Cambiar o nome ao elemento en cada libro que o emprega." 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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings" msgid "Test email settings"
msgstr "Probar a configuración do correo de proba" msgstr "Probar a configuración do correo de proba"
@ -8231,48 +8325,48 @@ msgstr "ISBN:"
msgid "Regular expression (?P<isbn>)" msgid "Regular expression (?P<isbn>)"
msgstr "Expresión regular (?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" msgid "Cover Browser"
msgstr "Navegador de capas" 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" msgid "Shift+Alt+B"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:124
msgid "Tag Browser" msgid "Tag Browser"
msgstr "Navegador de etiquetas" 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" msgid "Shift+Alt+T"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
msgid "version" msgid "version"
msgstr "versión" 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" msgid "created by Kovid Goyal"
msgstr "creado por 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 " msgid "Connected "
msgstr "Conectado " 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" msgid "Update found"
msgstr "Actualización atopada" msgstr "Actualización atopada"
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details" msgid "Book Details"
msgstr "Detalles do libro" 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" msgid "Alt+D"
msgstr "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" msgid "Shift+Alt+D"
msgstr "" msgstr ""
@ -8344,7 +8438,7 @@ msgid "Eject this device"
msgstr "Extraer o dispositivo" msgstr "Extraer o dispositivo"
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75 #: /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" msgid "Library"
msgstr "Biblioteca" msgstr "Biblioteca"
@ -10360,7 +10454,52 @@ msgstr ""
msgid "Error: You must specify a column label" msgid "Error: You must specify a column label"
msgstr "" 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 "" msgid ""
"%%prog command [options] [arguments]\n" "%%prog command [options] [arguments]\n"
"\n" "\n"
@ -10390,27 +10529,27 @@ msgstr ""
msgid "Main" msgid "Main"
msgstr "" 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>" msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "" 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>" msgid "Copying <b>%s</b>"
msgstr "A copiar <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" msgid "Compacting database"
msgstr "A compactar a base de datos" 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..." msgid "Checking SQL integrity..."
msgstr "A comprobar a integridade SQL..." 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." msgid "Checking for missing files."
msgstr "A comprobar os ficheiros perdidos." 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" msgid "Checked id"
msgstr "id comprobada" msgstr "id comprobada"
@ -10606,35 +10745,39 @@ msgid ""
"overrides any per-library settings specified in the GUI" "overrides any per-library settings specified in the GUI"
msgstr "" 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" msgid "%d items"
msgstr "" 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 />" msgid "RATING: %s<br />"
msgstr "" 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 />" msgid "TAGS: %s<br />"
msgstr "" 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 />" msgid "SERIES: %s [%s]<br />"
msgstr "" 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" msgid "Books in your library"
msgstr "" 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 " msgid "By "
msgstr "" 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 " msgid "Books sorted by "
msgstr "" 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" msgid "Newest"
msgstr "" 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 "" msgstr ""
"Project-Id-Version: calibre\n" "Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-18 22:24+0000\n" "POT-Creation-Date: 2010-08-20 20:19+0000\n"
"PO-Revision-Date: 2010-08-19 10:53+0000\n" "PO-Revision-Date: 2010-08-20 22:26+0000\n"
"Last-Translator: ppanhh <ppanhh@gmail.com>\n" "Last-Translator: ppanhh <ppanhh@gmail.com>\n"
"Language-Team: Vietnamese <vi@li.org>\n" "Language-Team: Vietnamese <vi@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 #: /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:70
#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /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/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/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:97
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /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:1076
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1760 #: /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: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/mobile.py:201
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:134 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:137 #: /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/library/server/xml.py:70
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:117
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46
@ -750,7 +750,11 @@ msgstr ""
msgid "Communicate with the Sweex MM300" msgid "Communicate with the Sweex MM300"
msgstr "" 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" msgid "Communicate with the Pandigital Novel"
msgstr "" msgstr ""
@ -792,7 +796,7 @@ msgid ""
"device. Possibilities include: " "device. Possibilities include: "
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68
msgid "Unnamed" msgid "Unnamed"
msgstr "Chưa được đặt tên" msgstr "Chưa được đặt tên"
@ -1539,7 +1543,11 @@ msgstr ""
msgid "Creating" msgid "Creating"
msgstr "" 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" msgid "ePub Fixer"
msgstr "" msgstr ""
@ -1555,7 +1563,7 @@ msgid ""
"cause significant changes to your epub, complain to the epubcheck project." "cause significant changes to your epub, complain to the epubcheck project."
msgstr "" 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 "" msgid ""
"%prog [options] file.epub\n" "%prog [options] file.epub\n"
"\n" "\n"
@ -1566,7 +1574,7 @@ msgid ""
"detected. Use the options to control which errors are automatically fixed." "detected. Use the options to control which errors are automatically fixed."
msgstr "" 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" msgid "You must specify an epub file"
msgstr "" 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:65
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:359
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:887 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py: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" msgid "Title"
msgstr "Tựa" 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/annotate.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:30 #: /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/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:74
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140
#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176
@ -3038,7 +3047,8 @@ msgid "Select destination for %s.%s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73 #: /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" msgid "%d books"
msgstr "" msgstr ""
@ -3103,14 +3113,45 @@ msgstr ""
msgid "Starting conversion of %d book(s)" msgid "Starting conversion of %d book(s)"
msgstr "" 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" msgid "Copy to library"
msgstr "" 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" msgid "Copy selected books to the specified library"
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18
msgid "Del" msgid "Del"
msgstr "" msgstr ""
@ -3524,35 +3565,35 @@ msgstr ""
msgid "Similar books..." msgid "Similar books..."
msgstr "" 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" msgid "Alt+A"
msgstr "" 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" msgid "Books by same author"
msgstr "" 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" msgid "Alt+S"
msgstr "" 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" msgid "Books in this series"
msgstr "" 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" msgid "Alt+P"
msgstr "" 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" msgid "Books by this publisher"
msgstr "" 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" msgid "Alt+T"
msgstr "" 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" msgid "Books with the same tags"
msgstr "" 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: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:637
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 #: /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: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:370
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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/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/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/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/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 #: /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" msgid "Select folder to open as device"
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:684
msgid "Error talking to device" msgid "Error talking to device"
msgstr "" 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/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:69
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:889 #: /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" msgid "Date"
msgstr "" msgstr ""
@ -6401,6 +6442,63 @@ msgstr ""
msgid "Downloading social metadata, please wait..." msgid "Downloading social metadata, please wait..."
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again" msgid "&Show this warning again"
msgstr "" msgstr ""
@ -7325,10 +7423,6 @@ msgstr ""
msgid "Rename the item in every book where it is used." msgid "Rename the item in every book where it is used."
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:51
msgid "Test email settings" msgid "Test email settings"
msgstr "" msgstr ""
@ -7607,48 +7701,48 @@ msgstr ""
msgid "Regular expression (?P<isbn>)" msgid "Regular expression (?P<isbn>)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:105
msgid "Cover Browser" msgid "Cover Browser"
msgstr "" 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" msgid "Shift+Alt+B"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:124
msgid "Tag Browser" msgid "Tag Browser"
msgstr "" 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" msgid "Shift+Alt+T"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:146
msgid "version" msgid "version"
msgstr "" 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" msgid "created by Kovid Goyal"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:165
msgid "Connected " msgid "Connected "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:173 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:174
msgid "Update found" msgid "Update found"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:227 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:228
msgid "Book Details" msgid "Book Details"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/init.py:220
msgid "Alt+D" msgid "Alt+D"
msgstr "" 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" msgid "Shift+Alt+D"
msgstr "" msgstr ""
@ -7720,7 +7814,7 @@ msgid "Eject this device"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:75 #: /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" msgid "Library"
msgstr "" msgstr ""
@ -9709,7 +9803,52 @@ msgstr ""
msgid "Error: You must specify a column label" msgid "Error: You must specify a column label"
msgstr "" 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 "" msgid ""
"%%prog command [options] [arguments]\n" "%%prog command [options] [arguments]\n"
"\n" "\n"
@ -9739,27 +9878,27 @@ msgstr ""
msgid "Main" msgid "Main"
msgstr "" 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>" msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "" 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>" msgid "Copying <b>%s</b>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1957 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1961
msgid "Compacting database" msgid "Compacting database"
msgstr "" 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..." msgid "Checking SQL integrity..."
msgstr "" 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." msgid "Checking for missing files."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2113 #: /home/kovid/work/calibre/src/calibre/library/database2.py:2117
msgid "Checked id" msgid "Checked id"
msgstr "" msgstr ""
@ -9955,35 +10094,39 @@ msgid ""
"overrides any per-library settings specified in the GUI" "overrides any per-library settings specified in the GUI"
msgstr "" 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" msgid "%d items"
msgstr "" 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 />" msgid "RATING: %s<br />"
msgstr "" 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 />" msgid "TAGS: %s<br />"
msgstr "" 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 />" msgid "SERIES: %s [%s]<br />"
msgstr "" 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" msgid "Books in your library"
msgstr "" 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 " msgid "By "
msgstr "" 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 " msgid "Books sorted by "
msgstr "" 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" msgid "Newest"
msgstr "" 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'): def __init__(self, name='dynamic'):
dict.__init__(self, {}) dict.__init__(self, {})
self.name = name self.name = name
self.defaults = {}
self.file_path = os.path.join(config_dir, name+'.pickle') self.file_path = os.path.join(config_dir, name+'.pickle')
self.refresh() self.refresh()
@ -520,7 +521,13 @@ class DynamicConfig(dict):
try: try:
return dict.__getitem__(self, key) return dict.__getitem__(self, key)
except KeyError: 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): def __setitem__(self, key, val):
dict.__setitem__(self, key, val) dict.__setitem__(self, key, val)
@ -555,6 +562,7 @@ class XMLConfig(dict):
def __init__(self, rel_path_to_cf_file): def __init__(self, rel_path_to_cf_file):
dict.__init__(self) dict.__init__(self)
self.defaults = {}
self.file_path = os.path.join(config_dir, self.file_path = os.path.join(config_dir,
*(rel_path_to_cf_file.split('/'))) *(rel_path_to_cf_file.split('/')))
self.file_path = os.path.abspath(self.file_path) self.file_path = os.path.abspath(self.file_path)
@ -592,7 +600,16 @@ class XMLConfig(dict):
ans = ans.data ans = ans.data
return ans return ans
except KeyError: 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): def __setitem__(self, key, val):
if isinstance(val, (bytes, str)): if isinstance(val, (bytes, str)):
@ -604,8 +621,9 @@ class XMLConfig(dict):
self.__setitem__(key, val) self.__setitem__(key, val)
def __delitem__(self, key): def __delitem__(self, key):
dict.__delitem__(self, key) if dict.has_key(self, key):
self.commit() dict.__delitem__(self, key)
self.commit()
def commit(self): def commit(self):
if hasattr(self, 'file_path') and self.file_path: if hasattr(self, 'file_path') and self.file_path:
@ -648,7 +666,16 @@ class JSONConfig(XMLConfig):
return json.dumps(self, indent=2, default=to_json) return json.dumps(self, indent=2, default=to_json)
def __getitem__(self, key): def __getitem__(self, key):
return dict.__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): def __setitem__(self, key, val):
dict.__setitem__(self, key, val) dict.__setitem__(self, key, val)