mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Merge from trunk
This commit is contained in:
commit
21b4b9f995
@ -28,3 +28,4 @@ nbproject/
|
|||||||
*.userprefs
|
*.userprefs
|
||||||
.project
|
.project
|
||||||
.pydevproject
|
.pydevproject
|
||||||
|
.settings/
|
||||||
|
@ -4,6 +4,59 @@
|
|||||||
# for important features/bug fixes.
|
# for important features/bug fixes.
|
||||||
# Also, each release can have new and improved recipes.
|
# Also, each release can have new and improved recipes.
|
||||||
|
|
||||||
|
- version: 0.7.16
|
||||||
|
date: 2010-08-27
|
||||||
|
|
||||||
|
new features:
|
||||||
|
- title: "Driver for the Kindle 3"
|
||||||
|
|
||||||
|
- title: "Users can now customize what actions appear in the toolbar and context menus via Preferences->Interface->Toolbars"
|
||||||
|
|
||||||
|
- title: "Draw a thin broder around the cover in the edit metadata dialog."
|
||||||
|
tickets: [6605]
|
||||||
|
|
||||||
|
- title: "Create (almost) all temporary files in a subdirectory so as not to clutter up temp directory"
|
||||||
|
|
||||||
|
- title: "FB2 Output: Add option to try to generate FB2 sections from the TOC. This may or may not work, depending on the file, so use with care."
|
||||||
|
|
||||||
|
- title: "Add an option to remove all tags from selected books in the bulk metadata editor."
|
||||||
|
|
||||||
|
- title: "Add a tweak to control how the dates in the Date column are formatted."
|
||||||
|
|
||||||
|
bug fixes:
|
||||||
|
- title: "Fix regression in 0.7.15 that broke the Similar books action and the add books to library from device action"
|
||||||
|
tickets: [6630, 6576]
|
||||||
|
|
||||||
|
- title: "Add ZIP and RAR to the input format order preferences."
|
||||||
|
tickets: [5879]
|
||||||
|
|
||||||
|
- title: "Update podofo in all binary builds to 0.8.2. Should fix bug where setting metadata in some PDF files would cause file truncation."
|
||||||
|
|
||||||
|
- title: "Add/remove header wizard: When running on PDF input, replace non breaking spaces with normal spaces, since it is hard to write regexps to match non breaking spaces with the regex builder wizard."
|
||||||
|
|
||||||
|
- title: "Fix crash is user tries to switch libraries whiel a device is being detected"
|
||||||
|
tickets: [6589]
|
||||||
|
|
||||||
|
- title: "Title sort now ignores leading quite character. Only applies to newly added books."
|
||||||
|
tickets: [6594]
|
||||||
|
|
||||||
|
- title: "Conversion pipeline: Don't fail if parsing extra css raises an exception. Instead just ignore it."
|
||||||
|
|
||||||
|
- title: "SONY driver: Use the tz field (available in newer readers) to set timestamps correctly, when available."
|
||||||
|
|
||||||
|
- title: "Shortening file paths: Handle the case of very long filenames with periods in them."
|
||||||
|
tickets: [6566]
|
||||||
|
|
||||||
|
new recipes:
|
||||||
|
- title: "The TMZ and Atlanta Journal Constitution"
|
||||||
|
author: Tony Stegall
|
||||||
|
|
||||||
|
- title: "Consumerist and Gawker Media"
|
||||||
|
author: Trickery
|
||||||
|
|
||||||
|
improved recipes:
|
||||||
|
- National Review Online
|
||||||
|
|
||||||
- version: 0.7.15
|
- version: 0.7.15
|
||||||
date: 2010-08-20
|
date: 2010-08-20
|
||||||
|
|
||||||
|
114
resources/calibre-portable.bat
Normal file
114
resources/calibre-portable.bat
Normal 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%
|
@ -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.
|
||||||
|
BIN
resources/images/news/fstream.png
Normal file
BIN
resources/images/news/fstream.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 636 B |
BIN
resources/images/news/la_jornada.png
Normal file
BIN
resources/images/news/la_jornada.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 943 B |
@ -18,7 +18,7 @@ class Clarin(BasicNewsRecipe):
|
|||||||
use_embedded_content = False
|
use_embedded_content = False
|
||||||
no_stylesheets = True
|
no_stylesheets = True
|
||||||
encoding = 'utf8'
|
encoding = 'utf8'
|
||||||
language = 'es_AR'
|
language = 'es'
|
||||||
publication_type = 'newspaper'
|
publication_type = 'newspaper'
|
||||||
INDEX = 'http://www.clarin.com'
|
INDEX = 'http://www.clarin.com'
|
||||||
masthead_url = 'http://www.clarin.com/static/CLAClarin/images/logo-clarin-print.jpg'
|
masthead_url = 'http://www.clarin.com/static/CLAClarin/images/logo-clarin-print.jpg'
|
||||||
|
68
resources/recipes/europasur.recipe
Normal file
68
resources/recipes/europasur.recipe
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
|
||||||
|
'''
|
||||||
|
europasur.es
|
||||||
|
'''
|
||||||
|
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class Europasur(BasicNewsRecipe):
|
||||||
|
title = 'Europa Sur'
|
||||||
|
__author__ = 'Darko Miletic'
|
||||||
|
description = 'News in Spanish'
|
||||||
|
publisher = 'Joly Digital'
|
||||||
|
category = 'news, politics, Spanish'
|
||||||
|
oldest_article = 2
|
||||||
|
max_articles_per_feed = 100
|
||||||
|
use_embedded_content = False
|
||||||
|
remove_empty_feeds = True
|
||||||
|
delay = 2
|
||||||
|
no_stylesheets = True
|
||||||
|
encoding = 'cp1252'
|
||||||
|
language = 'es'
|
||||||
|
publication_type = 'newspaper'
|
||||||
|
extra_css = """ body{font-family: Verdana,Arial,Helvetica,sans-serif}
|
||||||
|
h2{font-family: Georgia,Times New Roman,Times,serif}
|
||||||
|
.subtitle{font-weight:bold}
|
||||||
|
.caption{font-size: small}
|
||||||
|
.body{font-size: 1.1em}
|
||||||
|
.info{color: #848484}
|
||||||
|
"""
|
||||||
|
|
||||||
|
conversion_options = {
|
||||||
|
'comment' : description
|
||||||
|
, 'tags' : category
|
||||||
|
, 'publisher': publisher
|
||||||
|
, 'language' : language
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_only_tags = [
|
||||||
|
dict(attrs={'class':['titles','current']})
|
||||||
|
,dict(attrs={'id':'newsBody'})
|
||||||
|
]
|
||||||
|
remove_tags = [
|
||||||
|
dict(name=['iframe','base','embed','object'])
|
||||||
|
,dict(name='a', attrs={'class':'zoom thickbox'})
|
||||||
|
,dict(name='div', attrs={'class':'other'})
|
||||||
|
]
|
||||||
|
remove_attributes = ['width','height']
|
||||||
|
|
||||||
|
feeds = [
|
||||||
|
(u'Portada', u'http://www.europasur.es/rss/articles.php')
|
||||||
|
,(u'Deportes', u'http://www.europasur.es/rss/articles.php?sec=1224')
|
||||||
|
,(u'Economia', u'http://www.europasur.es/rss/articles.php?sec=427')
|
||||||
|
,(u'Espana', u'http://www.europasur.es/rss/articles.php?sec=437')
|
||||||
|
,(u'Mundo', u'http://www.europasur.es/rss/articles.php?sec=428')
|
||||||
|
,(u'Pasarela', u'http://www.europasur.es/rss/articles.php?sec=1958')
|
||||||
|
,(u'Ocio y cultura', u'http://www.europasur.es/rss/articles.php?sec=1210')
|
||||||
|
,(u'Opinion', u'http://www.europasur.es/rss/articles.php?sec=1195')
|
||||||
|
,(u'Tecnologia', u'http://www.europasur.es/rss/articles.php?sec=1681')
|
||||||
|
,(u'Salud', u'http://www.europasur.es/rss/articles.php?sec=2379')
|
||||||
|
]
|
||||||
|
|
||||||
|
def image_url_processor(self, baseurl, url):
|
||||||
|
artl, sep, width = url.rpartition('&an=')
|
||||||
|
artid, sep, ext = artl.rpartition('.')
|
||||||
|
article_id = artid.rpartition('/')[2]
|
||||||
|
return 'http://media.grupojoly.com/cache/' + article_id + '_' + width + 'x' + width + '_' + ext + '000.' + ext
|
64
resources/recipes/fstream.recipe
Normal file
64
resources/recipes/fstream.recipe
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class FIELDSTREAM(BasicNewsRecipe):
|
||||||
|
title = 'Field and Stream'
|
||||||
|
__author__ = 'Starson17 and Tonythebookworm'
|
||||||
|
description = 'Hunting and Fishing and Gun Talk'
|
||||||
|
language = 'en'
|
||||||
|
no_stylesheets = True
|
||||||
|
publisher = 'Starson17 and Tonythebookworm'
|
||||||
|
category = 'food recipes, hunting, fishing, guns'
|
||||||
|
use_embedded_content= False
|
||||||
|
no_stylesheets = True
|
||||||
|
oldest_article = 24
|
||||||
|
remove_javascript = True
|
||||||
|
remove_empty_feeds = True
|
||||||
|
masthead_url = 'http://www.fieldandstream.com/sites/all/themes/fs/logo.png'
|
||||||
|
cover_url = 'http://www.arrowheadflyangler.com/Portals/1/Articles/FieldStream/Field%20and%20Stream%20March%20Fishing%20Edition%20Article%20Cover.jpg'
|
||||||
|
# recursions = 0
|
||||||
|
max_articles_per_feed = 10
|
||||||
|
INDEX = 'http://www.fieldandstream.com'
|
||||||
|
|
||||||
|
keep_only_tags = [dict(name='div', attrs={'class':['interior-main']})
|
||||||
|
]
|
||||||
|
remove_tags = [dict(name='div', attrs={'id':['comments']})]
|
||||||
|
|
||||||
|
def parse_index(self):
|
||||||
|
feeds = []
|
||||||
|
for title, url in [
|
||||||
|
(u"Wild Chef", u"http://www.fieldandstream.com/blogs/wild-chef"),
|
||||||
|
(u"The Gun Nut", u"http://www.fieldandstream.com/blogs/gun-nut"),
|
||||||
|
(u"Whitetail 365", u"http://www.fieldandstream.com/blogs/whitetail-365"),
|
||||||
|
(u"Fly Talk", u"http://www.fieldandstream.com/blogs/flytalk"),
|
||||||
|
(u"Generation Wild", u"http://www.fieldandstream.com/blogs/generation-wild"),
|
||||||
|
(u"Conservationist", u"http://www.fieldandstream.com/blogs/conservationist"),
|
||||||
|
(u"Honest Angler", u"http://www.fieldandstream.com/blogs/honest-angler"),
|
||||||
|
(u"Mans Best Friend", u"http://www.fieldandstream.com/blogs/mans-best-friend"),
|
||||||
|
|
||||||
|
]:
|
||||||
|
articles = self.make_links(url)
|
||||||
|
if articles:
|
||||||
|
feeds.append((title, articles))
|
||||||
|
return feeds
|
||||||
|
|
||||||
|
def make_links(self, url):
|
||||||
|
title = 'Temp'
|
||||||
|
current_articles = []
|
||||||
|
soup = self.index_to_soup(url)
|
||||||
|
print 'The soup is: ', soup
|
||||||
|
for item in soup.findAll('h2'):
|
||||||
|
print 'item is: ', item
|
||||||
|
link = item.find('a')
|
||||||
|
print 'the link is: ', link
|
||||||
|
if link:
|
||||||
|
url = self.INDEX + link['href']
|
||||||
|
title = self.tag_to_string(link)
|
||||||
|
print 'the title is: ', title
|
||||||
|
print 'the url is: ', url
|
||||||
|
print 'the title is: ', title
|
||||||
|
current_articles.append({'title': title, 'url': url, 'description':'', 'date':''}) # append all this
|
||||||
|
return current_articles
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
55
resources/recipes/hawaii.recipe
Normal file
55
resources/recipes/hawaii.recipe
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class AdvancedUserRecipe1282101454(BasicNewsRecipe):
|
||||||
|
title = 'West Hawaii Today'
|
||||||
|
language = 'en'
|
||||||
|
__author__ = 'Tony Stegall'
|
||||||
|
description = 'Westhawaiitoday.com'
|
||||||
|
publisher = 'West Hawaii '
|
||||||
|
category = 'news,Hawaii,USA'
|
||||||
|
oldest_article = 7
|
||||||
|
max_articles_per_feed = 100
|
||||||
|
no_stylesheets = True
|
||||||
|
remove_javascript = True
|
||||||
|
|
||||||
|
masthead_url = 'http://images.townnews.com/westhawaiitoday.com/art/whttoplogo.gif'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
feeds = [
|
||||||
|
('Local News', 'http://www.westhawaiitoday.com/?rss=local/'),
|
||||||
|
('Local Sports', 'http://www.westhawaiitoday.com/?rss=sports/local_sports/'),
|
||||||
|
('Big Fish List', 'http://www.westhawaiitoday.com/?rss=sports/big_fish_list/'),
|
||||||
|
('Local Features' 'http://www.westhawaiitoday.com/?rss=features/'),
|
||||||
|
('Obituaries', 'http://www.westhawaiitoday.com/?rss=obituaries/'),
|
||||||
|
('Letters To Editor', 'http://www.westhawaiitoday.com/?rss=opinion/letters_-_your_voice/'),
|
||||||
|
('Editorial', 'http://www.westhawaiitoday.com/?rss=opinion/editorial/'),
|
||||||
|
('Columns', 'http://www.westhawaiitoday.com/?rss=opinion/columns/'),
|
||||||
|
('Volcano Update Sunday', 'http://www.westhawaiitoday.com/?rss=volcano/')
|
||||||
|
]
|
||||||
|
|
||||||
|
def print_version(self, url):
|
||||||
|
split1 = url.split("//")
|
||||||
|
url1 = split1[1]
|
||||||
|
xxx = split1[2]
|
||||||
|
split2 = xxx.split(".")
|
||||||
|
artid = split2[0]
|
||||||
|
print 'ARTICLE ID IS: ', artid
|
||||||
|
|
||||||
|
#example of link to convert
|
||||||
|
#Original link: http://www.westhawaiitoday.com/articles/2010/08/27/local//local01.txt
|
||||||
|
#print version: http://www.westhawaiitoday.com/articles/2010/08/27/local//local01.prt
|
||||||
|
|
||||||
|
print_url = 'http://' + url1 + '//' + artid + '.prt'
|
||||||
|
print 'print_url is: ', print_url
|
||||||
|
return print_url
|
||||||
|
|
||||||
|
#test with ebook-convert hawaii.recipe output_dir --test -vv > myrecipe.txt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,120 +1,64 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
__license__ = 'GPL v3'
|
__license__ = 'GPL v3'
|
||||||
__copyright__ = '2010, Rogelio Dominguez <rogelio.dominguez at gmail.com>'
|
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
|
||||||
'''
|
'''
|
||||||
www.jornada.unam.mx
|
www.jornada.unam.mx
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
from calibre import strftime
|
||||||
from calibre.web.feeds.news import BasicNewsRecipe
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup
|
|
||||||
|
|
||||||
import re
|
class LaJornada_mx(BasicNewsRecipe):
|
||||||
|
title = 'La Jornada (Mexico)'
|
||||||
class LaJornada(BasicNewsRecipe):
|
__author__ = 'Darko Miletic'
|
||||||
title = u'La Jornada'
|
description = 'Noticias del diario mexicano La Jornada'
|
||||||
language = 'es'
|
publisher = 'DEMOS, Desarrollo de Medios, S.A. de C.V.'
|
||||||
oldest_article = 1
|
category = 'news, Mexico'
|
||||||
__author__ = 'rogeliodh'
|
oldest_article = 2
|
||||||
max_articles_per_feed = 100
|
max_articles_per_feed = 200
|
||||||
remove_tags = [dict(name='div', attrs={'class':['go gui','go gui top','comment-cont',]})]
|
|
||||||
remove_tags_before = dict(id='article-cont')
|
|
||||||
remove_tags_after = dict(id='article-cont')
|
|
||||||
no_stylesheets = True
|
no_stylesheets = True
|
||||||
extra_css = ' .series{ \
|
encoding = 'utf8'
|
||||||
border-bottom: 1px solid #626366; \
|
use_embedded_content = False
|
||||||
font-weight: bold; \
|
language = 'es'
|
||||||
} \
|
remove_empty_feeds = True
|
||||||
.sumario{ \
|
cover_url = strftime("http://www.jornada.unam.mx/%Y/%m/%d/planitas/portadita.jpg")
|
||||||
font-weight: bold; \
|
masthead_url = 'http://www.jornada.unam.mx/v7.0/imagenes/la-jornada-trans.png'
|
||||||
margin-top: 2em; \
|
extra_css = """
|
||||||
text-align: center \
|
body{font-family: "Times New Roman",serif }
|
||||||
} \
|
.cabeza{font-size: xx-large; font-weight: bold }
|
||||||
p.sumario{ \
|
.credito-articulo{font-size: 1.3em}
|
||||||
text-align: center \
|
"""
|
||||||
} \
|
|
||||||
.sumarios{font-weight: bold} \
|
|
||||||
.cabeza{ font-size: 1.5em} \
|
|
||||||
.pie-foto { \
|
|
||||||
text-align: justify; \
|
|
||||||
font-size: 0.8em; \
|
|
||||||
text-align: justify; \
|
|
||||||
} \
|
|
||||||
.pie-foto .credito { \
|
|
||||||
font-weight: bold; \
|
|
||||||
display: block \
|
|
||||||
} \
|
|
||||||
.credito-autor{ \
|
|
||||||
margin-top: 1.5em; \
|
|
||||||
padding-left: 0.6em; \
|
|
||||||
border-bottom: 1px solid #626366; \
|
|
||||||
font-variant: small-caps; \
|
|
||||||
font-weight: bold \
|
|
||||||
} \
|
|
||||||
.credito-articulo{ \
|
|
||||||
margin-top: 1.5em; \
|
|
||||||
padding-left: 0.6em; \
|
|
||||||
border-bottom: 1px solid #626366; \
|
|
||||||
font-variant: small-caps; \
|
|
||||||
font-weight: bold \
|
|
||||||
} \
|
|
||||||
.credito-titulo{text-align: right} \
|
|
||||||
.hemero { \
|
|
||||||
text-align: right; \
|
|
||||||
font-size: 0.9em; \
|
|
||||||
margin-bottom: 8px; \
|
|
||||||
} \
|
|
||||||
.loc { \
|
|
||||||
font-weight: bold; \
|
|
||||||
} \
|
|
||||||
.carton { \
|
|
||||||
text-align: center; \
|
|
||||||
} \
|
|
||||||
.credit { \
|
|
||||||
font-weight: bold; \
|
|
||||||
} \
|
|
||||||
'
|
|
||||||
|
|
||||||
preprocess_regexps = [
|
conversion_options = {
|
||||||
# Remove capitalized initial letter on some articles (editorial)
|
'comment' : description
|
||||||
(re.compile(r'<div class="inicial">(.*)</div><p class="s-s">', re.DOTALL|re.IGNORECASE),
|
, 'tags' : category
|
||||||
lambda match: match.group(1)),
|
, 'publisher' : publisher
|
||||||
# Cartons section uses a class instead of a div to identify the main content. Change it.
|
, 'language' : language
|
||||||
(re.compile(r'class="carton"', re.DOTALL|re.IGNORECASE),
|
}
|
||||||
lambda match: 'id="article-cont" class="carton"'),
|
|
||||||
# Remove <link rel="alternate"> as calibre has a bug (to report)
|
keep_only_tags = [
|
||||||
(re.compile(r'<link rel="alternate".*?/>', re.DOTALL|re.IGNORECASE),
|
dict(name='div', attrs={'class':['documentContent','cabeza','sumarios','text']})
|
||||||
lambda match: ''),
|
,dict(name='div', attrs={'id':'renderComments'})
|
||||||
]
|
]
|
||||||
|
remove_tags = [dict(name='div', attrs={'class':'buttonbar'})]
|
||||||
|
|
||||||
INDEX = 'http://www.jornada.unam.mx/rss/edicion.xml'
|
|
||||||
feeds = [
|
feeds = [
|
||||||
(u'Opinion','http://www.jornada.unam.mx/rss/opinion.xml'),
|
(u'Ultimas noticias' , u'http://www.jornada.unam.mx/ultimas/news/RSS' )
|
||||||
(u'Cartones','http://www.jornada.unam.mx/rss/cartones.xml'),
|
,(u'Opinion' , u'http://www.jornada.unam.mx/rss/opinion.xml' )
|
||||||
(u'Política','http://www.jornada.unam.mx/rss/politica.xml'),
|
,(u'Politica' , u'http://www.jornada.unam.mx/rss/politica.xml' )
|
||||||
(u'Economía','http://www.jornada.unam.mx/rss/economia.xml'),
|
,(u'Economia' , u'http://www.jornada.unam.mx/rss/economia.xml' )
|
||||||
(u'Mundo','http://www.jornada.unam.mx/rss/mundo.xml'),
|
,(u'Mundo' , u'http://www.jornada.unam.mx/rss/mundo.xml' )
|
||||||
(u'Estados','http://www.jornada.unam.mx/rss/estados.xml'),
|
,(u'Estados' , u'http://www.jornada.unam.mx/rss/estados.xml' )
|
||||||
(u'Capital','http://www.jornada.unam.mx/rss/capital.xml'),
|
,(u'Capital' , u'http://www.jornada.unam.mx/rss/capital.xml' )
|
||||||
(u'Sociedad','http://www.jornada.unam.mx/rss/sociedad.xml'),
|
,(u'Sociedad y justicia' , u'http://www.jornada.unam.mx/rss/sociedad.xml' )
|
||||||
(u'Ciencias','http://www.jornada.unam.mx/rss/ciencias.xml'),
|
,(u'Ciencias' , u'http://www.jornada.unam.mx/rss/ciencias.xml' )
|
||||||
(u'Cultura','http://www.jornada.unam.mx/rss/cultura.xml'),
|
,(u'Cultura' , u'http://www.jornada.unam.mx/rss/cultura.xml' )
|
||||||
(u'Gastronomia','http://www.jornada.unam.mx/rss/gastronomia.xml'),
|
,(u'Gastronomia' , u'http://www.jornada.unam.mx/rss/gastronomia.xml' )
|
||||||
(u'Espectáculos','http://www.jornada.unam.mx/rss/espectaculos.xml'),
|
,(u'Espectaculos' , u'http://www.jornada.unam.mx/rss/espectaculos.xml' )
|
||||||
(u'Deportes','http://www.jornada.unam.mx/rss/deportes.xml'),
|
,(u'Deportes' , u'http://www.jornada.unam.mx/rss/deportes.xml' )
|
||||||
]
|
]
|
||||||
|
|
||||||
def get_cover_url(self):
|
def preprocess_html(self, soup):
|
||||||
'''
|
for item in soup.findAll(style=True):
|
||||||
Cover URL is http://www.jornada.unam.mx/YYYY/MM/DD/portada.pdf
|
del item['style']
|
||||||
'''
|
return soup
|
||||||
cover_url = None
|
|
||||||
soup = self.index_to_soup(self.INDEX)
|
|
||||||
soupstone = BeautifulStoneSoup(str(soup))
|
|
||||||
urlbase = str(soupstone('link')[0])
|
|
||||||
r= re.compile(r'.*http://www.jornada.unam.mx/([0-9]{4})/([0-9]{2})/([0-9]{2})', re.DOTALL|re.IGNORECASE)
|
|
||||||
m = r.match(urlbase)
|
|
||||||
if m:
|
|
||||||
cover_url = 'http://www.jornada.unam.mx/' + m.groups()[0] + '/' + m.groups()[1] + '/' + m.groups()[2] + '/portada.pdf'
|
|
||||||
|
|
||||||
return cover_url
|
|
||||||
|
50
resources/recipes/mdj.recipe
Normal file
50
resources/recipes/mdj.recipe
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class AdvancedUserRecipe1282101454(BasicNewsRecipe):
|
||||||
|
title = 'Marietta Daily Journal'
|
||||||
|
__author__ = 'Tony Stegall'
|
||||||
|
language = 'en'
|
||||||
|
description = 'Marietta Ga and Metro Atlanta News'
|
||||||
|
publisher = 'MDJ'
|
||||||
|
category = 'news,politics,Georgia,USA'
|
||||||
|
oldest_article = 1
|
||||||
|
max_articles_per_feed = 100
|
||||||
|
no_stylesheets = True
|
||||||
|
remove_javascript = True
|
||||||
|
|
||||||
|
masthead_url = 'http://assets.matchbin.com/sites/624/assets/logo.gif'
|
||||||
|
|
||||||
|
|
||||||
|
keep_only_tags = [
|
||||||
|
dict(name='div', attrs={'id':['print_content_container']})
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
feeds = [
|
||||||
|
('Local News', 'http://mdjonline.com/rss/rss/Local+News?content_type=article&tags=news&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Local+News'),
|
||||||
|
('Sports', 'http://mdjonline.com/rss/rss/Sports?content_type=article&tags=sports&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Sports'),
|
||||||
|
('Obits', 'http://mdjonline.com/rss/rss/Obits?content_type=article&tags=obits&page_name=rss&tag_inclusion=or&offset=0&limit=20&instance=Obits'),
|
||||||
|
('Editorial & oped', 'http://mdjonline.com/rss/rss/Editorial+and+OPED?content_type=article&tags=oped+editorial&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Editorial+and+OPED'),
|
||||||
|
('Lifestyle', 'http://mdjonline.com/rss/rss/Lifestyle?content_type=article&tags=lifestyle&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Lifestyle'),
|
||||||
|
('Blogs', 'http://mdjonline.com/rss/rss/Lifestyle?content_type=article&tags=lifestyle&page_name=rss&tag_inclusion=or&offset=0&limit=10&instance=Lifestyle')
|
||||||
|
]
|
||||||
|
|
||||||
|
def print_version(self, url):
|
||||||
|
split1 = url.split("/")
|
||||||
|
artid = split1[4]
|
||||||
|
|
||||||
|
#example of link to convert
|
||||||
|
#Original link: http://mdjonline.com/bookmark/9274197
|
||||||
|
#print version: http://mdjonline.com/printer_friendly/9274197
|
||||||
|
|
||||||
|
print_url = 'http://mdjonline.com/printer_friendly/' + artid
|
||||||
|
return print_url
|
||||||
|
|
||||||
|
#test with ebook-convert nejm.recipe output_dir --test -vv > myrecipe.txt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -35,16 +35,17 @@ class NRO(BasicNewsRecipe):
|
|||||||
|
|
||||||
feeds = [
|
feeds = [
|
||||||
|
|
||||||
(u'National Review', u'http://www.nationalreview.com/index.xml'),
|
(u'National Review', u'http://www.nationalreview.com/articles/feed'),
|
||||||
(u'The Corner', u'http://corner.nationalreview.com/corner.xml'),
|
(u'The Corner', u'http://www.nationalreview.com/corner/feed'),
|
||||||
(u'The Agenda', u'http://agenda.nationalreview.com/agenda.xml'),
|
(u'The Agenda', u'http://www.nationalreview.com/agenda/feed'),
|
||||||
(u'Bench Memos', u'http://bench.nationalreview.com/bench.xml'),
|
(u'Bench Memos', u'http://www.nationalreview.com/bench-memos/feed'),
|
||||||
(u'Campaign Spot', u'http://campaignspot.nationalreview.com/campaignspot.xml'),
|
(u'Campaign Spot', u'http://www.nationalreview.com/campaign-spot/feed'),
|
||||||
(u'Critical Care', u'http://healthcare.nationalreview.com/healthcare.xml'),
|
(u'Battle 10', u'http://www.nationalreview.com/battle10/feed'),
|
||||||
(u'Doctor, Doctor', u'http://www.nationalreview.com/doctor/doctor.xml'),
|
(u'Critical Care', u'http://www.nationalreview.com/critical-condition/feed'),
|
||||||
(u"Kudlow's Money Politic$", u'http://kudlow.nationalreview.com/kudlow.xml'),
|
(u"Kudlow's Money Politic$", u'http://www.nationalreview.com/kudlows-money-politics/feed'),
|
||||||
(u'Media Blog', u'http://media.nationalreview.com/media.xml'),
|
(u'Media Blog', u'http://www.nationalreview.com/media-blog/feed'),
|
||||||
(u'Phi Beta Cons', u'http://phibetacons.nationalreview.com/phibetacons.xml'),
|
(u'Exchequer', u'http://www.nationalreview.com/exchequer/feed'),
|
||||||
(u'Planet Gore', u'http://planetgore.nationalreview.com/planetgore.xml')
|
(u'Phi Beta Cons', u'http://www.nationalreview.com/phi-beta-cons/feed'),
|
||||||
|
(u'Planet Gore', u'http://www.nationalreview.com/planet-gore/feed')
|
||||||
|
|
||||||
]
|
]
|
@ -102,7 +102,6 @@ class PeriodicalNameHere(BasicNewsRecipe):
|
|||||||
|
|
||||||
todays_section = soup.find(True, attrs={'class':'todaydateline'})
|
todays_section = soup.find(True, attrs={'class':'todaydateline'})
|
||||||
self.section_dates.append(self.tag_to_string(todays_section,use_alt=False))
|
self.section_dates.append(self.tag_to_string(todays_section,use_alt=False))
|
||||||
self.section_dates.append(self.tag_to_string(todays_section,use_alt=False))
|
|
||||||
|
|
||||||
older_section_dates = soup.findAll(True, attrs={'class':'maindateline'})
|
older_section_dates = soup.findAll(True, attrs={'class':'maindateline'})
|
||||||
for older_section in older_section_dates :
|
for older_section in older_section_dates :
|
||||||
|
67
resources/recipes/tmz.recipe
Normal file
67
resources/recipes/tmz.recipe
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class AdvancedUserRecipe1282101454(BasicNewsRecipe):
|
||||||
|
title = 'The TMZ'
|
||||||
|
__author__ = 'Tony Stegall'
|
||||||
|
description = 'Celeb Gossip and News'
|
||||||
|
language = 'en'
|
||||||
|
publisher = 'The TMZ'
|
||||||
|
category = 'news, celebrity, USA'
|
||||||
|
oldest_article = 1
|
||||||
|
max_articles_per_feed = 100
|
||||||
|
no_stylesheets = True
|
||||||
|
remove_javascript = True
|
||||||
|
masthead_url = 'http://t0.gstatic.com/images?q=tbn:t43QkABe_BmaWM:http://www.thetreymoore.com/logos/TMZ%20logo%20(crop).JPG'
|
||||||
|
|
||||||
|
extra_css = '''
|
||||||
|
h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
|
||||||
|
h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
|
||||||
|
p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
|
||||||
|
body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
|
||||||
|
'''
|
||||||
|
|
||||||
|
remove_tags = [
|
||||||
|
dict(name='div' , attrs={'id':['sidebar','print-actions'] })
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
feeds = [
|
||||||
|
('TOP 20', 'http://www.tmz.com/rss.xml'),
|
||||||
|
('Exclusives', 'http://www.tmz.com/category/exclusives/rss.xml'),
|
||||||
|
('Celeb Justice', 'http://www.tmz.com/category/celebrity-justice/rss.xml'),
|
||||||
|
('Celeb Feuds', 'http://www.tmz.com/category/celebrity-feuds/rss.xml'),
|
||||||
|
('Politix', 'http://www.tmz.com/category/politix/rss.xml'),
|
||||||
|
('Music', 'http://www.tmz.com/category/music/rss.xml'),
|
||||||
|
('Movies', 'http://www.tmz.com/category/movies/rss.xml'),
|
||||||
|
('TV', 'http://www.tmz.com/category/tv/rss.xml'),
|
||||||
|
('Sports', 'http://www.tmz.com/category/TMZsports/rss.xml'),
|
||||||
|
('Hook-Ups', 'http://www.tmz.com/category/hook-ups/rss.xml'),
|
||||||
|
('Beauty', 'http://www.tmz.com/category/beauty/rss.xml'),
|
||||||
|
('Fashion', 'http://www.tmz.com/category/fashion/rss.xml'),
|
||||||
|
('Gossip & Rumor', 'http://www.tmz.com/category/gossip-rumors/rss.xml'),
|
||||||
|
('Hot Mama', 'http://www.tmz.com/category/hot-mamas/rss.xml'),
|
||||||
|
('Party All The Time', 'http://www.tmz.com/category/party-all-the-time/rss.xml'),
|
||||||
|
('Ride Me!', 'http://www.tmz.com/category/ride-me/rss.xml'),
|
||||||
|
('Stars in Heat', 'http://www.tmz.com/category/stars-in-heat/rss.xml'),
|
||||||
|
('Vegas', 'http://www.tmz.com/category/hot-vegas/rss.xml')
|
||||||
|
]
|
||||||
|
|
||||||
|
def print_version(self, url):
|
||||||
|
print_url = url +'print'
|
||||||
|
return print_url
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
30
resources/recipes/winnipeg_free_press.recipe
Normal file
30
resources/recipes/winnipeg_free_press.recipe
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class WinnipegFreePress(BasicNewsRecipe):
|
||||||
|
title = u'Winnipeg Free Press'
|
||||||
|
__author__ = 'buyo'
|
||||||
|
description = 'News from Winnipeg, Manitoba, Canada'
|
||||||
|
oldest_article = 1
|
||||||
|
max_articles_per_feed = 15
|
||||||
|
category = 'News, Winnipeg, Canada'
|
||||||
|
cover_url = 'http://media.winnipegfreepress.com/designimages/winnipegfreepress_WFP.gif'
|
||||||
|
no_stylesheets = True
|
||||||
|
encoding = 'UTF-8'
|
||||||
|
remove_javascript = True
|
||||||
|
use_embedded_content = False
|
||||||
|
language = 'en_CA'
|
||||||
|
|
||||||
|
feeds = [(u'Breaking News', u'http://www.winnipegfreepress.com/rss?path=/breakingnews'),
|
||||||
|
(u'Local News',u'http://www.winnipegfreepress.com/rss?path=/local'),
|
||||||
|
(u'Breaking Business News',u'http://www.winnipegfreepress.com/rss?path=/business/finance'),
|
||||||
|
(u'Business',u'http://www.winnipegfreepress.com/rss?path=/business'),
|
||||||
|
(u'Editorials',u'http://www.winnipegfreepress.com/rss?path=/opinion/editorials'),
|
||||||
|
(u'Views from the West',u'http://www.winnipegfreepress.com/rss?path=/opinion/westview'),
|
||||||
|
(u'Life & Style',u'http://www.winnipegfreepress.com/rss?path=/life'),
|
||||||
|
(u'Food & Drink',u'http://www.winnipegfreepress.com/rss?path=/life/food')
|
||||||
|
]
|
||||||
|
|
||||||
|
keep_only_tags = [
|
||||||
|
dict(name='div', attrs={'id':'article_header'}),
|
||||||
|
dict(name='div', attrs={'class':'article'}),
|
||||||
|
]
|
@ -48,7 +48,7 @@ class LinuxFreeze(Command):
|
|||||||
'/usr/lib/libsqlite3.so.0',
|
'/usr/lib/libsqlite3.so.0',
|
||||||
'/usr/lib/libsqlite3.so.0',
|
'/usr/lib/libsqlite3.so.0',
|
||||||
'/usr/lib/libmng.so.1',
|
'/usr/lib/libmng.so.1',
|
||||||
'/usr/lib/libpodofo.so.0.8.1',
|
'/usr/lib/libpodofo.so.0.8.2',
|
||||||
'/lib/libz.so.1',
|
'/lib/libz.so.1',
|
||||||
'/lib/libuuid.so.1',
|
'/lib/libuuid.so.1',
|
||||||
'/usr/lib/libtiff.so.5',
|
'/usr/lib/libtiff.so.5',
|
||||||
|
@ -401,7 +401,7 @@ class Py2App(object):
|
|||||||
@flush
|
@flush
|
||||||
def add_podofo(self):
|
def add_podofo(self):
|
||||||
info('\nAdding PoDoFo')
|
info('\nAdding PoDoFo')
|
||||||
pdf = join(SW, 'lib', 'libpodofo.0.8.1.dylib')
|
pdf = join(SW, 'lib', 'libpodofo.0.8.2.dylib')
|
||||||
self.install_dylib(pdf)
|
self.install_dylib(pdf)
|
||||||
|
|
||||||
@flush
|
@flush
|
||||||
|
@ -230,14 +230,14 @@ SET(WANT_LIB64 FALSE)
|
|||||||
SET(PODOFO_BUILD_SHARED TRUE)
|
SET(PODOFO_BUILD_SHARED TRUE)
|
||||||
SET(PODOFO_BUILD_STATIC FALSE)
|
SET(PODOFO_BUILD_STATIC FALSE)
|
||||||
|
|
||||||
cp build/podofo/build/src/Release/podofo.dll bin/
|
cp build/podofo-*/build/src/Release/podofo.dll bin/
|
||||||
cp build/podofo/build/src/Release/podofo.lib lib/
|
cp build/podofo-*/build/src/Release/podofo.lib lib/
|
||||||
cp build/podofo/build/src/Release/podofo.exp lib/
|
cp build/podofo-*/build/src/Release/podofo.exp lib/
|
||||||
|
|
||||||
cp build/podofo/build/podofo_config.h include/podofo/
|
cp build/podofo-*/build/podofo_config.h include/podofo/
|
||||||
cp -r build/podofo/src/* include/podofo/
|
cp -r build/podofo-*/src/* include/podofo/
|
||||||
|
|
||||||
You have to use >0.8.1 (>= revision 1269)
|
You have to use >=0.8.2
|
||||||
|
|
||||||
The following patch (against -r1269) was required to get it to compile:
|
The following patch (against -r1269) was required to get it to compile:
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
__appname__ = 'calibre'
|
__appname__ = 'calibre'
|
||||||
__version__ = '0.7.15'
|
__version__ = '0.7.16'
|
||||||
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
||||||
|
|
||||||
import re
|
import re
|
||||||
@ -84,6 +84,9 @@ if plugins is None:
|
|||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# config_dir {{{
|
# config_dir {{{
|
||||||
|
|
||||||
|
CONFIG_DIR_MODE = 0700
|
||||||
|
|
||||||
if os.environ.has_key('CALIBRE_CONFIG_DIRECTORY'):
|
if os.environ.has_key('CALIBRE_CONFIG_DIRECTORY'):
|
||||||
config_dir = os.path.abspath(os.environ['CALIBRE_CONFIG_DIRECTORY'])
|
config_dir = os.path.abspath(os.environ['CALIBRE_CONFIG_DIRECTORY'])
|
||||||
elif iswindows:
|
elif iswindows:
|
||||||
@ -98,7 +101,11 @@ elif isosx:
|
|||||||
else:
|
else:
|
||||||
bdir = os.path.abspath(os.path.expanduser(os.environ.get('XDG_CONFIG_HOME', '~/.config')))
|
bdir = os.path.abspath(os.path.expanduser(os.environ.get('XDG_CONFIG_HOME', '~/.config')))
|
||||||
config_dir = os.path.join(bdir, 'calibre')
|
config_dir = os.path.join(bdir, 'calibre')
|
||||||
if not os.access(config_dir, os.W_OK):
|
try:
|
||||||
|
os.makedirs(config_dir, mode=CONFIG_DIR_MODE)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if not os.access(config_dir, os.W_OK) or not os.access(config_dir, os.X_OK):
|
||||||
print 'No write acces to', config_dir, 'using a temporary dir instead'
|
print 'No write acces to', config_dir, 'using a temporary dir instead'
|
||||||
import tempfile, atexit
|
import tempfile, atexit
|
||||||
config_dir = tempfile.mkdtemp(prefix='calibre-config-')
|
config_dir = tempfile.mkdtemp(prefix='calibre-config-')
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
@ -5,7 +5,8 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
|||||||
import textwrap
|
import textwrap
|
||||||
import os
|
import os
|
||||||
import glob
|
import glob
|
||||||
from calibre.customize import FileTypePlugin, MetadataReaderPlugin, MetadataWriterPlugin
|
from calibre.customize import FileTypePlugin, MetadataReaderPlugin, \
|
||||||
|
MetadataWriterPlugin, PreferencesPlugin, InterfaceActionBase
|
||||||
from calibre.constants import numeric_version
|
from calibre.constants import numeric_version
|
||||||
from calibre.ebooks.metadata.archive import ArchiveExtract, get_cbz_metadata
|
from calibre.ebooks.metadata.archive import ArchiveExtract, get_cbz_metadata
|
||||||
|
|
||||||
@ -577,7 +578,7 @@ plugins += [x for x in list(locals().values()) if isinstance(x, type) and \
|
|||||||
x.__name__.endswith('MetadataWriter')]
|
x.__name__.endswith('MetadataWriter')]
|
||||||
plugins += input_profiles + output_profiles
|
plugins += input_profiles + output_profiles
|
||||||
|
|
||||||
from calibre.customize import InterfaceActionBase
|
# Interface Actions {{{
|
||||||
|
|
||||||
class ActionAdd(InterfaceActionBase):
|
class ActionAdd(InterfaceActionBase):
|
||||||
name = 'Add Books'
|
name = 'Add Books'
|
||||||
@ -670,3 +671,20 @@ plugins += [ActionAdd, ActionFetchAnnotations, ActionGenerateCatalog,
|
|||||||
ActionSendToDevice, ActionHelp, ActionPreferences, ActionSimilarBooks,
|
ActionSendToDevice, ActionHelp, ActionPreferences, ActionSimilarBooks,
|
||||||
ActionAddToLibrary, ActionEditCollections, ActionChooseLibrary,
|
ActionAddToLibrary, ActionEditCollections, ActionChooseLibrary,
|
||||||
ActionCopyToLibrary]
|
ActionCopyToLibrary]
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# Preferences Plugins {{{
|
||||||
|
|
||||||
|
class LookAndFeel(PreferencesPlugin):
|
||||||
|
name = 'Look & Feel'
|
||||||
|
gui_name = _('Look and Feel')
|
||||||
|
category = _('Interface')
|
||||||
|
category_order = 1
|
||||||
|
name_order = 1
|
||||||
|
config_widget = 'calibre.gui2.preferences.look_feel'
|
||||||
|
|
||||||
|
plugins += [LookAndFeel]
|
||||||
|
|
||||||
|
#}}}
|
||||||
|
|
||||||
|
@ -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 = {}
|
||||||
|
@ -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
|
||||||
|
@ -86,7 +86,7 @@ class SPECTRA(HANLINV3):
|
|||||||
gui_name = 'Spectra'
|
gui_name = 'Spectra'
|
||||||
PRODUCT_ID = [0xa4a5]
|
PRODUCT_ID = [0xa4a5]
|
||||||
|
|
||||||
FORMATS = ['epub', 'mobi', 'fb2', 'lit', 'prc', 'djvu', 'pdf', 'rtf', 'txt']
|
FORMATS = ['epub', 'mobi', 'fb2', 'lit', 'prc', 'chm', 'djvu', 'pdf', 'rtf', 'txt']
|
||||||
|
|
||||||
SUPPORTS_SUB_DIRS = True
|
SUPPORTS_SUB_DIRS = True
|
||||||
|
|
||||||
|
@ -25,7 +25,8 @@ system/userannotationlog
|
|||||||
|
|
||||||
collections.json refers to books via a SHA1 hash of the absolute path to the
|
collections.json refers to books via a SHA1 hash of the absolute path to the
|
||||||
book (prefix is /mnt/us on my Kindle). The SHA1 hash may or may not be prefixed
|
book (prefix is /mnt/us on my Kindle). The SHA1 hash may or may not be prefixed
|
||||||
by some characters, use the last 40 characters.
|
by some characters, use the last 40 characters. For books from Amazon, the ASIN
|
||||||
|
is used instead.
|
||||||
|
|
||||||
Changing the metadata and resending the file doesn't seem to affect collections
|
Changing the metadata and resending the file doesn't seem to affect collections
|
||||||
|
|
||||||
@ -165,11 +166,11 @@ class KINDLE(USBMS):
|
|||||||
|
|
||||||
class KINDLE2(KINDLE):
|
class KINDLE2(KINDLE):
|
||||||
|
|
||||||
name = 'Kindle 2 Device Interface'
|
name = 'Kindle 2/3 Device Interface'
|
||||||
description = _('Communicate with the Kindle 2 eBook reader.')
|
description = _('Communicate with the Kindle 2/3 eBook reader.')
|
||||||
|
|
||||||
FORMATS = KINDLE.FORMATS + ['pdf']
|
FORMATS = KINDLE.FORMATS + ['pdf']
|
||||||
PRODUCT_ID = [0x0002]
|
PRODUCT_ID = [0x0002, 0x0004]
|
||||||
BCD = [0x0100]
|
BCD = [0x0100]
|
||||||
|
|
||||||
def books(self, oncard=None, end_session=True):
|
def books(self, oncard=None, end_session=True):
|
||||||
|
@ -20,7 +20,7 @@ class Book(MetaInformation):
|
|||||||
'title_sort', 'comments', 'category', 'publisher', 'series',
|
'title_sort', 'comments', 'category', 'publisher', 'series',
|
||||||
'series_index', 'rating', 'isbn', 'language', 'application_id',
|
'series_index', 'rating', 'isbn', 'language', 'application_id',
|
||||||
'book_producer', 'lccn', 'lcc', 'ddc', 'rights', 'publication_type',
|
'book_producer', 'lccn', 'lcc', 'ddc', 'rights', 'publication_type',
|
||||||
'uuid',
|
'uuid', 'device_collections',
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, prefix, lpath, title, authors, mime, date, ContentType, thumbnail_name, other=None):
|
def __init__(self, prefix, lpath, title, authors, mime, date, ContentType, thumbnail_name, other=None):
|
||||||
|
@ -72,7 +72,7 @@ class KOBO(USBMS):
|
|||||||
for idx,b in enumerate(bl):
|
for idx,b in enumerate(bl):
|
||||||
bl_cache[b.lpath] = idx
|
bl_cache[b.lpath] = idx
|
||||||
|
|
||||||
def update_booklist(prefix, path, title, authors, mime, date, ContentType, ImageID):
|
def update_booklist(prefix, path, title, authors, mime, date, ContentType, ImageID, readstatus):
|
||||||
changed = False
|
changed = False
|
||||||
# if path_to_ext(path) in self.FORMATS:
|
# if path_to_ext(path) in self.FORMATS:
|
||||||
try:
|
try:
|
||||||
@ -82,6 +82,13 @@ class KOBO(USBMS):
|
|||||||
lpath = lpath.replace('\\', '/')
|
lpath = lpath.replace('\\', '/')
|
||||||
# print "LPATH: " + lpath
|
# print "LPATH: " + lpath
|
||||||
|
|
||||||
|
playlist_map = {}
|
||||||
|
|
||||||
|
if readstatus == 1:
|
||||||
|
if lpath not in playlist_map:
|
||||||
|
playlist_map[lpath] = []
|
||||||
|
playlist_map[lpath].append("I\'m Reading")
|
||||||
|
|
||||||
path = self.normalize_path(path)
|
path = self.normalize_path(path)
|
||||||
# print "Normalized FileName: " + path
|
# print "Normalized FileName: " + path
|
||||||
|
|
||||||
@ -97,11 +104,13 @@ class KOBO(USBMS):
|
|||||||
if self.update_metadata_item(bl[idx]):
|
if self.update_metadata_item(bl[idx]):
|
||||||
# print 'update_metadata_item returned true'
|
# print 'update_metadata_item returned true'
|
||||||
changed = True
|
changed = True
|
||||||
|
bl[idx].device_collections = playlist_map.get(lpath, [])
|
||||||
else:
|
else:
|
||||||
book = Book(prefix, lpath, title, authors, mime, date, ContentType, ImageID)
|
book = Book(prefix, lpath, title, authors, mime, date, ContentType, ImageID)
|
||||||
# print 'Update booklist'
|
# print 'Update booklist'
|
||||||
if bl.add_book(book, replace_metadata=False):
|
if bl.add_book(book, replace_metadata=False):
|
||||||
changed = True
|
changed = True
|
||||||
|
book.device_collections = playlist_map.get(book.lpath, [])
|
||||||
except: # Probably a path encoding error
|
except: # Probably a path encoding error
|
||||||
import traceback
|
import traceback
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
@ -117,7 +126,7 @@ class KOBO(USBMS):
|
|||||||
#cursor.close()
|
#cursor.close()
|
||||||
|
|
||||||
query= 'select Title, Attribution, DateCreated, ContentID, MimeType, ContentType, ' \
|
query= 'select Title, Attribution, DateCreated, ContentID, MimeType, ContentType, ' \
|
||||||
'ImageID from content where BookID is Null'
|
'ImageID, ReadStatus from content where BookID is Null'
|
||||||
|
|
||||||
cursor.execute (query)
|
cursor.execute (query)
|
||||||
|
|
||||||
@ -129,10 +138,10 @@ class KOBO(USBMS):
|
|||||||
mime = mime_type_ext(path_to_ext(row[3]))
|
mime = mime_type_ext(path_to_ext(row[3]))
|
||||||
|
|
||||||
if oncard != 'carda' and oncard != 'cardb' and not row[3].startswith("file:///mnt/sd/"):
|
if oncard != 'carda' and oncard != 'cardb' and not row[3].startswith("file:///mnt/sd/"):
|
||||||
changed = update_booklist(self._main_prefix, path, row[0], row[1], mime, row[2], row[5], row[6])
|
changed = update_booklist(self._main_prefix, path, row[0], row[1], mime, row[2], row[5], row[6], row[7])
|
||||||
# print "shortbook: " + path
|
# print "shortbook: " + path
|
||||||
elif oncard == 'carda' and row[3].startswith("file:///mnt/sd/"):
|
elif oncard == 'carda' and row[3].startswith("file:///mnt/sd/"):
|
||||||
changed = update_booklist(self._card_a_prefix, path, row[0], row[1], mime, row[2], row[5], row[6])
|
changed = update_booklist(self._card_a_prefix, path, row[0], row[1], mime, row[2], row[5], row[6], row[7])
|
||||||
|
|
||||||
if changed:
|
if changed:
|
||||||
need_sync = True
|
need_sync = True
|
||||||
@ -193,7 +202,7 @@ class KOBO(USBMS):
|
|||||||
connection.commit()
|
connection.commit()
|
||||||
|
|
||||||
cursor.close()
|
cursor.close()
|
||||||
if ImageID != None:
|
if ImageID == None:
|
||||||
print "Error condition ImageID was not found"
|
print "Error condition ImageID was not found"
|
||||||
print "You likely tried to delete a book that the kobo has not yet added to the database"
|
print "You likely tried to delete a book that the kobo has not yet added to the database"
|
||||||
|
|
||||||
|
@ -348,25 +348,29 @@ class XMLCache(object):
|
|||||||
# Update XML from JSON {{{
|
# Update XML from JSON {{{
|
||||||
def update(self, booklists, collections_attributes):
|
def update(self, booklists, collections_attributes):
|
||||||
debug_print('Starting update', collections_attributes)
|
debug_print('Starting update', collections_attributes)
|
||||||
|
use_tz_var = False
|
||||||
for i, booklist in booklists.items():
|
for i, booklist in booklists.items():
|
||||||
playlist_map = self.build_id_playlist_map(i)
|
playlist_map = self.build_id_playlist_map(i)
|
||||||
debug_print('Updating XML Cache:', i)
|
debug_print('Updating XML Cache:', i)
|
||||||
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=%s'%
|
||||||
|
(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 +468,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 +499,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 record.get('tz', None) is not None:
|
||||||
|
use_tz_var = True
|
||||||
if strftime(timestamp, zone=time.gmtime) == rec_date:
|
if strftime(timestamp, zone=time.gmtime) == rec_date:
|
||||||
gtz_count += 1
|
gtz_count += 1
|
||||||
elif strftime(timestamp, zone=time.localtime) == rec_date:
|
elif strftime(timestamp, zone=time.localtime) == rec_date:
|
||||||
ltz_count += 1
|
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 +547,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 {{{
|
||||||
|
@ -5,8 +5,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import functools
|
import functools, re
|
||||||
import re
|
|
||||||
|
|
||||||
from calibre import entity_to_unicode
|
from calibre import entity_to_unicode
|
||||||
|
|
||||||
@ -54,7 +53,7 @@ def chap_head(match):
|
|||||||
if not title:
|
if not title:
|
||||||
return '<h1>'+chap+'</h1><br/>\n'
|
return '<h1>'+chap+'</h1><br/>\n'
|
||||||
else:
|
else:
|
||||||
return '<h1>'+chap+'<br/>\n'+title+'</h1><br/>\n'
|
return '<h1>'+chap+'</h1>\n<h3>'+title+'</h3>\n'
|
||||||
|
|
||||||
def wrap_lines(match):
|
def wrap_lines(match):
|
||||||
ital = match.group('ital')
|
ital = match.group('ital')
|
||||||
@ -63,7 +62,7 @@ def wrap_lines(match):
|
|||||||
else:
|
else:
|
||||||
return ital+' '
|
return ital+' '
|
||||||
|
|
||||||
def line_length(raw, percent):
|
def line_length(format, raw, percent):
|
||||||
'''
|
'''
|
||||||
raw is the raw text to find the line length to use for wrapping.
|
raw is the raw text to find the line length to use for wrapping.
|
||||||
percentage is a decimal number, 0 - 1 which is used to determine
|
percentage is a decimal number, 0 - 1 which is used to determine
|
||||||
@ -72,6 +71,9 @@ def line_length(raw, percent):
|
|||||||
median value.
|
median value.
|
||||||
'''
|
'''
|
||||||
raw = raw.replace(' ', ' ')
|
raw = raw.replace(' ', ' ')
|
||||||
|
if format == 'html':
|
||||||
|
linere = re.compile('(?<=<p).*?(?=</p>)', re.DOTALL)
|
||||||
|
elif format == 'pdf':
|
||||||
linere = re.compile('(?<=<br>).*?(?=<br>)', re.DOTALL)
|
linere = re.compile('(?<=<br>).*?(?=<br>)', re.DOTALL)
|
||||||
lines = linere.findall(raw)
|
lines = linere.findall(raw)
|
||||||
|
|
||||||
@ -202,11 +204,8 @@ class HTMLPreProcessor(object):
|
|||||||
# Remove gray background
|
# Remove gray background
|
||||||
(re.compile(r'<BODY[^<>]+>'), lambda match : '<BODY>'),
|
(re.compile(r'<BODY[^<>]+>'), lambda match : '<BODY>'),
|
||||||
|
|
||||||
# Remove non breaking spaces
|
|
||||||
(re.compile(ur'\u00a0'), lambda match : ' '),
|
|
||||||
|
|
||||||
# Detect Chapters to match default XPATH in GUI
|
# Detect Chapters to match default XPATH in GUI
|
||||||
(re.compile(r'(?=<(/?br|p))(<(/?br|p)[^>]*)?>\s*(?P<chap>(<i><b>|<i>|<b>)?(Chapter|Epilogue|Prologue|Book|Part)\s*([\d\w-]+(\s\w+)?)?(</i></b>|</i>|</b>)?)(</?p[^>]*>|<br[^>]*>)\n?((?=(<i>)?\s*\w+(\s+\w+)?(</i>)?(<br[^>]*>|</?p[^>]*>))((?P<title>(<i>)?\s*\w+(\s+\w+)?(</i>)?)(<br[^>]*>|</?p[^>]*>)))?', re.IGNORECASE), chap_head),
|
(re.compile(r'(?=<(/?br|p))(<(/?br|p)[^>]*)?>\s*(?P<chap>(<(i|b)>(<(i|b)>)?)?(.?Chapter|Epilogue|Prologue|Book|Part)\s*([\d\w-]+(\s\w+)?)?(</(i|b)>(</(i|b)>)?)?)</?(br|p)[^>]*>\s*(?P<title>(<(i|b)>)?\s*\w+(\s*\w+)?\s*(</(i|b)>)?\s*(</?(br|p)[^>]*>))?', re.IGNORECASE), chap_head),
|
||||||
(re.compile(r'(?=<(/?br|p))(<(/?br|p)[^>]*)?>\s*(?P<chap>([A-Z \'"!]{5,})\s*(\d+|\w+)?)(</?p[^>]*>|<br[^>]*>)\n?((?=(<i>)?\s*\w+(\s+\w+)?(</i>)?(<br[^>]*>|</?p[^>]*>))((?P<title>.*)(<br[^>]*>|</?p[^>]*>)))?'), chap_head),
|
(re.compile(r'(?=<(/?br|p))(<(/?br|p)[^>]*)?>\s*(?P<chap>([A-Z \'"!]{5,})\s*(\d+|\w+)?)(</?p[^>]*>|<br[^>]*>)\n?((?=(<i>)?\s*\w+(\s+\w+)?(</i>)?(<br[^>]*>|</?p[^>]*>))((?P<title>.*)(<br[^>]*>|</?p[^>]*>)))?'), chap_head),
|
||||||
|
|
||||||
# Have paragraphs show better
|
# Have paragraphs show better
|
||||||
@ -251,20 +250,27 @@ class HTMLPreProcessor(object):
|
|||||||
def is_pdftohtml(self, src):
|
def is_pdftohtml(self, src):
|
||||||
return '<!-- created by calibre\'s pdftohtml -->' in src[:1000]
|
return '<!-- created by calibre\'s pdftohtml -->' in src[:1000]
|
||||||
|
|
||||||
def __call__(self, html, remove_special_chars=None):
|
def __call__(self, html, remove_special_chars=None,
|
||||||
|
get_preprocess_html=False):
|
||||||
if remove_special_chars is not None:
|
if remove_special_chars is not None:
|
||||||
html = remove_special_chars.sub('', html)
|
html = remove_special_chars.sub('', html)
|
||||||
html = html.replace('\0', '')
|
html = html.replace('\0', '')
|
||||||
|
is_pdftohtml = self.is_pdftohtml(html)
|
||||||
if self.is_baen(html):
|
if self.is_baen(html):
|
||||||
rules = []
|
rules = []
|
||||||
elif self.is_book_designer(html):
|
elif self.is_book_designer(html):
|
||||||
rules = self.BOOK_DESIGNER
|
rules = self.BOOK_DESIGNER
|
||||||
elif self.is_pdftohtml(html):
|
elif is_pdftohtml:
|
||||||
rules = self.PDFTOHTML
|
rules = self.PDFTOHTML
|
||||||
else:
|
else:
|
||||||
rules = []
|
rules = []
|
||||||
|
|
||||||
if not self.extra_opts.keep_ligatures:
|
start_rules = []
|
||||||
|
if is_pdftohtml:
|
||||||
|
# Remove non breaking spaces
|
||||||
|
start_rules.append((re.compile(ur'\u00a0'), lambda match : ' '))
|
||||||
|
|
||||||
|
if not getattr(self.extra_opts, 'keep_ligatures', False):
|
||||||
html = _ligpat.sub(lambda m:LIGATURES[m.group()], html)
|
html = _ligpat.sub(lambda m:LIGATURES[m.group()], html)
|
||||||
|
|
||||||
end_rules = []
|
end_rules = []
|
||||||
@ -289,16 +295,42 @@ class HTMLPreProcessor(object):
|
|||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
||||||
if getattr(self.extra_opts, 'unwrap_factor', 0.0) > 0.01:
|
if getattr(self.extra_opts, 'unwrap_factor', 0.0) > 0.01:
|
||||||
length = line_length(html, getattr(self.extra_opts, 'unwrap_factor'))
|
length = line_length('pdf', html, getattr(self.extra_opts, 'unwrap_factor'))
|
||||||
if length:
|
if length:
|
||||||
end_rules.append(
|
end_rules.append(
|
||||||
# Un wrap using punctuation
|
# Un wrap using punctuation
|
||||||
(re.compile(r'(?<=.{%i}[a-z\.,;:)\-IA])\s*(?P<ital></(i|b|u)>)?\s*(<p.*?>)\s*(?=(<(i|b|u)>)?\s*[\w\d(])' % length, re.UNICODE), wrap_lines),
|
(re.compile(r'(?<=.{%i}[a-z\.,;:)\-IA])\s*(?P<ital></(i|b|u)>)?\s*(<p.*?>)\s*(?=(<(i|b|u)>)?\s*[\w\d(])' % length, re.UNICODE), wrap_lines),
|
||||||
)
|
)
|
||||||
|
|
||||||
for rule in self.PREPROCESS + rules + end_rules:
|
for rule in self.PREPROCESS + start_rules:
|
||||||
html = rule[0].sub(rule[1], html)
|
html = rule[0].sub(rule[1], html)
|
||||||
|
|
||||||
|
if get_preprocess_html:
|
||||||
|
return html
|
||||||
|
|
||||||
|
def dump(raw, where):
|
||||||
|
import os
|
||||||
|
dp = getattr(self.extra_opts, 'debug_pipeline', None)
|
||||||
|
if dp and os.path.exists(dp):
|
||||||
|
odir = os.path.join(dp, 'input')
|
||||||
|
if os.path.exists(odir):
|
||||||
|
odir = os.path.join(odir, where)
|
||||||
|
if not os.path.exists(odir):
|
||||||
|
os.makedirs(odir)
|
||||||
|
name, i = None, 0
|
||||||
|
while not name or os.path.exists(os.path.join(odir, name)):
|
||||||
|
i += 1
|
||||||
|
name = '%04d.html'%i
|
||||||
|
with open(os.path.join(odir, name), 'wb') as f:
|
||||||
|
f.write(raw.encode('utf-8'))
|
||||||
|
|
||||||
|
#dump(html, 'pre-preprocess')
|
||||||
|
|
||||||
|
for rule in rules + end_rules:
|
||||||
|
html = rule[0].sub(rule[1], html)
|
||||||
|
|
||||||
|
#dump(html, 'post-preprocess')
|
||||||
|
|
||||||
# Handle broken XHTML w/ SVG (ugh)
|
# Handle broken XHTML w/ SVG (ugh)
|
||||||
if 'svg:' in html and SVG_NS not in html:
|
if 'svg:' in html and SVG_NS not in html:
|
||||||
html = html.replace(
|
html = html.replace(
|
||||||
|
@ -86,11 +86,14 @@ class FB2MLizer(object):
|
|||||||
output.append(self.fb2_footer())
|
output.append(self.fb2_footer())
|
||||||
output = ''.join(output).replace(u'ghji87yhjko0Caliblre-toc-placeholder-for-insertion-later8ujko0987yjk', self.get_toc())
|
output = ''.join(output).replace(u'ghji87yhjko0Caliblre-toc-placeholder-for-insertion-later8ujko0987yjk', self.get_toc())
|
||||||
output = self.clean_text(output)
|
output = self.clean_text(output)
|
||||||
|
if self.opts.sectionize_chapters:
|
||||||
|
output = self.sectionize_chapters(output)
|
||||||
return u'<?xml version="1.0" encoding="UTF-8"?>\n%s' % etree.tostring(etree.fromstring(output), encoding=unicode, pretty_print=True)
|
return u'<?xml version="1.0" encoding="UTF-8"?>\n%s' % etree.tostring(etree.fromstring(output), encoding=unicode, pretty_print=True)
|
||||||
|
|
||||||
def clean_text(self, text):
|
def clean_text(self, text):
|
||||||
text = re.sub('<p>[ ]*</p>', '', text)
|
text = re.sub(r'(?miu)<p>\s*</p>', '', text)
|
||||||
|
text = re.sub(r'(?miu)\s+</p>', '</p>', text)
|
||||||
|
text = re.sub(r'(?miu)</p><p>', '</p>\n\n<p>', text)
|
||||||
return text
|
return text
|
||||||
|
|
||||||
def fb2_header(self):
|
def fb2_header(self):
|
||||||
@ -149,6 +152,11 @@ class FB2MLizer(object):
|
|||||||
self.oeb.warn('Ignoring toc item: %s not found in document.' % item)
|
self.oeb.warn('Ignoring toc item: %s not found in document.' % item)
|
||||||
return ''.join(toc)
|
return ''.join(toc)
|
||||||
|
|
||||||
|
def sectionize_chapters(self, text):
|
||||||
|
text = re.sub(r'(?imsu)(?P<anchor><a\s+id="calibre_link-\d+"\s*/>)\s*(?P<strong>(<p>)*\s*<strong>.+?</strong>\s*(</p>)*)', lambda mo: '</section><section>%s<title>%s</title>' % (mo.group('anchor'), mo.group('strong')), text)
|
||||||
|
text = re.sub(r'(?imsu)<p>\s*(?P<anchor><a\s+id="calibre_link-\d+"\s*/>)\s*</p>\s*(?P<strong>(<p>)*\s*<strong>.+?</strong>\s*(</p>)*)', lambda mo: '</section><section>%s<title>%s</title>' % (mo.group('anchor'), mo.group('strong')), text)
|
||||||
|
return text
|
||||||
|
|
||||||
def get_text(self):
|
def get_text(self):
|
||||||
text = []
|
text = []
|
||||||
for item in self.oeb_book.spine:
|
for item in self.oeb_book.spine:
|
||||||
|
@ -19,6 +19,12 @@ class FB2Output(OutputFormatPlugin):
|
|||||||
OptionRecommendation(name='inline_toc',
|
OptionRecommendation(name='inline_toc',
|
||||||
recommended_value=False, level=OptionRecommendation.LOW,
|
recommended_value=False, level=OptionRecommendation.LOW,
|
||||||
help=_('Add Table of Contents to beginning of the book.')),
|
help=_('Add Table of Contents to beginning of the book.')),
|
||||||
|
OptionRecommendation(name='sectionize_chapters',
|
||||||
|
recommended_value=False, level=OptionRecommendation.LOW,
|
||||||
|
help=_('Try to turn chapters into individual sections. ' \
|
||||||
|
'WARNING: ' \
|
||||||
|
'This option is experimental. It can cause conversion ' \
|
||||||
|
'to fail. It can also produce unexpected output.')),
|
||||||
])
|
])
|
||||||
|
|
||||||
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
||||||
|
@ -24,6 +24,7 @@ from calibre.constants import islinux, isfreebsd, iswindows
|
|||||||
from calibre import unicode_path
|
from calibre import unicode_path
|
||||||
from calibre.utils.localization import get_lang
|
from calibre.utils.localization import get_lang
|
||||||
from calibre.utils.filenames import ascii_filename
|
from calibre.utils.filenames import ascii_filename
|
||||||
|
from calibre.ebooks.conversion.preprocess import line_length
|
||||||
|
|
||||||
class Link(object):
|
class Link(object):
|
||||||
'''
|
'''
|
||||||
@ -489,5 +490,21 @@ class HTMLInput(InputFormatPlugin):
|
|||||||
return (None, None)
|
return (None, None)
|
||||||
return (None, raw)
|
return (None, raw)
|
||||||
|
|
||||||
|
def preprocess_html(self, html):
|
||||||
|
if not hasattr(self, 'log'):
|
||||||
|
from calibre.utils.logging import default_log
|
||||||
|
self.log = default_log
|
||||||
|
self.log("********* Preprocessing HTML *********")
|
||||||
|
# Detect Chapters to match the xpath in the GUI
|
||||||
|
chapdetect = re.compile(r'(?=</?(br|p|span))(</?(br|p|span)[^>]*>)?\s*(?P<chap>(<(i|b)><(i|b)>|<(i|b)>)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(</(i|b)></(i|b)>|</(i|b)>)?)(</?(p|br|span)[^>]*>)', re.IGNORECASE)
|
||||||
|
html = chapdetect.sub('<h2>'+'\g<chap>'+'</h2>\n', html)
|
||||||
|
# Unwrap lines using punctation if the median length of all lines is less than 150
|
||||||
|
#
|
||||||
|
# Insert extra line feeds so the line length regex functions properly
|
||||||
|
html = re.sub(r"</p>", "</p>\n", html)
|
||||||
|
length = line_length('html', html, 0.4)
|
||||||
|
self.log.debug("*** Median length is " + str(length) + " ***")
|
||||||
|
unwrap = re.compile(r"(?<=.{%i}[a-z,;:\IA])\s*</(span|p|div)>\s*(</(p|span|div)>)?\s*(?P<up2threeblanks><(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*</(span|p|div)>\s*)</(span|p|div)>\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE)
|
||||||
|
if length < 150:
|
||||||
|
html = unwrap.sub(' ', html)
|
||||||
|
return html
|
||||||
|
@ -9,6 +9,7 @@ __docformat__ = 'restructuredtext en'
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from calibre.customize.conversion import InputFormatPlugin
|
from calibre.customize.conversion import InputFormatPlugin
|
||||||
|
from calibre.ebooks.conversion.preprocess import line_length
|
||||||
|
|
||||||
class LITInput(InputFormatPlugin):
|
class LITInput(InputFormatPlugin):
|
||||||
|
|
||||||
@ -21,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):
|
||||||
@ -53,8 +55,18 @@ class LITInput(InputFormatPlugin):
|
|||||||
|
|
||||||
|
|
||||||
def preprocess_html(self, html):
|
def preprocess_html(self, html):
|
||||||
|
self.log("********* Preprocessing HTML *********")
|
||||||
|
# Detect Chapters to match the xpath in the GUI
|
||||||
chapdetect = re.compile(r'(?=</?(br|p|span))(</?(br|p|span)[^>]*>)?\s*(?P<chap>(<(i|b)><(i|b)>|<(i|b)>)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(</(i|b)></(i|b)>|</(i|b)>)?)(</?(p|br|span)[^>]*>)', re.IGNORECASE)
|
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)
|
||||||
html = re.sub(r"(?<=.{65}[a-z,\IA])\s*</(span|p|div)>\s*(</(p|span|div)>\s*<p[^>]*>(\s*<(p|span|div)>\s*</(p|span|div)[^>]*>)?\s*(</(p|span|div)>\s*<p[^>]*>)?)?\s*<(span|div|p)[^>]*>", " ", html)
|
# Unwrap lines using punctation if the median length of all lines is less than 150
|
||||||
|
#
|
||||||
|
# Insert extra line feeds so the line length regex functions properly
|
||||||
|
html = re.sub(r"</p>", "</p>\n", html)
|
||||||
|
length = line_length('html', html, 0.4)
|
||||||
|
self.log("*** Median length is " + str(length) + " ***")
|
||||||
|
unwrap = re.compile(r"(?<=.{%i}[a-z,;:\IA])\s*</(span|p|div)>\s*(</(p|span|div)>)?\s*(?P<up2threeblanks><(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*</(span|p|div)>\s*)</(span|p|div)>\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE)
|
||||||
|
if length < 150:
|
||||||
|
html = unwrap.sub(' ', html)
|
||||||
return html
|
return html
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
try:
|
||||||
text = XHTML_CSS_NAMESPACE + x
|
text = XHTML_CSS_NAMESPACE + x
|
||||||
stylesheet = parser.parseString(text, href=cssname)
|
stylesheet = parser.parseString(text, href=cssname)
|
||||||
stylesheet.namespaces['h'] = XHTML_NS
|
stylesheet.namespaces['h'] = XHTML_NS
|
||||||
stylesheets.append(stylesheet)
|
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()
|
||||||
|
@ -7,6 +7,7 @@ import os, glob, re, textwrap
|
|||||||
from lxml import etree
|
from lxml import etree
|
||||||
|
|
||||||
from calibre.customize.conversion import InputFormatPlugin
|
from calibre.customize.conversion import InputFormatPlugin
|
||||||
|
from calibre.ebooks.conversion.preprocess import line_length
|
||||||
|
|
||||||
class InlineClass(etree.XSLTExtension):
|
class InlineClass(etree.XSLTExtension):
|
||||||
|
|
||||||
@ -186,6 +187,7 @@ class RTFInput(InputFormatPlugin):
|
|||||||
from calibre.ebooks.metadata.meta import get_metadata
|
from calibre.ebooks.metadata.meta import get_metadata
|
||||||
from calibre.ebooks.metadata.opf2 import OPFCreator
|
from calibre.ebooks.metadata.opf2 import OPFCreator
|
||||||
from calibre.ebooks.rtf2xml.ParseRtf import RtfInvalidCodeException
|
from calibre.ebooks.rtf2xml.ParseRtf import RtfInvalidCodeException
|
||||||
|
self.options = options
|
||||||
self.log = log
|
self.log = log
|
||||||
self.log('Converting RTF to XML...')
|
self.log('Converting RTF to XML...')
|
||||||
#Name of the preprocesssed RTF file
|
#Name of the preprocesssed RTF file
|
||||||
@ -229,6 +231,17 @@ class RTFInput(InputFormatPlugin):
|
|||||||
with open(html, 'wb') as f:
|
with open(html, 'wb') as f:
|
||||||
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:
|
||||||
|
self.log("********* Preprocessing HTML *********")
|
||||||
|
# Detect Chapters to match the xpath in the GUI
|
||||||
|
chapdetect = re.compile(r'<p[^>]*>\s*<span[^>]*>\s*(?P<chap>(<(i|b)><(i|b)>|<(i|b)>)?(.?Chapter|Epilogue|Prologue|Book|Part|Dedication)\s*([\d\w-]+(\s\w+)?)?(</(i|b)></(i|b)>|</(i|b)>)?)\s*</span>\s*</p>', re.IGNORECASE)
|
||||||
|
res = chapdetect.sub('<h2>'+'\g<chap>'+'</h2>\n', res)
|
||||||
|
# Unwrap lines using punctation if the median length of all lines is less than 150
|
||||||
|
length = line_length('html', res, 0.4)
|
||||||
|
self.log("*** Median length is " + str(length) + " ***")
|
||||||
|
unwrap = re.compile(r"(?<=.{%i}[a-z,;:\IA])\s*</span>\s*(</p>)?\s*(?P<up2threeblanks><p[^>]*>\s*(<span[^>]*>\s*</span>\s*)</p>\s*){0,3}\s*<p[^>]*>\s*(<span[^>]*>)?\s*" % length, re.UNICODE)
|
||||||
|
if length < 150:
|
||||||
|
res = unwrap.sub(' ', res)
|
||||||
f.write(res)
|
f.write(res)
|
||||||
self.write_inline_css(inline_class)
|
self.write_inline_css(inline_class)
|
||||||
stream.seek(0)
|
stream.seek(0)
|
||||||
|
@ -46,6 +46,11 @@ gprefs.defaults['action-layout-context-menu-device'] = (
|
|||||||
'View', 'Save To Disk', None, 'Remove Books', None,
|
'View', 'Save To Disk', None, 'Remove Books', None,
|
||||||
'Add To Library', 'Edit Collections',
|
'Add To Library', 'Edit Collections',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
gprefs.defaults['show_splash_screen'] = True
|
||||||
|
gprefs.defaults['toolbar_icon_size'] = 'medium'
|
||||||
|
gprefs.defaults['toolbar_text'] = 'auto'
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
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
|
||||||
@ -93,8 +98,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,
|
||||||
|
@ -14,10 +14,12 @@ class AddToLibraryAction(InterfaceAction):
|
|||||||
_('Add books to your calibre library from the connected device'), None)
|
_('Add books to your calibre library from the connected device'), None)
|
||||||
dont_add_to = frozenset(['toolbar', 'context-menu'])
|
dont_add_to = frozenset(['toolbar', 'context-menu'])
|
||||||
|
|
||||||
|
def genesis(self):
|
||||||
|
self.qaction.triggered.connect(self.add_books_to_library)
|
||||||
|
|
||||||
def location_selected(self, loc):
|
def location_selected(self, loc):
|
||||||
enabled = loc != 'library'
|
enabled = loc != 'library'
|
||||||
self.qaction.setEnabled(enabled)
|
self.qaction.setEnabled(enabled)
|
||||||
self.qaction.triggered.connect(self.add_books_to_library)
|
|
||||||
|
|
||||||
def add_books_to_library(self, *args):
|
def add_books_to_library(self, *args):
|
||||||
self.gui.iactions['Add Books'].add_books_from_device(
|
self.gui.iactions['Add Books'].add_books_from_device(
|
||||||
|
@ -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):
|
||||||
@ -76,12 +76,14 @@ class ChooseLibraryAction(InterfaceAction):
|
|||||||
|
|
||||||
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)
|
||||||
@ -95,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):
|
||||||
@ -121,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
|
||||||
|
@ -14,10 +14,12 @@ class EditCollectionsAction(InterfaceAction):
|
|||||||
_('Manage the collections on this device'), None)
|
_('Manage the collections on this device'), None)
|
||||||
dont_add_to = frozenset(['toolbar', 'context-menu'])
|
dont_add_to = frozenset(['toolbar', 'context-menu'])
|
||||||
|
|
||||||
|
def genesis(self):
|
||||||
|
self.qaction.triggered.connect(self.edit_collections)
|
||||||
|
|
||||||
def location_selected(self, loc):
|
def location_selected(self, loc):
|
||||||
enabled = loc != 'library'
|
enabled = loc != 'library'
|
||||||
self.qaction.setEnabled(enabled)
|
self.qaction.setEnabled(enabled)
|
||||||
self.qaction.triggered.connect(self.edit_collections)
|
|
||||||
|
|
||||||
def edit_collections(self, *args):
|
def edit_collections(self, *args):
|
||||||
oncard = None
|
oncard = None
|
||||||
|
@ -21,13 +21,14 @@ class SimilarBooksAction(InterfaceAction):
|
|||||||
m = QMenu(self.gui)
|
m = QMenu(self.gui)
|
||||||
for text, icon, target, shortcut in [
|
for text, icon, target, shortcut in [
|
||||||
(_('Books by same author'), 'user_profile.svg', 'authors', _('Alt+A')),
|
(_('Books by same author'), 'user_profile.svg', 'authors', _('Alt+A')),
|
||||||
(_('Books in this series'), 'books_in_series.svg', 'series', _('Alt+S')),
|
(_('Books in this series'), 'books_in_series.svg', 'series',
|
||||||
|
_('Alt+Shift+S')),
|
||||||
(_('Books by this publisher'), 'publisher.png', 'publisher', _('Alt+P')),
|
(_('Books by this publisher'), 'publisher.png', 'publisher', _('Alt+P')),
|
||||||
(_('Books with the same tags'), 'tags.svg', 'tag', _('Alt+T')),]:
|
(_('Books with the same tags'), 'tags.svg', 'tag', _('Alt+T')),]:
|
||||||
ac = self.create_action(spec=(text, icon, None, shortcut),
|
ac = self.create_action(spec=(text, icon, None, shortcut),
|
||||||
attr=target)
|
attr=target)
|
||||||
m.addAction(ac)
|
m.addAction(ac)
|
||||||
m.triggered.connect(partial(self.show_similar_books, target))
|
ac.triggered.connect(partial(self.show_similar_books, target))
|
||||||
self.qaction.setMenu(m)
|
self.qaction.setMenu(m)
|
||||||
self.similar_menu = m
|
self.similar_menu = m
|
||||||
|
|
||||||
|
@ -280,19 +280,17 @@ class Adder(QObject): # {{{
|
|||||||
self.pd.set_min(0)
|
self.pd.set_min(0)
|
||||||
self.pd.set_max(len(self.ids))
|
self.pd.set_max(len(self.ids))
|
||||||
self.pd.value = 0
|
self.pd.value = 0
|
||||||
self.timer = QTimer(self)
|
|
||||||
self.db_adder = DBAdder(self.db, self.ids, self.nmap)
|
self.db_adder = DBAdder(self.db, self.ids, self.nmap)
|
||||||
self.db_adder.start()
|
self.db_adder.start()
|
||||||
self.connect(self.timer, SIGNAL('timeout()'), self.update)
|
|
||||||
self.last_added_at = time.time()
|
self.last_added_at = time.time()
|
||||||
self.entry_count = len(self.ids)
|
self.entry_count = len(self.ids)
|
||||||
self.timer.start(200)
|
self.continue_updating = True
|
||||||
|
QTimer.singleShot(200, self.update)
|
||||||
|
|
||||||
def canceled(self):
|
def canceled(self):
|
||||||
|
self.continue_updating = False
|
||||||
if self.rfind is not None:
|
if self.rfind is not None:
|
||||||
self.rfind.canceled = True
|
self.rfind.canceled = True
|
||||||
if self.timer is not None:
|
|
||||||
self.timer.stop()
|
|
||||||
if self.worker is not None:
|
if self.worker is not None:
|
||||||
self.worker.canceled = True
|
self.worker.canceled = True
|
||||||
if hasattr(self, 'db_adder'):
|
if hasattr(self, 'db_adder'):
|
||||||
@ -312,7 +310,7 @@ class Adder(QObject): # {{{
|
|||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
if self.entry_count <= 0:
|
if self.entry_count <= 0:
|
||||||
self.timer.stop()
|
self.continue_updating = False
|
||||||
self.pd.hide()
|
self.pd.hide()
|
||||||
self.process_duplicates()
|
self.process_duplicates()
|
||||||
return
|
return
|
||||||
@ -334,7 +332,7 @@ class Adder(QObject): # {{{
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
if (time.time() - self.last_added_at) > self.ADD_TIMEOUT:
|
if (time.time() - self.last_added_at) > self.ADD_TIMEOUT:
|
||||||
self.timer.stop()
|
self.continue_updating = False
|
||||||
self.pd.hide()
|
self.pd.hide()
|
||||||
self.db_adder.end = True
|
self.db_adder.end = True
|
||||||
if not self.callback_called:
|
if not self.callback_called:
|
||||||
@ -346,6 +344,9 @@ class Adder(QObject): # {{{
|
|||||||
'books in smaller increments, until you '
|
'books in smaller increments, until you '
|
||||||
'find the problem book.'), show=True)
|
'find the problem book.'), show=True)
|
||||||
|
|
||||||
|
if self.continue_updating:
|
||||||
|
QTimer.singleShot(200, self.update)
|
||||||
|
|
||||||
|
|
||||||
def process_duplicates(self):
|
def process_duplicates(self):
|
||||||
duplicates = self.db_adder.duplicates
|
duplicates = self.db_adder.duplicates
|
||||||
|
@ -16,6 +16,6 @@ class PluginWidget(Widget, Ui_Form):
|
|||||||
COMMIT_NAME = 'fb2_output'
|
COMMIT_NAME = 'fb2_output'
|
||||||
|
|
||||||
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
|
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
|
||||||
Widget.__init__(self, parent, ['inline_toc'])
|
Widget.__init__(self, parent, ['inline_toc', 'sectionize_chapters'])
|
||||||
self.db, self.book_id = db, book_id
|
self.db, self.book_id = db, book_id
|
||||||
self.initialize_options(get_option, get_help, db, book_id)
|
self.initialize_options(get_option, get_help, db, book_id)
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
<item row="1" column="0">
|
<item row="2" column="0">
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@ -34,6 +34,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="opt_sectionize_chapters">
|
||||||
|
<property name="text">
|
||||||
|
<string>Sectionize Chapters (Use with care!)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
@ -14,7 +14,7 @@ from calibre.gui2.convert.regex_builder_ui import Ui_RegexBuilder
|
|||||||
from calibre.gui2.convert.xexp_edit_ui import Ui_Form as Ui_Edit
|
from calibre.gui2.convert.xexp_edit_ui import Ui_Form as Ui_Edit
|
||||||
from calibre.gui2 import error_dialog, choose_files
|
from calibre.gui2 import error_dialog, choose_files
|
||||||
from calibre.ebooks.oeb.iterator import EbookIterator
|
from calibre.ebooks.oeb.iterator import EbookIterator
|
||||||
from calibre.ebooks.conversion.preprocess import convert_entities
|
from calibre.ebooks.conversion.preprocess import HTMLPreProcessor
|
||||||
from calibre.gui2.dialogs.choose_format import ChooseFormatDialog
|
from calibre.gui2.dialogs.choose_format import ChooseFormatDialog
|
||||||
|
|
||||||
class RegexBuilder(QDialog, Ui_RegexBuilder):
|
class RegexBuilder(QDialog, Ui_RegexBuilder):
|
||||||
@ -91,10 +91,10 @@ class RegexBuilder(QDialog, Ui_RegexBuilder):
|
|||||||
self.iterator = EbookIterator(pathtoebook)
|
self.iterator = EbookIterator(pathtoebook)
|
||||||
self.iterator.__enter__(only_input_plugin=True)
|
self.iterator.__enter__(only_input_plugin=True)
|
||||||
text = [u'']
|
text = [u'']
|
||||||
ent_pat = re.compile(r'&(\S+?);')
|
preprocessor = HTMLPreProcessor(None, False)
|
||||||
for path in self.iterator.spine:
|
for path in self.iterator.spine:
|
||||||
html = open(path, 'rb').read().decode('utf-8', 'replace')
|
html = open(path, 'rb').read().decode('utf-8', 'replace')
|
||||||
html = ent_pat.sub(convert_entities, html)
|
html = preprocessor(html, get_preprocess_html=True)
|
||||||
text.append(html)
|
text.append(html)
|
||||||
self.preview.setPlainText('\n---\n'.join(text))
|
self.preview.setPlainText('\n---\n'.join(text))
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -357,7 +357,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog):
|
|||||||
|
|
||||||
input_map = prefs['input_format_order']
|
input_map = prefs['input_format_order']
|
||||||
all_formats = set()
|
all_formats = set()
|
||||||
for fmt in all_input_formats():
|
for fmt in all_input_formats().union(set(['ZIP', 'RAR'])):
|
||||||
all_formats.add(fmt.upper())
|
all_formats.add(fmt.upper())
|
||||||
for format in input_map + list(all_formats.difference(input_map)):
|
for format in input_map + list(all_formats.difference(input_map)):
|
||||||
item = QListWidgetItem(format, self.input_order)
|
item = QListWidgetItem(format, self.input_order)
|
||||||
@ -504,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')]):
|
||||||
@ -928,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)
|
||||||
|
@ -109,7 +109,7 @@
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>1</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_3">
|
<widget class="QWidget" name="page_3">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
@ -367,16 +367,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QCheckBox" name="roman_numerals">
|
|
||||||
<property name="text">
|
|
||||||
<string>Use &Roman numerals for series number</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QCheckBox" name="opt_disable_animations">
|
<widget class="QCheckBox" name="opt_disable_animations">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
@ -387,27 +377,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QCheckBox" name="systray_icon">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable system &tray icon (needs restart)</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<widget class="QCheckBox" name="systray_notifications">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show &notifications in system tray</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="1">
|
|
||||||
<widget class="QCheckBox" name="opt_show_donate_button">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show &donate button (restart)</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="11" column="0" colspan="2">
|
<item row="11" column="0" colspan="2">
|
||||||
<widget class="QGroupBox" name="groupBox_2">
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
@ -616,20 +585,6 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
|
||||||
<widget class="QCheckBox" name="show_splash_screen">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show &splash screen at startup</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="0">
|
|
||||||
<widget class="QCheckBox" name="sync_news">
|
|
||||||
<property name="text">
|
|
||||||
<string>Automatically send downloaded &news to ebook reader</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QCheckBox" name="search_as_you_type">
|
<widget class="QCheckBox" name="search_as_you_type">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@ -640,7 +595,24 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="5" column="1">
|
||||||
|
<widget class="QCheckBox" name="roman_numerals">
|
||||||
|
<property name="text">
|
||||||
|
<string>Use &Roman numerals for series</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QCheckBox" name="systray_icon">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable system &tray icon (needs restart)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
<widget class="QCheckBox" name="show_avg_rating">
|
<widget class="QCheckBox" name="show_avg_rating">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show &average ratings in the tags browser</string>
|
<string>Show &average ratings in the tags browser</string>
|
||||||
@ -651,12 +623,33 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="6" column="0">
|
||||||
|
<widget class="QCheckBox" name="sync_news">
|
||||||
|
<property name="text">
|
||||||
|
<string>Automatically send downloaded &news to ebook reader</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QCheckBox" name="show_splash_screen">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show &splash screen at startup</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="0" colspan="2">
|
||||||
<widget class="QCheckBox" name="separate_cover_flow">
|
<widget class="QCheckBox" name="separate_cover_flow">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show cover &browser in a separate window (needs restart)</string>
|
<string>Show cover &browser in a separate window (needs restart)</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QCheckBox" name="systray_notifications">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show &notifications in system tray</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -105,6 +105,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn):
|
|||||||
return self.simple_error('', _('No lookup name was provided'))
|
return self.simple_error('', _('No lookup name was provided'))
|
||||||
if re.match('^\w*$', col) is None or not col[0].isalpha() or col.lower() != col:
|
if re.match('^\w*$', col) is None or not col[0].isalpha() or col.lower() != col:
|
||||||
return self.simple_error('', _('The lookup name must contain only lower case letters, digits and underscores, and start with a letter'))
|
return self.simple_error('', _('The lookup name must contain only lower case letters, digits and underscores, and start with a letter'))
|
||||||
|
if col.endswith('_index'):
|
||||||
|
return self.simple_error('', _('Lookup names cannot end with _index, because these names are reserved for the index of a series column.'))
|
||||||
col_heading = unicode(self.column_heading_box.text())
|
col_heading = unicode(self.column_heading_box.text())
|
||||||
col_type = self.column_types[self.column_type_box.currentIndex()]['datatype']
|
col_type = self.column_types[self.column_type_box.currentIndex()]['datatype']
|
||||||
if col_type == '*text':
|
if col_type == '*text':
|
||||||
|
@ -199,6 +199,9 @@ 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
|
||||||
|
|
||||||
|
if self.remove_all_tags.isChecked():
|
||||||
|
remove = self.db.all_tags()
|
||||||
|
else:
|
||||||
remove = unicode(self.remove_tags.text()).strip().split(',')
|
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())
|
||||||
|
@ -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>&Series:</string>
|
<string>&Series:</string>
|
||||||
|
@ -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>&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>
|
||||||
|
@ -15,7 +15,7 @@ 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
|
||||||
|
|
||||||
@ -97,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()
|
||||||
@ -207,33 +208,31 @@ 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()
|
||||||
self.preferred_width = self.sizeHint().width()
|
self.preferred_width = self.sizeHint().width()
|
||||||
|
|
||||||
def apply_settings(self):
|
def apply_settings(self):
|
||||||
sz = gprefs.get('toolbar_icon_size', 'medium')
|
sz = gprefs['toolbar_icon_size']
|
||||||
sz = {'small':24, 'medium':48, 'large':64}[sz]
|
sz = {'small':24, 'medium':48, 'large':64}[sz]
|
||||||
self.setIconSize(QSize(sz, sz))
|
self.setIconSize(QSize(sz, sz))
|
||||||
style = Qt.ToolButtonTextUnderIcon
|
style = Qt.ToolButtonTextUnderIcon
|
||||||
if gprefs.get('toolbar_text', 'auto') == 'never':
|
if gprefs['toolbar_text'] == '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):
|
||||||
|
self.showing_donate = False
|
||||||
showing_device = self.location_manager.has_device
|
showing_device = self.location_manager.has_device
|
||||||
actions = '-device' if showing_device else ''
|
actions = '-device' if showing_device else ''
|
||||||
actions = gprefs['action-layout-toolbar'+actions]
|
actions = gprefs['action-layout-toolbar'+actions]
|
||||||
@ -247,8 +246,12 @@ 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)
|
||||||
|
self.showing_donate = True
|
||||||
elif what in self.gui.iactions:
|
elif what in self.gui.iactions:
|
||||||
action = self.gui.iactions[what]
|
action = self.gui.iactions[what]
|
||||||
self.addAction(action.qaction)
|
self.addAction(action.qaction)
|
||||||
@ -264,7 +267,7 @@ class ToolBar(QToolBar): # {{{
|
|||||||
def resizeEvent(self, ev):
|
def resizeEvent(self, ev):
|
||||||
QToolBar.resizeEvent(self, ev)
|
QToolBar.resizeEvent(self, ev)
|
||||||
style = Qt.ToolButtonTextUnderIcon
|
style = Qt.ToolButtonTextUnderIcon
|
||||||
p = gprefs.get('toolbar_text', 'auto')
|
p = gprefs['toolbar_text']
|
||||||
if p == 'never':
|
if p == 'never':
|
||||||
style = Qt.ToolButtonIconOnly
|
style = Qt.ToolButtonIconOnly
|
||||||
|
|
||||||
@ -278,7 +281,7 @@ class ToolBar(QToolBar): # {{{
|
|||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
class MainWindowMixin(object):
|
class MainWindowMixin(object): # {{{
|
||||||
|
|
||||||
def __init__(self, db):
|
def __init__(self, db):
|
||||||
self.setObjectName('MainWindow')
|
self.setObjectName('MainWindow')
|
||||||
@ -291,7 +294,7 @@ class MainWindowMixin(object):
|
|||||||
self._central_widget_layout = QVBoxLayout()
|
self._central_widget_layout = QVBoxLayout()
|
||||||
self.centralwidget.setLayout(self._central_widget_layout)
|
self.centralwidget.setLayout(self._central_widget_layout)
|
||||||
self.resize(1012, 740)
|
self.resize(1012, 740)
|
||||||
self.donate_button = ThrobbingButton(self.centralwidget)
|
self.donate_button = ThrobbingButton()
|
||||||
self.location_manager = LocationManager(self)
|
self.location_manager = LocationManager(self)
|
||||||
|
|
||||||
self.iactions['Fetch News'].init_scheduler(db)
|
self.iactions['Fetch News'].init_scheduler(db)
|
||||||
@ -304,7 +307,7 @@ class MainWindowMixin(object):
|
|||||||
l = self.centralwidget.layout()
|
l = self.centralwidget.layout()
|
||||||
l.addWidget(self.search_bar)
|
l.addWidget(self.search_bar)
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -229,6 +229,8 @@ class BooksView(QTableView): # {{{
|
|||||||
def cleanup_sort_history(self, sort_history):
|
def cleanup_sort_history(self, sort_history):
|
||||||
history = []
|
history = []
|
||||||
for col, order in sort_history:
|
for col, order in sort_history:
|
||||||
|
if col == 'date':
|
||||||
|
col = 'timestamp'
|
||||||
if col in self.column_map and (not history or history[0][0] != col):
|
if col in self.column_map and (not history or history[0][0] != col):
|
||||||
history.append([col, order])
|
history.append([col, order])
|
||||||
return history
|
return history
|
||||||
|
@ -241,7 +241,7 @@ class GuiRunner(QObject):
|
|||||||
QApplication.instance().processEvents()
|
QApplication.instance().processEvents()
|
||||||
|
|
||||||
def initialize(self, *args):
|
def initialize(self, *args):
|
||||||
if gprefs.get('show_splash_screen', True):
|
if gprefs['show_splash_screen']:
|
||||||
self.show_splash_screen()
|
self.show_splash_screen()
|
||||||
|
|
||||||
self.library_path = get_library_path(parent=self.splash_screen)
|
self.library_path = get_library_path(parent=self.splash_screen)
|
||||||
|
@ -5,30 +5,183 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
from PyQt4.Qt import QWidget, pyqtSignal
|
from PyQt4.Qt import QWidget, pyqtSignal, QCheckBox, QAbstractSpinBox, \
|
||||||
|
QLineEdit, QComboBox, QVariant
|
||||||
|
|
||||||
class PreferenceWidget(QWidget):
|
from calibre.customize.ui import preferences_plugins
|
||||||
|
|
||||||
category = None
|
class ConfigWidgetInterface(object):
|
||||||
name = None
|
|
||||||
|
|
||||||
changed_signal = pyqtSignal()
|
changed_signal = None
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
|
||||||
QWidget.__init__(self, parent)
|
|
||||||
|
|
||||||
self.has_changed = False
|
|
||||||
self.changed.connect(lambda : setattr(self, 'has_changed', True))
|
|
||||||
self.setupUi(self)
|
|
||||||
|
|
||||||
def genesis(self, gui):
|
def genesis(self, gui):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def reset_to_defaults(self):
|
def restore_defaults(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def commit(self):
|
def commit(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def add_boolean(self, widget_name, preference_interface, pref_name):
|
class Setting(object):
|
||||||
pass
|
|
||||||
|
def __init__(self, name, config_obj, widget, gui_name=None,
|
||||||
|
empty_string_is_None=True, choices=None):
|
||||||
|
self.name, self.gui_name = name, gui_name
|
||||||
|
self.empty_string_is_None = empty_string_is_None
|
||||||
|
self.choices = choices
|
||||||
|
if gui_name is None:
|
||||||
|
self.gui_name = 'opt_'+name
|
||||||
|
self.config_obj = config_obj
|
||||||
|
self.gui_obj = getattr(widget, self.gui_name)
|
||||||
|
|
||||||
|
if isinstance(self.gui_obj, QCheckBox):
|
||||||
|
self.datatype = 'bool'
|
||||||
|
self.gui_obj.stateChanged.connect(lambda x:
|
||||||
|
widget.changed_signal.emit())
|
||||||
|
elif isinstance(self.gui_obj, QAbstractSpinBox):
|
||||||
|
self.datatype = 'number'
|
||||||
|
self.gui_obj.valueChanged.connect(lambda x:
|
||||||
|
widget.changed_signal.emit())
|
||||||
|
elif isinstance(self.gui_obj, QLineEdit):
|
||||||
|
self.datatype = 'string'
|
||||||
|
self.gui_obj.textChanged.connect(lambda x:
|
||||||
|
widget.changed_signal.emit())
|
||||||
|
elif isinstance(self.gui_obj, QComboBox):
|
||||||
|
self.datatype = 'choice'
|
||||||
|
self.gui_obj.editTextChanged.connect(lambda x:
|
||||||
|
widget.changed_signal.emit())
|
||||||
|
self.gui_obj.currentIndexChanged.connect(lambda x:
|
||||||
|
widget.changed_signal.emit())
|
||||||
|
else:
|
||||||
|
raise ValueError('Unknown data type')
|
||||||
|
|
||||||
|
def initialize(self):
|
||||||
|
self.gui_obj.blockSignals(True)
|
||||||
|
if self.datatype == 'choices':
|
||||||
|
self.gui_obj.clear()
|
||||||
|
for x in self.choices:
|
||||||
|
if isinstance(x, basestring):
|
||||||
|
x = (x, x)
|
||||||
|
self.gui_obj.addItem(x[0], QVariant(x[1]))
|
||||||
|
self.set_gui_val(self.get_config_val(default=False))
|
||||||
|
self.gui_obj.blockSignals(False)
|
||||||
|
|
||||||
|
def commit(self):
|
||||||
|
self.set_config_val(self.get_gui_val())
|
||||||
|
|
||||||
|
def restore_defaults(self):
|
||||||
|
self.set_gui_val(self.get_config_val(default=True))
|
||||||
|
|
||||||
|
def get_config_val(self, default=False):
|
||||||
|
if default:
|
||||||
|
val = self.config_obj.defaults[self.name]
|
||||||
|
else:
|
||||||
|
val = self.config_obj[self.name]
|
||||||
|
return val
|
||||||
|
|
||||||
|
def set_config_val(self, val):
|
||||||
|
self.config_obj[self.name] = val
|
||||||
|
|
||||||
|
def set_gui_val(self, val):
|
||||||
|
if self.datatype == 'bool':
|
||||||
|
self.gui_obj.setChecked(bool(val))
|
||||||
|
elif self.datatype == 'number':
|
||||||
|
self.gui_obj.setValue(val)
|
||||||
|
elif self.datatype == 'string':
|
||||||
|
self.gui_obj.setText(val if val else '')
|
||||||
|
elif self.datatype == 'choices':
|
||||||
|
idx = self.gui_obj.findData(QVariant(val))
|
||||||
|
if idx == -1:
|
||||||
|
idx = 0
|
||||||
|
self.gui_obj.setCurrentIndex(idx)
|
||||||
|
|
||||||
|
def get_gui_val(self):
|
||||||
|
if self.datatype == 'bool':
|
||||||
|
val = bool(self.gui_obj.isChecked())
|
||||||
|
elif self.datatype == 'number':
|
||||||
|
val = self.gui_obj.value(val)
|
||||||
|
elif self.datatype == 'string':
|
||||||
|
val = unicode(self.gui_name.text()).strip()
|
||||||
|
if self.empty_string_is_None and not val:
|
||||||
|
val = None
|
||||||
|
elif self.datatype == 'choices':
|
||||||
|
idx = self.gui_obj.currentIndex()
|
||||||
|
if idx < 0: idx = 0
|
||||||
|
val = unicode(self.gui_obj.itemData(idx).toString())
|
||||||
|
return val
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigWidgetBase(QWidget, ConfigWidgetInterface):
|
||||||
|
|
||||||
|
changed_signal = pyqtSignal()
|
||||||
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
QWidget.__init__(self, parent)
|
||||||
|
if hasattr(self, 'setupUi'):
|
||||||
|
self.setupUi(self)
|
||||||
|
self.settings = {}
|
||||||
|
|
||||||
|
def register(self, name, config_obj, gui_name=None, choices=None, setting=Setting):
|
||||||
|
setting = setting(name, config_obj, self, gui_name=gui_name,
|
||||||
|
choices=choices)
|
||||||
|
self.register_setting(setting)
|
||||||
|
|
||||||
|
def register_setting(self, setting):
|
||||||
|
self.settings[setting.name] = setting
|
||||||
|
return setting
|
||||||
|
|
||||||
|
def initialize(self):
|
||||||
|
for setting in self.settings.values():
|
||||||
|
setting.initialize()
|
||||||
|
|
||||||
|
def commit(self):
|
||||||
|
for setting in self.settings.values():
|
||||||
|
setting.commit()
|
||||||
|
|
||||||
|
def restore_defaults(self, *args):
|
||||||
|
for setting in self.settings.values():
|
||||||
|
setting.restore_defaults()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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()
|
||||||
|
d.setLayout(l)
|
||||||
|
l.addWidget(w)
|
||||||
|
l.addWidget(bb)
|
||||||
|
if gui is None:
|
||||||
|
from calibre.gui2.ui import Main
|
||||||
|
from calibre.gui2.main import option_parser
|
||||||
|
from calibre.library 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, show_gui=False)
|
||||||
|
w.genesis(gui)
|
||||||
|
if d.exec_() == QDialog.Accepted:
|
||||||
|
w.commit()
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
263
src/calibre/gui2/preferences/behavior.ui
Normal file
263
src/calibre/gui2/preferences/behavior.ui
Normal file
@ -0,0 +1,263 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Form</class>
|
||||||
|
<widget class="QWidget" name="Form">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>672</width>
|
||||||
|
<height>563</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="opt_overwrite_author_title_metadata">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Overwrite author and title by default when fetching metadata</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="opt_get_social_metadata">
|
||||||
|
<property name="text">
|
||||||
|
<string>Download &social metadata (tags/ratings/etc.) by default</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="new_version_notification">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show notification when &new version is available</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="sync_news">
|
||||||
|
<property name="text">
|
||||||
|
<string>Automatically send downloaded &news to ebook reader</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="delete_news">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Delete news from library when it is automatically sent to reader</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0" colspan="2">
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Default network &timeout:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>timeout</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QSpinBox" name="timeout">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Set the default timeout for network fetches (i.e. anytime we go out to the internet to get information)</string>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string> seconds</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>120</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QComboBox" name="priority">
|
||||||
|
<property name="sizeAdjustPolicy">
|
||||||
|
<enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
|
||||||
|
</property>
|
||||||
|
<property name="minimumContentsLength">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Normal</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>High</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Low</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="priority_label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Job &priority:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>priority</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_23">
|
||||||
|
<property name="text">
|
||||||
|
<string>Preferred &output format:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>output_format</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="output_format">
|
||||||
|
<property name="sizeAdjustPolicy">
|
||||||
|
<enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
|
||||||
|
</property>
|
||||||
|
<property name="minimumContentsLength">
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_170">
|
||||||
|
<property name="text">
|
||||||
|
<string>Restriction to apply when the current library is opened:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>opt_gui_restriction</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QComboBox" name="opt_gui_restriction">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>250</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Apply this restriction on calibre startup if the current library is being used. Also applied when switching to this library. Note that this setting is per library. </string>
|
||||||
|
</property>
|
||||||
|
<property name="sizeAdjustPolicy">
|
||||||
|
<enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
|
||||||
|
</property>
|
||||||
|
<property name="minimumContentsLength">
|
||||||
|
<number>15</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0" colspan="2">
|
||||||
|
<widget class="QPushButton" name="reset_confirmation_button">
|
||||||
|
<property name="text">
|
||||||
|
<string>Reset all disabled &confirmation dialogs</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="0">
|
||||||
|
<widget class="QGroupBox" name="groupBox_5">
|
||||||
|
<property name="title">
|
||||||
|
<string>Preferred &input format order:</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_11">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_10">
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="input_order">
|
||||||
|
<property name="alternatingRowColors">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="selectionBehavior">
|
||||||
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_10">
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="input_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_5">
|
||||||
|
<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="input_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>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="1">
|
||||||
|
<widget class="QGroupBox" name="groupBox_3">
|
||||||
|
<property name="title">
|
||||||
|
<string>Use internal &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 name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::NoSelection</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources>
|
||||||
|
<include location="../../../../resources/images.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
170
src/calibre/gui2/preferences/custom_columns.ui
Normal file
170
src/calibre/gui2/preferences/custom_columns.ui
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Form</class>
|
||||||
|
<widget class="QWidget" name="Form">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>504</width>
|
||||||
|
<height>399</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0" colspan="2">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Here you can re-arrange the layout of the columns in the calibre library book list. You can hide columns by unchecking them. You can also create your own, custom columns.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QListWidget" name="columns">
|
||||||
|
<property name="alternatingRowColors">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="selectionBehavior">
|
||||||
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<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_3">
|
||||||
|
<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_4">
|
||||||
|
<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_5">
|
||||||
|
<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>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<widget class="QPushButton" name="pushButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Add &custom column</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources>
|
||||||
|
<include location="../../../../resources/images.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
62
src/calibre/gui2/preferences/look_feel.py
Normal file
62
src/calibre/gui2/preferences/look_feel.py
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#!/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 calibre.gui2.preferences import ConfigWidgetBase, test_widget
|
||||||
|
from calibre.gui2.preferences.look_feel_ui import Ui_Form
|
||||||
|
from calibre.gui2 import config, gprefs
|
||||||
|
from calibre.utils.localization import available_translations, \
|
||||||
|
get_language, get_lang
|
||||||
|
from calibre.utils.config import prefs
|
||||||
|
|
||||||
|
class ConfigWidget(ConfigWidgetBase, Ui_Form):
|
||||||
|
|
||||||
|
def genesis(self, gui):
|
||||||
|
self.gui = gui
|
||||||
|
|
||||||
|
r = self.register
|
||||||
|
|
||||||
|
r('gui_layout', config, choices=
|
||||||
|
[(_('Wide'), 'wide'), (_('Narrow'), 'narrow')])
|
||||||
|
|
||||||
|
r('cover_flow_queue_length', config)
|
||||||
|
|
||||||
|
lang = get_lang()
|
||||||
|
if lang is None or lang not in available_translations():
|
||||||
|
lang = 'en'
|
||||||
|
items = [(l, get_language(l)) for l in available_translations() \
|
||||||
|
if l != lang]
|
||||||
|
if lang != 'en':
|
||||||
|
items.append(('en', get_language('en')))
|
||||||
|
items.sort(cmp=lambda x, y: cmp(x[1], y[1]))
|
||||||
|
choices = [(y, x) for x, y in items]
|
||||||
|
# Default language is the autodetected one
|
||||||
|
choices = [get_language(lang), lang] + choices
|
||||||
|
r('language', prefs, choices=choices)
|
||||||
|
|
||||||
|
r('show_avg_rating', config)
|
||||||
|
r('disable_animations', config)
|
||||||
|
r('systray_icon', config)
|
||||||
|
r('show_splash_screen', gprefs)
|
||||||
|
r('disable_tray_notification', config)
|
||||||
|
r('use_roman_numerals_for_series_number', config)
|
||||||
|
r('separate_cover_flow', config)
|
||||||
|
r('search_as_you_type', config)
|
||||||
|
|
||||||
|
choices = [(_('Small'), 'small'), (_('Medium'), 'medium'),
|
||||||
|
(_('Large'), 'large')]
|
||||||
|
r('toolbar_icon_size', gprefs, choices=choices)
|
||||||
|
|
||||||
|
choices = [(_('Automatic'), 'auto'), (_('Always'), 'always'),
|
||||||
|
(_('Never'), 'never')]
|
||||||
|
r('toolbar_text', gprefs, choices=choices)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
from PyQt4.Qt import QApplication
|
||||||
|
app = QApplication([])
|
||||||
|
test_widget('Interface', 'Look & Feel')
|
||||||
|
|
196
src/calibre/gui2/preferences/look_feel.ui
Normal file
196
src/calibre/gui2/preferences/look_feel.ui
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Form</class>
|
||||||
|
<widget class="QWidget" name="Form">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>670</width>
|
||||||
|
<height>385</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_17">
|
||||||
|
<property name="text">
|
||||||
|
<string>User Interface &layout (needs restart):</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>opt_gui_layout</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="opt_gui_layout">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>250</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="sizeAdjustPolicy">
|
||||||
|
<enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
|
||||||
|
</property>
|
||||||
|
<property name="minimumContentsLength">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_6">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Number of covers to show in browse mode (needs restart):</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>opt_cover_flow_queue_length</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QSpinBox" name="opt_cover_flow_queue_length"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_7">
|
||||||
|
<property name="text">
|
||||||
|
<string>Choose &language (requires restart):</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>opt_language</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QComboBox" name="opt_language">
|
||||||
|
<property name="sizeAdjustPolicy">
|
||||||
|
<enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
|
||||||
|
</property>
|
||||||
|
<property name="minimumContentsLength">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QCheckBox" name="opt_show_avg_rating">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show &average ratings in the tags browser</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QCheckBox" name="opt_disable_animations">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Disable all animations. Useful if you have a slow/old computer.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Disable &animations</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QCheckBox" name="opt_systray_icon">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable system &tray icon (needs restart)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QCheckBox" name="opt_show_splash_screen">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show &splash screen at startup</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QCheckBox" name="opt_disable_tray_notification">
|
||||||
|
<property name="text">
|
||||||
|
<string>Disable &notifications in system tray</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QCheckBox" name="opt_use_roman_numerals_for_series_number">
|
||||||
|
<property name="text">
|
||||||
|
<string>Use &Roman numerals for series</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QCheckBox" name="opt_separate_cover_flow">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show cover &browser in a separate window (needs restart)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
|
<widget class="QCheckBox" name="opt_search_as_you_type">
|
||||||
|
<property name="text">
|
||||||
|
<string>Search as you type</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
|
<property name="title">
|
||||||
|
<string>&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>&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 &text under icons:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>opt_toolbar_text</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="0" colspan="2">
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -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()
|
||||||
@ -108,7 +110,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{
|
|||||||
|
|
||||||
self.iactions = acmap
|
self.iactions = acmap
|
||||||
|
|
||||||
def initialize(self, library_path, db, listener, actions):
|
def initialize(self, library_path, db, listener, actions, show_gui=True):
|
||||||
opts = self.opts
|
opts = self.opts
|
||||||
self.preferences_action, self.quit_action = actions
|
self.preferences_action, self.quit_action = actions
|
||||||
self.library_path = library_path
|
self.library_path = library_path
|
||||||
@ -201,6 +203,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{
|
|||||||
####################### Library view ########################
|
####################### Library view ########################
|
||||||
LibraryViewMixin.__init__(self, db)
|
LibraryViewMixin.__init__(self, db)
|
||||||
|
|
||||||
|
if show_gui:
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
if self.system_tray_icon.isVisible() and opts.start_in_tray:
|
if self.system_tray_icon.isVisible() and opts.start_in_tray:
|
||||||
@ -249,6 +252,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, # {{{
|
|||||||
|
|
||||||
self.read_settings()
|
self.read_settings()
|
||||||
self.finalize_layout()
|
self.finalize_layout()
|
||||||
|
if self.tool_bar.showing_donate:
|
||||||
self.donate_button.start_animation()
|
self.donate_button.start_animation()
|
||||||
self.set_window_title()
|
self.set_window_title()
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ from PyQt4.Qt import QIcon, QFont, QLabel, QListWidget, QAction, \
|
|||||||
QPixmap, QSplitterHandle, QToolButton, \
|
QPixmap, QSplitterHandle, QToolButton, \
|
||||||
QAbstractListModel, QVariant, Qt, SIGNAL, pyqtSignal, \
|
QAbstractListModel, QVariant, Qt, SIGNAL, pyqtSignal, \
|
||||||
QRegExp, QSettings, QSize, QSplitter, \
|
QRegExp, QSettings, QSize, QSplitter, \
|
||||||
QPainter, QLineEdit, QComboBox, \
|
QPainter, QLineEdit, QComboBox, QPen, \
|
||||||
QMenu, QStringListModel, QCompleter, QStringList, \
|
QMenu, QStringListModel, QCompleter, QStringList, \
|
||||||
QTimer, QRect
|
QTimer, QRect
|
||||||
|
|
||||||
@ -151,11 +151,14 @@ class FormatList(QListWidget):
|
|||||||
|
|
||||||
class ImageView(QWidget):
|
class ImageView(QWidget):
|
||||||
|
|
||||||
|
BORDER_WIDTH = 1
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
QWidget.__init__(self, parent)
|
QWidget.__init__(self, parent)
|
||||||
self._pixmap = QPixmap(self)
|
self._pixmap = QPixmap(self)
|
||||||
self.setMinimumSize(QSize(150, 200))
|
self.setMinimumSize(QSize(150, 200))
|
||||||
self.setAcceptDrops(True)
|
self.setAcceptDrops(True)
|
||||||
|
self.draw_border = True
|
||||||
|
|
||||||
# Drag 'n drop {{{
|
# Drag 'n drop {{{
|
||||||
DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS
|
DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS
|
||||||
@ -229,6 +232,11 @@ class ImageView(QWidget):
|
|||||||
p = QPainter(self)
|
p = QPainter(self)
|
||||||
p.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
|
p.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
|
||||||
p.drawPixmap(target, pmap)
|
p.drawPixmap(target, pmap)
|
||||||
|
pen = QPen()
|
||||||
|
pen.setWidth(self.BORDER_WIDTH)
|
||||||
|
p.setPen(pen)
|
||||||
|
if self.draw_border:
|
||||||
|
p.drawRect(target)
|
||||||
p.end()
|
p.end()
|
||||||
|
|
||||||
|
|
||||||
|
@ -264,7 +264,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
# account for the series index column. Field_metadata knows that
|
# account for the series index column. Field_metadata knows that
|
||||||
# the series index is one larger than the series. If you change
|
# the series index is one larger than the series. If you change
|
||||||
# it here, be sure to change it there as well.
|
# it here, be sure to change it there as well.
|
||||||
self.FIELD_MAP[str(col)+'_s_index'] = base = base+1
|
self.FIELD_MAP[str(col)+'_index'] = base = base+1
|
||||||
|
self.field_metadata.set_field_record_index(
|
||||||
|
self.custom_column_num_map[col]['label']+'_index',
|
||||||
|
base,
|
||||||
|
prefer_custom=True)
|
||||||
|
|
||||||
self.FIELD_MAP['cover'] = base+1
|
self.FIELD_MAP['cover'] = base+1
|
||||||
self.field_metadata.set_field_record_index('cover', base+1, prefer_custom=False)
|
self.field_metadata.set_field_record_index('cover', base+1, prefer_custom=False)
|
||||||
|
@ -36,7 +36,7 @@ class FieldMetadata(dict):
|
|||||||
treated as a single term. If not None, it contains a string, and the field
|
treated as a single term. If not None, it contains a string, and the field
|
||||||
is assumed to contain a list of terms separated by that string
|
is assumed to contain a list of terms separated by that string
|
||||||
|
|
||||||
kind == standard: is a db field.
|
kind == field: is a db field.
|
||||||
kind == category: standard tag category that isn't a field. see news.
|
kind == category: standard tag category that isn't a field. see news.
|
||||||
kind == user: user-defined tag category.
|
kind == user: user-defined tag category.
|
||||||
kind == search: saved-searches category.
|
kind == search: saved-searches category.
|
||||||
@ -239,7 +239,7 @@ class FieldMetadata(dict):
|
|||||||
'is_multiple':None,
|
'is_multiple':None,
|
||||||
'kind':'field',
|
'kind':'field',
|
||||||
'name':None,
|
'name':None,
|
||||||
'search_terms':[],
|
'search_terms':['series_index'],
|
||||||
'is_custom':False,
|
'is_custom':False,
|
||||||
'is_category':False}),
|
'is_category':False}),
|
||||||
('sort', {'table':None,
|
('sort', {'table':None,
|
||||||
@ -395,6 +395,18 @@ class FieldMetadata(dict):
|
|||||||
'is_editable': is_editable,}
|
'is_editable': is_editable,}
|
||||||
self._add_search_terms_to_map(key, [key])
|
self._add_search_terms_to_map(key, [key])
|
||||||
self.custom_label_to_key_map[label] = key
|
self.custom_label_to_key_map[label] = key
|
||||||
|
if datatype == 'series':
|
||||||
|
key += '_index'
|
||||||
|
self._tb_cats[key] = {'table':None, 'column':None,
|
||||||
|
'datatype':'float', 'is_multiple':False,
|
||||||
|
'kind':'field', 'name':'',
|
||||||
|
'search_terms':[key], 'label':label+'_index',
|
||||||
|
'colnum':None, 'display':{},
|
||||||
|
'is_custom':False, 'is_category':False,
|
||||||
|
'link_column':None, 'category_sort':None,
|
||||||
|
'is_editable': False,}
|
||||||
|
self._add_search_terms_to_map(key, [key])
|
||||||
|
self.custom_label_to_key_map[label+'_index'] = key
|
||||||
|
|
||||||
def remove_custom_fields(self):
|
def remove_custom_fields(self):
|
||||||
for key in self.get_custom_fields():
|
for key in self.get_custom_fields():
|
||||||
|
@ -15,6 +15,7 @@ class DBPrefs(dict):
|
|||||||
def __init__(self, db):
|
def __init__(self, db):
|
||||||
dict.__init__(self)
|
dict.__init__(self)
|
||||||
self.db = db
|
self.db = db
|
||||||
|
self.defaults = {}
|
||||||
for key, val in self.db.conn.get('SELECT key,val FROM preferences'):
|
for key, val in self.db.conn.get('SELECT key,val FROM preferences'):
|
||||||
val = self.raw_to_object(val)
|
val = self.raw_to_object(val)
|
||||||
dict.__setitem__(self, key, val)
|
dict.__setitem__(self, key, val)
|
||||||
@ -28,7 +29,10 @@ class DBPrefs(dict):
|
|||||||
return json.dumps(val, indent=2, default=to_json)
|
return json.dumps(val, indent=2, default=to_json)
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
|
try:
|
||||||
return dict.__getitem__(self, key)
|
return dict.__getitem__(self, key)
|
||||||
|
except KeyError:
|
||||||
|
return self.defaults[key]
|
||||||
|
|
||||||
def __delitem__(self, key):
|
def __delitem__(self, key):
|
||||||
dict.__delitem__(self, key)
|
dict.__delitem__(self, key)
|
||||||
|
@ -19,6 +19,7 @@ from calibre.ebooks.metadata import fmt_sidx
|
|||||||
from calibre.library.comments import comments_to_html
|
from calibre.library.comments import comments_to_html
|
||||||
from calibre import guess_type
|
from calibre import guess_type
|
||||||
from calibre.utils.ordered_dict import OrderedDict
|
from calibre.utils.ordered_dict import OrderedDict
|
||||||
|
from calibre.utils.date import format_date
|
||||||
|
|
||||||
BASE_HREFS = {
|
BASE_HREFS = {
|
||||||
0 : '/stanza',
|
0 : '/stanza',
|
||||||
@ -130,7 +131,7 @@ def CATALOG_GROUP_ENTRY(item, category, base_href, version, updated):
|
|||||||
link
|
link
|
||||||
)
|
)
|
||||||
|
|
||||||
def ACQUISITION_ENTRY(item, version, FM, updated):
|
def ACQUISITION_ENTRY(item, version, FM, updated, CFM, CKEYS):
|
||||||
title = item[FM['title']]
|
title = item[FM['title']]
|
||||||
if not title:
|
if not title:
|
||||||
title = _('Unknown')
|
title = _('Unknown')
|
||||||
@ -153,6 +154,21 @@ def ACQUISITION_ENTRY(item, version, FM, updated):
|
|||||||
extra.append(_('SERIES: %s [%s]<br />')%\
|
extra.append(_('SERIES: %s [%s]<br />')%\
|
||||||
(series,
|
(series,
|
||||||
fmt_sidx(float(item[FM['series_index']]))))
|
fmt_sidx(float(item[FM['series_index']]))))
|
||||||
|
for key in CKEYS:
|
||||||
|
val = item[CFM[key]['rec_index']]
|
||||||
|
if val is not None:
|
||||||
|
name = CFM[key]['name']
|
||||||
|
datatype = CFM[key]['datatype']
|
||||||
|
if datatype == 'text' and CFM[key]['is_multiple']:
|
||||||
|
extra.append('%s: %s<br />'%(name, ', '.join(val.split('|'))))
|
||||||
|
elif datatype == 'series':
|
||||||
|
extra.append('%s: %s [%s]<br />'%(name, val,
|
||||||
|
fmt_sidx(item[CFM.cc_series_index_column_for(key)])))
|
||||||
|
elif datatype == 'datetime':
|
||||||
|
extra.append('%s: %s<br />'%(name,
|
||||||
|
format_date(val, CFM[key]['display'].get('date_format','dd MMM yyyy'))))
|
||||||
|
else:
|
||||||
|
extra.append('%s: %s <br />' % (CFM[key]['name'], val))
|
||||||
comments = item[FM['comments']]
|
comments = item[FM['comments']]
|
||||||
if comments:
|
if comments:
|
||||||
comments = comments_to_html(comments)
|
comments = comments_to_html(comments)
|
||||||
@ -260,10 +276,14 @@ class NavFeed(Feed):
|
|||||||
class AcquisitionFeed(NavFeed):
|
class AcquisitionFeed(NavFeed):
|
||||||
|
|
||||||
def __init__(self, updated, id_, items, offsets, page_url, up_url, version,
|
def __init__(self, updated, id_, items, offsets, page_url, up_url, version,
|
||||||
FM):
|
FM, CFM):
|
||||||
NavFeed.__init__(self, id_, updated, version, offsets, page_url, up_url)
|
NavFeed.__init__(self, id_, updated, version, offsets, page_url, up_url)
|
||||||
|
CKEYS = [key for key in sorted(CFM.get_custom_fields(),
|
||||||
|
cmp=lambda x,y: cmp(CFM[x]['name'].lower(),
|
||||||
|
CFM[y]['name'].lower()))]
|
||||||
for item in items:
|
for item in items:
|
||||||
self.root.append(ACQUISITION_ENTRY(item, version, FM, updated))
|
self.root.append(ACQUISITION_ENTRY(item, version, FM, updated,
|
||||||
|
CFM, CKEYS))
|
||||||
|
|
||||||
class CategoryFeed(NavFeed):
|
class CategoryFeed(NavFeed):
|
||||||
|
|
||||||
@ -360,7 +380,7 @@ class OPDSServer(object):
|
|||||||
cherrypy.response.headers['Last-Modified'] = self.last_modified(updated)
|
cherrypy.response.headers['Last-Modified'] = self.last_modified(updated)
|
||||||
cherrypy.response.headers['Content-Type'] = 'application/atom+xml;profile=opds-catalog'
|
cherrypy.response.headers['Content-Type'] = 'application/atom+xml;profile=opds-catalog'
|
||||||
return str(AcquisitionFeed(updated, id_, items, offsets,
|
return str(AcquisitionFeed(updated, id_, items, offsets,
|
||||||
page_url, up_url, version, self.db.FIELD_MAP))
|
page_url, up_url, version, self.db.FIELD_MAP, self.db.field_metadata))
|
||||||
|
|
||||||
def opds_search(self, query=None, version=0, offset=0):
|
def opds_search(self, query=None, version=0, offset=0):
|
||||||
try:
|
try:
|
||||||
@ -568,7 +588,10 @@ class OPDSServer(object):
|
|||||||
(_('Newest'), _('Date'), 'Onewest'),
|
(_('Newest'), _('Date'), 'Onewest'),
|
||||||
(_('Title'), _('Title'), 'Otitle'),
|
(_('Title'), _('Title'), 'Otitle'),
|
||||||
]
|
]
|
||||||
for category in categories:
|
def getter(x):
|
||||||
|
return category_meta[x]['name'].lower()
|
||||||
|
for category in sorted(categories,
|
||||||
|
cmp=lambda x,y: cmp(getter(x), getter(y))):
|
||||||
if len(categories[category]) == 0:
|
if len(categories[category]) == 0:
|
||||||
continue
|
continue
|
||||||
if category == 'formats':
|
if category == 'formats':
|
||||||
|
@ -81,7 +81,7 @@ Device Integration
|
|||||||
|
|
||||||
What devices does |app| support?
|
What devices does |app| support?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
At the moment |app| has full support for the SONY PRS 300/500/505/600/700/900, Barnes & Noble Nook, Cybook Gen 3/Opus, Amazon Kindle 1/2/DX, Entourage Edge, Longshine ShineBook, Ectaco Jetbook, BeBook/BeBook Mini, Irex Illiad/DR1000, Foxit eSlick, PocketBook 360, Italica, eClicto, Iriver Story, Airis dBook, Hanvon N515, Binatone Readme, Teclast K3, SpringDesign Alex, Kobo Reader, various Android phones and the iPhone/iPad. In addition, using the :guilabel:`Save to disk` function you can use it with any ebook reader that exports itself as a USB disk.
|
At the moment |app| has full support for the SONY PRS 300/500/505/600/700/900, Barnes & Noble Nook, Cybook Gen 3/Opus, Amazon Kindle 1/2/3/DX/DXG, Entourage Edge, Longshine ShineBook, Ectaco Jetbook, BeBook/BeBook Mini, Irex Illiad/DR1000, Foxit eSlick, PocketBook 360, Italica, eClicto, Iriver Story, Airis dBook, Hanvon N515, Binatone Readme, Teclast K3, SpringDesign Alex, Kobo Reader, various Android phones and the iPhone/iPad. In addition, using the :guilabel:`Save to disk` function you can use it with any ebook reader that exports itself as a USB disk.
|
||||||
|
|
||||||
How can I help get my device supported in |app|?
|
How can I help get my device supported in |app|?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -338,6 +338,16 @@ Why does |app| show only some of my fonts on OS X?
|
|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
There can be several causes for this:
|
There can be several causes for this:
|
||||||
|
|
||||||
|
* If you get an error about calibre not being able to open a file because it is in use by another program, do the following:
|
||||||
|
|
||||||
|
* Uninstall calibre
|
||||||
|
* Reboot your computer
|
||||||
|
* Re-install calibre. But do not start calibre from the installation wizard.
|
||||||
|
* Temporarily disable your antivirus program (disconnect from the internet before doing so, to be safe)
|
||||||
|
* Look inside the folder you chose for your calibre library. If you see a file named metadata.db, delete it.
|
||||||
|
* Start calibre
|
||||||
|
* From now on you should be able to start calibre normally.
|
||||||
|
|
||||||
* If you get an error about a Python function terminating unexpectedly after upgrading calibre, first uninstall calibre, then delete the folders (if they exists)
|
* If you get an error about a Python function terminating unexpectedly after upgrading calibre, first uninstall calibre, then delete the folders (if they exists)
|
||||||
:file:`C:\\Program Files\\Calibre` and :file:`C:\\Program Files\\Calibre2`. Now re-install and you should be fine.
|
:file:`C:\\Program Files\\Calibre` and :file:`C:\\Program Files\\Calibre2`. Now re-install and you should be fine.
|
||||||
* If you get an error in the welcome wizard on an initial run of calibre, try choosing a folder like :file:`C:\\library` as the calibre library (calibre sometimes
|
* If you get an error in the welcome wizard on an initial run of calibre, try choosing a folder like :file:`C:\\library` as the calibre library (calibre sometimes
|
||||||
@ -394,4 +404,8 @@ Can I include |app| on a CD to be distributed with my product/magazine?
|
|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|app| is licensed under the GNU General Public License v3 (an open source license). This means that you are free to redistribute |app| as long as you make the source code available. So if you want to put |app| on a CD with your product, you must also put the |app| source code on the CD. The source code is available for download `from googlecode <http://code.google.com/p/calibre-ebook/downloads/list>`_.
|
|app| is licensed under the GNU General Public License v3 (an open source license). This means that you are free to redistribute |app| as long as you make the source code available. So if you want to put |app| on a CD with your product, you must also put the |app| source code on the CD. The source code is available for download `from googlecode <http://code.google.com/p/calibre-ebook/downloads/list>`_.
|
||||||
|
|
||||||
|
How do I run calibre from my USB stick?
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
A portable version of calibre is available at: `portableapps.com <http://portableapps.com/node/20518>`_. However, this is usually out of date. You can also setup your own portable calibre install by following :ref:`these instructions <portablecalibre>`.
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@ Search & Sort
|
|||||||
|
|
||||||
The Search & Sort section allows you to perform several powerful actions on your book collections.
|
The Search & Sort section allows you to perform several powerful actions on your book collections.
|
||||||
|
|
||||||
* You can sort them by title, author, date, rating etc. by clicking on the column titles.
|
* You can sort them by title, author, date, rating etc. by clicking on the column titles. You can also sub-sort (i.e. sort on multiple columns). For example, if you click on the title column and then the author column, the book will be sorted by author and then all the entries for the same author will be sorted by title.
|
||||||
|
|
||||||
* You can search for a particular book or set of books using the search bar. More on that below.
|
* You can search for a particular book or set of books using the search bar. More on that below.
|
||||||
|
|
||||||
@ -212,9 +212,10 @@ metadata.
|
|||||||
You can build advanced search queries easily using the :guilabel:`Advanced Search Dialog`, accessed by
|
You can build advanced search queries easily using the :guilabel:`Advanced Search Dialog`, accessed by
|
||||||
clicking the button |sbi|.
|
clicking the button |sbi|.
|
||||||
|
|
||||||
Available fields for searching are: ``tag, title, author, publisher, series, rating, cover, comments, format,
|
Available fields for searching are: ``tag, title, author, publisher, series, series_index, rating, cover,
|
||||||
isbn, date, pubdate, search, size`` and custom columns. If a device is plugged in, the ``ondevice`` field
|
comments, format, isbn, date, pubdate, search, size`` and custom columns. If a device is plugged in, the
|
||||||
becomes available. To find the search name for a custom column, hover your mouse over the column header.
|
``ondevice`` field becomes available. To find the search name for a custom column, hover your mouse over the
|
||||||
|
column header.
|
||||||
|
|
||||||
The syntax for searching for dates is::
|
The syntax for searching for dates is::
|
||||||
|
|
||||||
@ -223,9 +224,8 @@ The syntax for searching for dates is::
|
|||||||
pubdate:=2009 Will find all books published in 2009
|
pubdate:=2009 Will find all books published in 2009
|
||||||
|
|
||||||
If the date is ambiguous, the current locale is used for date comparison. For example, in an mm/dd/yyyy
|
If the date is ambiguous, the current locale is used for date comparison. For example, in an mm/dd/yyyy
|
||||||
locale, 2/1/2009 is interpreted as 1 Feb 2009. In a dd/mm/yyyy locale, it is interpreted as 2 Jan 2009.
|
locale, 2/1/2009 is interpreted as 1 Feb 2009. In a dd/mm/yyyy locale, it is interpreted as 2 Jan 2009. Some
|
||||||
|
special date strings are available. The string ``today`` translates to today's date, whatever it is. The
|
||||||
Some special date strings are available. The string ``today`` translates to today's date, whatever it is. The
|
|
||||||
strings `yesterday`` and ``thismonth`` also work. In addition, the string ``daysago`` can be used to compare
|
strings `yesterday`` and ``thismonth`` also work. In addition, the string ``daysago`` can be used to compare
|
||||||
to a date some number of days ago, for example: date:>10daysago, date:<=45daysago.
|
to a date some number of days ago, for example: date:>10daysago, date:<=45daysago.
|
||||||
|
|
||||||
@ -234,9 +234,15 @@ You can search for books that have a format of a certain size like this::
|
|||||||
size:>1.1M Will find books with a format larger than 1.1MB
|
size:>1.1M Will find books with a format larger than 1.1MB
|
||||||
size:<=1K Will find books with a format smaller than 1KB
|
size:<=1K Will find books with a format smaller than 1KB
|
||||||
|
|
||||||
Dates and numeric fields support the operators ``=`` (equals), ``>`` (greater than), ``>=`` (greater than or
|
Dates and numeric fields support the relational operators ``=`` (equals), ``>`` (greater than), ``>=``
|
||||||
equal to), ``<`` (less than), ``<=`` (less than or equal to), and ``!=`` (not equal to). Rating fields are
|
(greater than or equal to), ``<`` (less than), ``<=`` (less than or equal to), and ``!=`` (not equal to).
|
||||||
considered to be numeric. For example, the search ``rating:>=3`` will find all books rated 3 or higher.
|
Rating fields are considered to be numeric. For example, the search ``rating:>=3`` will find all books rated 3
|
||||||
|
or higher.
|
||||||
|
|
||||||
|
Series indices are searchable. For the standard series, the search name is 'series_index'. For
|
||||||
|
custom series columns, use the column search name followed by _index. For example, to search the indices for a
|
||||||
|
custom series column named ``#my_series``, you would use the search name ``#my_series_index``.
|
||||||
|
Series indices are numbers, so you can use the relational operators described above.
|
||||||
|
|
||||||
The special field ``search`` is used for saved searches. So if you save a search with the name
|
The special field ``search`` is used for saved searches. So if you save a search with the name
|
||||||
"My spouse's books" you can enter ``search:"My spouse's books"`` in the search bar to reuse the saved
|
"My spouse's books" you can enter ``search:"My spouse's books"`` in the search bar to reuse the saved
|
||||||
@ -310,6 +316,70 @@ Jobs
|
|||||||
|
|
||||||
The Jobs panel shows you the number of currently running jobs. Jobs are tasks that run in a separate process, they include converting ebooks and talking to your reader device. You can click on the jobs panel to access the list of jobs. Once a job has completed, by double-clicking it in the list, you can see a detailed log from that job. This is useful to debug jobs that may not have completed successfully.
|
The Jobs panel shows you the number of currently running jobs. Jobs are tasks that run in a separate process, they include converting ebooks and talking to your reader device. You can click on the jobs panel to access the list of jobs. Once a job has completed, by double-clicking it in the list, you can see a detailed log from that job. This is useful to debug jobs that may not have completed successfully.
|
||||||
|
|
||||||
|
Keyboard Shortcuts
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Calibre has several keyboard shortcuts to save you time and mouse movement. These shortcuts are active in the book list view (when you're not editing the details of a particular book), and most of them affect the title you have selected. The |app| e-book viewer has its own shortcuts, which can be customised by clicking the Preferences button in the viewer.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Note: The Calibre keyboard shortcuts do not require a modifier key (Command, Option, Control etc.), unless specifically noted. You only need to press the letter key, e.g. E to edit.
|
||||||
|
|
||||||
|
.. list-table:: Keyboard Shortcuts
|
||||||
|
:widths: 10 100
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - Keyboard Shortcut
|
||||||
|
- Action
|
||||||
|
* - :kbd:`A`
|
||||||
|
- Add Books
|
||||||
|
* - :kbd:`C`
|
||||||
|
- Convert selected Books
|
||||||
|
* - :kbd:`D`
|
||||||
|
- Send to device
|
||||||
|
* - :kbd:`Del`
|
||||||
|
- Remove selected Books
|
||||||
|
* - :kbd:`E`
|
||||||
|
- Edit metadata of selected books
|
||||||
|
* - :kbd:`I`
|
||||||
|
- Show book details
|
||||||
|
* - :kbd:`M`
|
||||||
|
- Merge selected records
|
||||||
|
* - :kbd:`O`
|
||||||
|
- Open containing folder
|
||||||
|
* - :kbd:`S`
|
||||||
|
- Save to Disk
|
||||||
|
* - :kbd:`V`
|
||||||
|
- View
|
||||||
|
* - :kbd:`Alt+V/Cmd+V in OS X`
|
||||||
|
- View specific format
|
||||||
|
* - :kbd:`Alt+Shift+J`
|
||||||
|
- Toggle jobs list
|
||||||
|
* - :kbd:`Alt+Shift+B`
|
||||||
|
- Toggle Cover Browser
|
||||||
|
* - :kbd:`Alt+Shift+T`
|
||||||
|
- Toggle Tag Browser
|
||||||
|
* - :kbd:`Alt+A`
|
||||||
|
- Show books by the Same author as the current book
|
||||||
|
* - :kbd:`Alt+T`
|
||||||
|
- Show books with the same tags as current book
|
||||||
|
* - :kbd:`Alt+P`
|
||||||
|
- Show books by the same publisher as current book
|
||||||
|
* - :kbd:`Alt+Shift+S`
|
||||||
|
- Show books in the same series as current book
|
||||||
|
* - :kbd:`/, Ctrl+F`
|
||||||
|
- Focus the search bar
|
||||||
|
* - :kbd:`Ctrl+D`
|
||||||
|
- Download metadata and shortcuts
|
||||||
|
* - :kbd:`Ctrl+R`
|
||||||
|
- Restart calibre
|
||||||
|
* - :kbd:`Ctrl+Q`
|
||||||
|
- Quit calibre
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
74
src/calibre/manual/portable.rst
Normal file
74
src/calibre/manual/portable.rst
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
|
||||||
|
.. include:: global.rst
|
||||||
|
|
||||||
|
.. _portablecalibre:
|
||||||
|
|
||||||
|
Creating your own portable/customized calibre install
|
||||||
|
=======================================================
|
||||||
|
|
||||||
|
You can "install" calibre onto a USB stick that you can take with you and use on any computer. The magic is in a .bat file called calibre-portable.bat found in the resources folder in your calibre install. Typical uses of this files are:
|
||||||
|
|
||||||
|
* Run a Mobile Calibre installation with both the Calibre binaries and your ebook library resident on a USB disk or other portable media. In particular it is not necessary to have Calibre installed on the Windows PC that is to run Calibre. This batch file also does not care what drive letter is assigned when you plug in the USB device. It also will not affect any settings on the host machine being a completely self-contained Calibre installation.
|
||||||
|
* Run a networked Calibre installation optimised for performance when the ebook files are located on a networked share.
|
||||||
|
|
||||||
|
|
||||||
|
This calibre-portable.bat file is intended for use on Windows based systems, but the principles are easily adapted for use on Linux or OS X based systems. Note that calibre requires the Microsoft Visual C++ 2008 runtimes to run. Most windows computers have them installed already, but it may be a good idea to have the installer for installing them on your USB stick. The installer is available from `Microsoft <http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en>`_.
|
||||||
|
|
||||||
|
Assumptions
|
||||||
|
------------
|
||||||
|
|
||||||
|
The calibre-portable.bat file makes the following assumptions about the folder layout that is being used::
|
||||||
|
|
||||||
|
Calibre_Root_Folder
|
||||||
|
calibre-portable.bat The batch file used to start Calibre
|
||||||
|
Calibre2 The Calibre binaries
|
||||||
|
CalibreLibrary The Calibre Library
|
||||||
|
CalibreConfig The Calibre user preferences
|
||||||
|
CalibreSource The calibre source (optional) if running a development environment.
|
||||||
|
|
||||||
|
If you want to use a different folder layout then the calibre-portable.bat file will need editing appropriately. This file can be edited using any appropriate text editor.
|
||||||
|
|
||||||
|
Preparation
|
||||||
|
------------
|
||||||
|
|
||||||
|
The steps required to prepare the USB stick are as follows:
|
||||||
|
|
||||||
|
* Decide what folder will be used to hold all the Calibre related files. If the portable media is to be dedicated to Calibre use then this can be the root folder, but if not is suggested that a folder called Calibre should be created – this will then be the Calibre_Root_Folder mentioned above and in the following steps.
|
||||||
|
* Copy the calibre-portable.bat file into the Calibre_Root_Folder.
|
||||||
|
* Create the Calibre2 folder inside the Calibre_Root_Folder to hold the Calibre binaries. There are 2 ways of populating the contents of this folder:
|
||||||
|
|
||||||
|
* The easiest is to simply copy an existing Calibre installation. Typically this would involve copying the contents of the C:\Program Files\Calibre2 folder
|
||||||
|
* Run the Calibre Windows installer:
|
||||||
|
|
||||||
|
* Tick the box to accept the GNU GPL license
|
||||||
|
* Select the Advanced option
|
||||||
|
* Change the install location to be the Calibre2 folder on the USB drive
|
||||||
|
* Deselect the options for creating Menu shortcuts; creating a calibre shortcut on the desktop; and adding Calibre to the path
|
||||||
|
|
||||||
|
* Create the CalibreLibrary folder inside the Calibre_Root_Folder. If you have an existing Calibre library copy it and all its contents to the CalibreLibrary folder. If you do not already have a library do not worry as a new one will be created at this location when Calibre is started.
|
||||||
|
* Create the CalibreConfig folder inside the Calibre_Root_Folder. This will hold your personal Calibre configuration settings. If you have an existing Calibre installation and want to copy the current settings then copy the contents of your current configuration folder to the CalibreConfig folder. You can find the location of your current configuration folder by going to Preferences->Advanced and clicking the “Open calibre configuration Directory” button.
|
||||||
|
* When you have started Calibre, go into Preferences->General and check that you have set the Job Priority to ‘Low’. This setting keeps single-processor Windows systems responsive without affecting Calibre performance to any noticeable degree. On multi-processor or multi-core systems this setting does not matter as much, but setting it will do no harm.
|
||||||
|
|
||||||
|
Using calibre-portable.bat
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Once you have got the USB stick set up then the steps to use Calibre are:
|
||||||
|
|
||||||
|
* Plug the USB stick into the host machine
|
||||||
|
* Use Windows Explorer to navigate to the location of the calibre-portable.bat file on the USB stick
|
||||||
|
* Start Calibre by double-clicking the calibre-portable.bat file
|
||||||
|
* A Command Window will be opened showing the settings that are about to be used. If you are not happy with these setting use CTRL-C to abandon the batch file without starting Calibre. If you are happy then press any other key to launch Calibre with the specified settings. Once you are happy with your setup you may wish to edit the calibre-portable.bat file to eliminate this pause (add REM to the start of the line) but it a useful check that you are running with the expected settings.
|
||||||
|
|
||||||
|
Networked Installations
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
The performance of Calibre can be severely degraded if running with the Calibre library on a network share. This is primarily due to the fact that the access to the metadata.db file is slow across a network. The calibre-portable.bat file is designed to help in such scenarios. To use the calibre-portable.bat file in such a scenario the following deviations from those detailed above for the Mobile Calibre installation are needed:
|
||||||
|
|
||||||
|
* Edit the calibre-portable.bat file to specify the location of your Calibre library on the network.
|
||||||
|
* Create a CalibreMetadata folder in the Calibre_Root_Folder location. If you have an existing Calibre library then copy the metadata.db files from there to the CalibreMetadata folder.
|
||||||
|
* You can now run Calibre using the calibre-portable.bat file as specified in the previous section. One thing you should remember is to periodically copy the metadata.db file from the CalibreMetadatqa folder back to your Calibre library located on the network share.
|
||||||
|
|
||||||
|
Precautions
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Portable media can occasionally fail so you should make periodic backups of you Calibre library. This can be done by making a copy of the CalibreLibrary folder and all its contents. There are many freely available tools around that can optimise such back processes, well known ones being RoboCopy and RichCopy. However you can simply use a Windows copy facility if you cannot be bothered to use a specialised tools.
|
@ -5,18 +5,36 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
|||||||
Provides platform independent temporary files that persist even after
|
Provides platform independent temporary files that persist even after
|
||||||
being closed.
|
being closed.
|
||||||
"""
|
"""
|
||||||
import tempfile, os, atexit, shutil
|
import tempfile, os, atexit
|
||||||
|
|
||||||
from calibre import __version__, __appname__
|
from calibre import __version__, __appname__
|
||||||
|
|
||||||
def cleanup(path):
|
def cleanup(path):
|
||||||
try:
|
try:
|
||||||
import os
|
import os as oss
|
||||||
if os.path.exists(path):
|
if oss.path.exists(path):
|
||||||
os.remove(path)
|
oss.remove(path)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
_base_dir = None
|
||||||
|
|
||||||
|
def remove_dir(x):
|
||||||
|
try:
|
||||||
|
import shutil
|
||||||
|
shutil.rmtree(x, ignore_errors=True)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def base_dir():
|
||||||
|
global _base_dir
|
||||||
|
if _base_dir is None:
|
||||||
|
_base_dir = tempfile.mkdtemp(prefix='%s_%s_tmp_'%(__appname__,
|
||||||
|
__version__))
|
||||||
|
atexit.register(remove_dir, _base_dir)
|
||||||
|
return _base_dir
|
||||||
|
|
||||||
class PersistentTemporaryFile(object):
|
class PersistentTemporaryFile(object):
|
||||||
"""
|
"""
|
||||||
A file-like object that is a temporary file that is available even after being closed on
|
A file-like object that is a temporary file that is available even after being closed on
|
||||||
@ -27,6 +45,8 @@ class PersistentTemporaryFile(object):
|
|||||||
def __init__(self, suffix="", prefix="", dir=None, mode='w+b'):
|
def __init__(self, suffix="", prefix="", dir=None, mode='w+b'):
|
||||||
if prefix == None:
|
if prefix == None:
|
||||||
prefix = ""
|
prefix = ""
|
||||||
|
if dir is None:
|
||||||
|
dir = base_dir()
|
||||||
fd, name = tempfile.mkstemp(suffix, __appname__+"_"+ __version__+"_" + prefix,
|
fd, name = tempfile.mkstemp(suffix, __appname__+"_"+ __version__+"_" + prefix,
|
||||||
dir=dir)
|
dir=dir)
|
||||||
self._file = os.fdopen(fd, mode)
|
self._file = os.fdopen(fd, mode)
|
||||||
@ -56,8 +76,10 @@ def PersistentTemporaryDirectory(suffix='', prefix='', dir=None):
|
|||||||
Return the path to a newly created temporary directory that will
|
Return the path to a newly created temporary directory that will
|
||||||
be automatically deleted on application exit.
|
be automatically deleted on application exit.
|
||||||
'''
|
'''
|
||||||
|
if dir is None:
|
||||||
|
dir = base_dir()
|
||||||
tdir = tempfile.mkdtemp(suffix, __appname__+"_"+ __version__+"_" +prefix, dir)
|
tdir = tempfile.mkdtemp(suffix, __appname__+"_"+ __version__+"_" +prefix, dir)
|
||||||
atexit.register(shutil.rmtree, tdir, True)
|
atexit.register(remove_dir, tdir)
|
||||||
return tdir
|
return tdir
|
||||||
|
|
||||||
class TemporaryDirectory(object):
|
class TemporaryDirectory(object):
|
||||||
@ -67,6 +89,8 @@ class TemporaryDirectory(object):
|
|||||||
def __init__(self, suffix='', prefix='', dir=None, keep=False):
|
def __init__(self, suffix='', prefix='', dir=None, keep=False):
|
||||||
self.suffix = suffix
|
self.suffix = suffix
|
||||||
self.prefix = prefix
|
self.prefix = prefix
|
||||||
|
if dir is None:
|
||||||
|
dir = base_dir()
|
||||||
self.dir = dir
|
self.dir = dir
|
||||||
self.keep = keep
|
self.keep = keep
|
||||||
|
|
||||||
@ -76,7 +100,7 @@ class TemporaryDirectory(object):
|
|||||||
|
|
||||||
def __exit__(self, *args):
|
def __exit__(self, *args):
|
||||||
if not self.keep and os.path.exists(self.tdir):
|
if not self.keep and os.path.exists(self.tdir):
|
||||||
shutil.rmtree(self.tdir, ignore_errors=True)
|
remove_dir(self.tdir)
|
||||||
|
|
||||||
class TemporaryFile(object):
|
class TemporaryFile(object):
|
||||||
|
|
||||||
@ -85,6 +109,8 @@ class TemporaryFile(object):
|
|||||||
prefix = ''
|
prefix = ''
|
||||||
if suffix is None:
|
if suffix is None:
|
||||||
suffix = ''
|
suffix = ''
|
||||||
|
if dir is None:
|
||||||
|
dir = base_dir()
|
||||||
self.prefix, self.suffix, self.dir, self.mode = prefix, suffix, dir, mode
|
self.prefix, self.suffix, self.dir, self.mode = prefix, suffix, dir, mode
|
||||||
self._file = None
|
self._file = None
|
||||||
|
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:17+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:43+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Arabic <ar@li.org>\n"
|
"Language-Team: Arabic <ar@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-22 03:43+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:53+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
|
||||||
|
@ -11,13 +11,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: ca\n"
|
"Project-Id-Version: ca\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:02+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:36+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \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-22 03:43+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:54+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
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 21:37+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:05+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Czech <cs@li.org>\n"
|
"Language-Team: Czech <cs@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-21 03:49+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:54+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
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-21 08:43+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:19+0000\n"
|
||||||
"Last-Translator: Glenn <Unknown>\n"
|
"Last-Translator: Kovid Goyal <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-22 03:44+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:54+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
|
||||||
@ -413,7 +413,7 @@ msgstr "Opsætning af filtype udvidelsesmoduler"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35
|
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:35
|
||||||
msgid "Local plugin customization"
|
msgid "Local plugin customization"
|
||||||
msgstr "Tilpasning af lokal udvidelsesmodul"
|
msgstr "Tilpasning af lokalt udvidelsesmodul"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36
|
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:36
|
||||||
msgid "Disabled plugins"
|
msgid "Disabled plugins"
|
||||||
@ -461,7 +461,7 @@ msgid ""
|
|||||||
"Customize plugin. Specify name of plugin and customization string separated "
|
"Customize plugin. Specify name of plugin and customization string separated "
|
||||||
"by a comma."
|
"by a comma."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Brugertilpas udvidelsesmodul. Angiv udvidelsesmodulnavn og "
|
"Brugertilpasset udvidelsesmodul. Angiv udvidelsesmodulnavn og "
|
||||||
"tilpasningstekststrenge adskilt af kommaer."
|
"tilpasningstekststrenge adskilt af kommaer."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534
|
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534
|
||||||
@ -4369,7 +4369,7 @@ msgstr "ignorér"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:89
|
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:89
|
||||||
msgid "backslashreplace"
|
msgid "backslashreplace"
|
||||||
msgstr ""
|
msgstr "erstat omvendt skråstreg (\"\\\")"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:90
|
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:90
|
||||||
msgid "BibTeX entry type:"
|
msgid "BibTeX entry type:"
|
||||||
@ -7007,7 +7007,7 @@ msgstr "Kontekstmenuen til bøgerne i enheden"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94
|
||||||
msgid "Customize the actions in:"
|
msgid "Customize the actions in:"
|
||||||
msgstr ""
|
msgstr "Tilpas aktionerne i:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95
|
||||||
msgid "A&vailable actions"
|
msgid "A&vailable actions"
|
||||||
@ -10710,6 +10710,16 @@ msgid ""
|
|||||||
" replaced.\n"
|
" replaced.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
" %prog saved_searches [options] list\n"
|
||||||
|
" %prog saved_searches add name search\n"
|
||||||
|
" %prog saved_searches remove name\n"
|
||||||
|
"\n"
|
||||||
|
" Administrér de gemte søgninger gemt i denne database.\n"
|
||||||
|
" Hvis du prøver at tilføje en søgning med et navn som allerede "
|
||||||
|
"eksisterer,\n"
|
||||||
|
" vil den blive overskrevet.\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
|
||||||
msgid "Error: You must specify an action (add|remove|list)"
|
msgid "Error: You must specify an action (add|remove|list)"
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: de\n"
|
"Project-Id-Version: de\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 21:46+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:22+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
|
"Language-Team: American English <kde-i18n-doc@lists.kde.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-21 03:50+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:55+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"Generated-By: pygettext.py 1.5\n"
|
"Generated-By: pygettext.py 1.5\n"
|
||||||
|
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:07+0000\n"
|
"PO-Revision-Date: 2010-08-25 02:45+0000\n"
|
||||||
"Last-Translator: Eleftherios Kosmas <elkosmas@gmail.com>\n"
|
"Last-Translator: Harry Mavroforakis <Unknown>\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-22 03:44+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-26 03:52+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
|
||||||
@ -607,7 +607,7 @@ msgstr "Επικοινωνία με το Sigmatek eBook reader."
|
|||||||
#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16
|
#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:30
|
#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:30
|
||||||
msgid "Use an arbitrary folder as a device."
|
msgid "Use an arbitrary folder as a device."
|
||||||
msgstr ""
|
msgstr "Επιλογή τυχαίου φακέλου ως συσκευή"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:26
|
#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:26
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/interface.py:14
|
#: /home/kovid/work/calibre/src/calibre/devices/interface.py:14
|
||||||
@ -757,7 +757,7 @@ msgstr "Επικοινωνία με το Sweex MM300"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
|
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
|
||||||
msgid "Communicate with the Kogan"
|
msgid "Communicate with the Kogan"
|
||||||
msgstr ""
|
msgstr "Επικοινωνία με το Kogan"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
|
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
|
||||||
msgid "Communicate with the Pandigital Novel"
|
msgid "Communicate with the Pandigital Novel"
|
||||||
@ -1502,19 +1502,20 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:367
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:367
|
||||||
msgid "Use a regular expression to try and remove the header."
|
msgid "Use a regular expression to try and remove the header."
|
||||||
msgstr ""
|
msgstr "Χρήση τυπικής εκφράσης για να αφαιρεθεί η κεφαλίδα."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:374
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:374
|
||||||
msgid "The regular expression to use to remove the header."
|
msgid "The regular expression to use to remove the header."
|
||||||
msgstr ""
|
msgstr "Η τυπική έκφραση που θα χρησιμοποιηθεί για να αφαιρεθεί η κεφαλίδα."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380
|
||||||
msgid "Use a regular expression to try and remove the footer."
|
msgid "Use a regular expression to try and remove the footer."
|
||||||
msgstr ""
|
msgstr "Χρήση τυπικής έκφρασης για να αφαιρεθεί το υποσέλιδο."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:387
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:387
|
||||||
msgid "The regular expression to use to remove the footer."
|
msgid "The regular expression to use to remove the footer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Η τυπική έκφραση που θα χρησιμοποιηθεί για να αφαιρεθεί το υποσέλιδο."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:394
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:394
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -1545,7 +1546,7 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38
|
||||||
msgid "Set the title."
|
msgid "Set the title."
|
||||||
msgstr ""
|
msgstr "Εισαγωγή τίτλου."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:432
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:432
|
||||||
msgid "Set the authors. Multiple authors should be separated by ampersands."
|
msgid "Set the authors. Multiple authors should be separated by ampersands."
|
||||||
@ -1558,6 +1559,8 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:441
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:441
|
||||||
msgid "String to be used when sorting by author. "
|
msgid "String to be used when sorting by author. "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Η συμβολοσειρά που θα χρησιμοποιηθεί κατά την ταξινόμηση κατά όνομα "
|
||||||
|
"συγγραφέα. "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:445
|
||||||
msgid "Set the cover to the specified file or URL"
|
msgid "Set the cover to the specified file or URL"
|
||||||
@ -1571,7 +1574,7 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56
|
||||||
msgid "Set the ebook publisher."
|
msgid "Set the ebook publisher."
|
||||||
msgstr ""
|
msgstr "Εισαγωγή εκδότη του ηλεκτρονικού βιβλίου."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:457
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:457
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60
|
||||||
@ -1586,12 +1589,12 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:465
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:465
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64
|
||||||
msgid "Set the rating. Should be a number between 1 and 5."
|
msgid "Set the rating. Should be a number between 1 and 5."
|
||||||
msgstr ""
|
msgstr "Καταχώρηση βαθμολογίας. Επιλέξτε ένα νούμερο από 1 έως και 5."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:469
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:469
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66
|
||||||
msgid "Set the ISBN of the book."
|
msgid "Set the ISBN of the book."
|
||||||
msgstr ""
|
msgstr "Εισαγωγή του κωδικού ISBN του βιβλίου"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:473
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:473
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:68
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:68
|
||||||
@ -1610,7 +1613,7 @@ msgstr "Ρυθμίστε την γλώσσα."
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:485
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:485
|
||||||
msgid "Set the publication date."
|
msgid "Set the publication date."
|
||||||
msgstr ""
|
msgstr "Εισαγωγή της ημερομηνίας έκδοσης."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:489
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:489
|
||||||
msgid "Set the book timestamp (used by the date column in calibre)."
|
msgid "Set the book timestamp (used by the date column in calibre)."
|
||||||
@ -1618,7 +1621,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:589
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:589
|
||||||
msgid "Could not find an ebook inside the archive"
|
msgid "Could not find an ebook inside the archive"
|
||||||
msgstr ""
|
msgstr "Δε βρέθηκε ηλεκτρονικό βιβλίο στο αρχείο."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:647
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:647
|
||||||
msgid "Values of series index and rating must be numbers. Ignoring"
|
msgid "Values of series index and rating must be numbers. Ignoring"
|
||||||
@ -1626,7 +1629,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:654
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:654
|
||||||
msgid "Failed to parse date/time"
|
msgid "Failed to parse date/time"
|
||||||
msgstr ""
|
msgstr "Αποτυχία ανάγνωσης ημερομηνίας/ώρας"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:809
|
||||||
msgid "Converting input to HTML..."
|
msgid "Converting input to HTML..."
|
||||||
@ -1642,7 +1645,7 @@ msgstr "Δημιουργία"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
|
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
|
||||||
msgid "Failed to parse: %s with error: %s"
|
msgid "Failed to parse: %s with error: %s"
|
||||||
msgstr ""
|
msgstr "Αποτυχία ανάγνωσης: %s με σφάλμα: %s"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
|
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
|
||||||
msgid "ePub Fixer"
|
msgid "ePub Fixer"
|
||||||
@ -1673,7 +1676,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:52
|
#: /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 "Πρέπει να προσδιορίσετε ένα αρχείο epub"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:17
|
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:17
|
||||||
msgid "Fix unmanifested files"
|
msgid "Fix unmanifested files"
|
||||||
|
@ -11,13 +11,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: es\n"
|
"Project-Id-Version: es\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-21 19:06+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:09+0000\n"
|
||||||
"Last-Translator: kassanmoor <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Spanish\n"
|
"Language-Team: Spanish\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-22 03:46+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:56+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467
|
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -7,13 +7,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre 0.4.22\n"
|
"Project-Id-Version: calibre 0.4.22\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 21:55+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:32+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: fr\n"
|
"Language-Team: fr\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-22 03:44+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:54+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"X-Poedit-Bookmarks: 1177,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
|
"X-Poedit-Bookmarks: 1177,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
|
||||||
"Generated-By: pygettext.py 1.5\n"
|
"Generated-By: pygettext.py 1.5\n"
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:29+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:14+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <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-22 03:44+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:55+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
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 21:17+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:01+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Hebrew <he@li.org>\n"
|
"Language-Team: Hebrew <he@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-21 03:50+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:55+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
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 16:31+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:48+0000\n"
|
||||||
"Last-Translator: Sujit Jadhav <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Hindi <hi@li.org>\n"
|
"Language-Team: Hindi <hi@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-21 03:50+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:55+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
|
||||||
|
@ -9,13 +9,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre_calibre-it\n"
|
"Project-Id-Version: calibre_calibre-it\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-21 14:12+0000\n"
|
"PO-Revision-Date: 2010-08-23 13:25+0000\n"
|
||||||
"Last-Translator: MeltingShell <Unknown>\n"
|
"Last-Translator: MeltingShell <Unknown>\n"
|
||||||
"Language-Team: italiano\n"
|
"Language-Team: italiano\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-22 03:45+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-24 03:35+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n"
|
"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n"
|
||||||
"Generated-By: pygettext.py 1.5\n"
|
"Generated-By: pygettext.py 1.5\n"
|
||||||
@ -3457,7 +3457,7 @@ msgstr "Selezionare la biblioteca calibre con cui lavorare"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81
|
||||||
msgid "Switch to library..."
|
msgid "Switch to library..."
|
||||||
msgstr "Cambia alla biblioteca..."
|
msgstr "Cambia biblioteca..."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:88
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:88
|
||||||
msgid "Quick switch"
|
msgid "Quick switch"
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:13+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:40+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Latvian <ivars_a@inbox.lv>\n"
|
"Language-Team: Latvian <ivars_a@inbox.lv>\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-22 03:45+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:55+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"X-Poedit-Country: LATVIA\n"
|
"X-Poedit-Country: LATVIA\n"
|
||||||
"X-Poedit-Language: Latvian\n"
|
"X-Poedit-Language: Latvian\n"
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 19:56+0000\n"
|
"PO-Revision-Date: 2010-08-24 19:55+0000\n"
|
||||||
"Last-Translator: Sujit R Jadhav <Unknown>\n"
|
"Last-Translator: Sujit Jadhav <Unknown>\n"
|
||||||
"Language-Team: Marathi <mr@li.org>\n"
|
"Language-Team: Marathi <mr@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-21 03:51+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-25 03:50+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
|
||||||
|
@ -8,14 +8,16 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 21:58+0000\n"
|
"PO-Revision-Date: 2010-08-25 08:21+0000\n"
|
||||||
"Last-Translator: Linda Polman <linda.polman@gmail.com>\n"
|
"Last-Translator: Dingoe <Unknown>\n"
|
||||||
"Language-Team: Dutch <nl@li.org>\n"
|
"Language-Team: Dutch <nl@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-22 03:44+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-26 03:52+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
"X-Poedit-Country: NETHERLANDS\n"
|
||||||
|
"X-Poedit-Language: Dutch\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365
|
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365
|
||||||
msgid "Set metadata from %s files"
|
msgid "Set metadata from %s files"
|
||||||
@ -502,7 +504,7 @@ msgstr "Apple apparaat gevonden, iTunes wordt gestart, even geduld…"
|
|||||||
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246
|
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249
|
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249
|
||||||
msgid "Updating device metadata listing..."
|
msgid "Updating device metadata listing..."
|
||||||
msgstr "Bijwerken van metagegevens lijst op het apparaat…"
|
msgstr "Bijwerken van metagegevens opsomming op het apparaat…"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323
|
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:323
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362
|
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362
|
||||||
@ -525,7 +527,7 @@ msgstr "Gebruik Series als categorie in iTunes / iBooks"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:546
|
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:546
|
||||||
msgid "Cache covers from iTunes/iBooks"
|
msgid "Cache covers from iTunes/iBooks"
|
||||||
msgstr "Cache covers van iTunes / iBooks"
|
msgstr "Cache omslagen van iTunes / iBooks"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:558
|
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:558
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -659,7 +661,7 @@ msgstr "Communicatie met Elonex EB511 ebook reader"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:16
|
#: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:16
|
||||||
msgid "Communicate with the IRex Iliad eBook reader."
|
msgid "Communicate with the IRex Iliad eBook reader."
|
||||||
msgstr "Communiceer met de IRex Illiad e-boek lezer."
|
msgstr "Communiceer met de IRex Iliad e-boek lezer."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17
|
#: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18
|
#: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18
|
||||||
@ -765,7 +767,7 @@ msgstr "Communiceer met de Sweex MM300"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
|
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
|
||||||
msgid "Communicate with the Kogan"
|
msgid "Communicate with the Kogan"
|
||||||
msgstr ""
|
msgstr "Communiceer met de Kogan"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
|
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
|
||||||
msgid "Communicate with the Pandigital Novel"
|
msgid "Communicate with the Pandigital Novel"
|
||||||
@ -905,7 +907,7 @@ msgstr "Gebruik de sortering op auteur instelling i.p.v. de auteur"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:47
|
#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:47
|
||||||
msgid "Template to control how books are saved"
|
msgid "Template to control how books are saved"
|
||||||
msgstr "Sjabloon dat bepaald hoe boeken worden opgeslagen"
|
msgstr "Sjabloon dat bepaalt hoe boeken worden opgeslagen"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50
|
#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:50
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84
|
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:84
|
||||||
@ -1109,7 +1111,7 @@ msgid ""
|
|||||||
"experiment to see which format gives you optimal size and look on your "
|
"experiment to see which format gives you optimal size and look on your "
|
||||||
"device."
|
"device."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Het formaat dat de afbeeldingen in het gemaakte eboek naartoe worden "
|
"Het formaat waarnaar afbeeldingen in het gemaakte eboek worden "
|
||||||
"geconverteerd. U kunt experimenteren om te zien welk formaat de optimale "
|
"geconverteerd. U kunt experimenteren om te zien welk formaat de optimale "
|
||||||
"grootte en visuele resultaten op uw apparaat genereren."
|
"grootte en visuele resultaten op uw apparaat genereren."
|
||||||
|
|
||||||
@ -1639,7 +1641,7 @@ msgstr "Geef de uitgever op."
|
|||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:457
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:457
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60
|
||||||
msgid "Set the series this ebook belongs to."
|
msgid "Set the series this ebook belongs to."
|
||||||
msgstr "Geef de serie op waar dit eboek tot behoord."
|
msgstr "Geef de serie op waar dit eboek toe behoort."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:461
|
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:461
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62
|
||||||
@ -1707,7 +1709,7 @@ msgstr "Aanmaken"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
|
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
|
||||||
msgid "Failed to parse: %s with error: %s"
|
msgid "Failed to parse: %s with error: %s"
|
||||||
msgstr ""
|
msgstr "Bewerking mislukt: %s met fout: %s"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
|
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
|
||||||
msgid "ePub Fixer"
|
msgid "ePub Fixer"
|
||||||
@ -1744,9 +1746,10 @@ msgstr ""
|
|||||||
"%prog [options] file.epu\n"
|
"%prog [options] file.epu\n"
|
||||||
"Hersteld eenvoudige problemen in EPUB bestanden die ervoor kunnen zorgen dat "
|
"Hersteld eenvoudige problemen in EPUB bestanden die ervoor kunnen zorgen dat "
|
||||||
"ze geweigerd worden door slecht ontworpen publicatie diensten.\n"
|
"ze geweigerd worden door slecht ontworpen publicatie diensten.\n"
|
||||||
"De standaard instelling is dat er geen herstellingen gebeuren en dat er "
|
"\n"
|
||||||
"foutmeldingen worden weergegeven voor iedere gevonden fout. Gebruik de "
|
"Standaard worden geen herstellingen gemaakt en foutmeldingen worden "
|
||||||
"opties om in te stellen welke fouten automatisch hersteld worden."
|
"weergegeven voor iedere gevonden fout. Gebruik de opties om in te "
|
||||||
|
"controleren welke fouten automatisch hersteld worden."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:52
|
#: /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"
|
||||||
@ -1789,10 +1792,10 @@ msgid ""
|
|||||||
"turn off splitting on page breaks."
|
"turn off splitting on page breaks."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Deactiveer het splitsen op pagina eind. Normaal gesproken invoer bestanden "
|
"Deactiveer het splitsen op pagina eind. Normaal gesproken invoer bestanden "
|
||||||
"worden automaitsch opgesplitst in twee bestanden bij iedere pagina einde. "
|
"worden automatisch opgesplitst in twee bestanden bij iedere pagina einde. "
|
||||||
"Dit resulteert in een eboek bestand dat sneller verwerkt kan worden met "
|
"Dit resulteert in een eboek bestand dat sneller verwerkt kan worden met "
|
||||||
"minder werk voor het systeem. Echter, het splitsen zelf is langzaam, en als "
|
"minder werk voor het systeem. Echter, het splitsen zelf is langzaam, en als "
|
||||||
"je bron bestand een groot aantal paginas bevat dan kun je deze splitsing "
|
"je bronbestand een groot aantal pagina's bevat dan kun je deze splitsing "
|
||||||
"uitschakelen."
|
"uitschakelen."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:73
|
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:73
|
||||||
@ -2358,7 +2361,7 @@ msgstr "Boek omslag download"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:79
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:79
|
||||||
msgid "Download covers from openlibrary.org"
|
msgid "Download covers from openlibrary.org"
|
||||||
msgstr "Download covers van openlibrary.org"
|
msgstr "Download omslagen van openlibrary.org"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:107
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:107
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136
|
||||||
@ -2367,7 +2370,7 @@ msgstr "ISBN: %s niet gevonden"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:117
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:117
|
||||||
msgid "Download covers from librarything.com"
|
msgid "Download covers from librarything.com"
|
||||||
msgstr "Download covers van librarything.com"
|
msgstr "Download omslagen van librarything.com"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:128
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:128
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68
|
||||||
@ -2731,7 +2734,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"[opties] bestand.pdf\n"
|
"[opties] bestand.pdf\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Knip een PDF bestand.\n"
|
"Een PDF bestand inkorten.\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:38
|
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:38
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:32
|
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:32
|
||||||
@ -2793,7 +2796,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"[opties] bestand.pdf wachtwoord\n"
|
"[opties] bestand.pdf wachtwoord\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Ontsleutel een PDF.\n"
|
"Decodeer een PDF.\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:60
|
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/decrypt.py:60
|
||||||
msgid "Decrypt Options:"
|
msgid "Decrypt Options:"
|
||||||
@ -2861,7 +2864,7 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"Metagegevens van het eerste PDF bestand zullen worden gebruikt.\n"
|
"Metagegevens van het eerste PDF bestand zullen worden gebruikt.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Combineer individuele PDFs.\n"
|
"Samenvoegen individuele PDFs.\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/merge.py:56
|
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/merge.py:56
|
||||||
msgid "Merge Options:"
|
msgid "Merge Options:"
|
||||||
@ -2889,7 +2892,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"bestand.pdf graden\n"
|
"bestand.pdf graden\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Roteer paginas van een PDF met de klok mee.\n"
|
"Roteer pagina's van een PDF met de klok mee.\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:53
|
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/rotate.py:53
|
||||||
msgid "Rotate Options:"
|
msgid "Rotate Options:"
|
||||||
@ -3090,7 +3093,7 @@ msgstr "Sorteer de lijst met labels op naam, populariteit of waardering"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45
|
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45
|
||||||
msgid "Number of covers to show in the cover browsing mode"
|
msgid "Number of covers to show in the cover browsing mode"
|
||||||
msgstr "Aantal boek covers te laten zien in cover browsing modus"
|
msgstr "Aantal weer te geven boekomslagen in omslag blader modus"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47
|
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47
|
||||||
msgid "Defaults for conversion to LRF"
|
msgid "Defaults for conversion to LRF"
|
||||||
@ -3106,7 +3109,7 @@ msgstr "Formaten die worden bekeken met de interne viewer"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:54
|
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:54
|
||||||
msgid "Columns to be displayed in the book list"
|
msgid "Columns to be displayed in the book list"
|
||||||
msgstr "Kolommen zichtbaar in de boeken lijst"
|
msgstr "Weer te geven kolommen in de boekenlijst"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:55
|
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:55
|
||||||
msgid "Automatically launch content server on application startup"
|
msgid "Automatically launch content server on application startup"
|
||||||
@ -3473,10 +3476,12 @@ msgstr "Niet toegestaan"
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:179
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:179
|
||||||
msgid "You cannot change libraries when a device is connected."
|
msgid "You cannot change libraries when a device is connected."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Je kunt niet van bibliotheek wisselen wanneer het apparaat is aangesloten"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184
|
||||||
msgid "You cannot change libraries while jobs are running."
|
msgid "You cannot change libraries while jobs are running."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Je kunt niet van bibliotheek wisselen wanneer taken worden uitgevoerd"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:22
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:22
|
||||||
msgid "C"
|
msgid "C"
|
||||||
@ -3504,32 +3509,32 @@ msgstr "Start conversie van %d boek(en)"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63
|
||||||
msgid "Copy to library"
|
msgid "Copy to library"
|
||||||
msgstr ""
|
msgstr "Kopieer naar bibliotheek"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64
|
||||||
msgid "Copy selected books to the specified library"
|
msgid "Copy selected books to the specified library"
|
||||||
msgstr ""
|
msgstr "Kopieer geselecteerde boeken naar de aangegeven bibliotheek"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97
|
||||||
msgid "Cannot copy"
|
msgid "Cannot copy"
|
||||||
msgstr ""
|
msgstr "Kan niet kopieren"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102
|
||||||
msgid "No library"
|
msgid "No library"
|
||||||
msgstr ""
|
msgstr "Geen bibliotheek"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103
|
||||||
msgid "No library found at %s"
|
msgid "No library found at %s"
|
||||||
msgstr ""
|
msgstr "Geen bibliotheek gevonden op %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:106
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110
|
||||||
msgid "Copying"
|
msgid "Copying"
|
||||||
msgstr ""
|
msgstr "Bezig met kopiëren van"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
|
||||||
msgid "Could not copy books: "
|
msgid "Could not copy books: "
|
||||||
msgstr ""
|
msgstr "Kan boeken niet kopieren: "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
|
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
|
||||||
@ -3539,7 +3544,7 @@ msgstr "Mislukt"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123
|
||||||
msgid "Copied %d books to %s"
|
msgid "Copied %d books to %s"
|
||||||
msgstr ""
|
msgstr "%d boeken gekopieerd naar %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"
|
||||||
@ -4514,6 +4519,11 @@ msgid ""
|
|||||||
"- A regex pattern of a single dot excludes all genre tags, generating no "
|
"- A regex pattern of a single dot excludes all genre tags, generating no "
|
||||||
"Genre Section"
|
"Genre Section"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Regex tips:\n"
|
||||||
|
"- De standaard regex - \\[.+\\] - sluit genre tags uit van met de het "
|
||||||
|
"formaat [tag], b.v., [Amazon Freebie]\n"
|
||||||
|
"- Een regex met één . sluit alle genre tags uit, en genereert geen Genre "
|
||||||
|
"Sectie"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76
|
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:76
|
||||||
msgid "Include 'Titles' Section"
|
msgid "Include 'Titles' Section"
|
||||||
@ -4954,7 +4964,7 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165
|
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:165
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:112
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:112
|
||||||
msgid "Choose cover for "
|
msgid "Choose cover for "
|
||||||
msgstr "Kies cover voor "
|
msgstr "Kies omslag voor "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172
|
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:172
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:119
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:119
|
||||||
@ -5620,7 +5630,7 @@ msgstr "Download boeken van apparaat"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:385
|
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:385
|
||||||
msgid "View book on device"
|
msgid "View book on device"
|
||||||
msgstr "Bekijk book op apparaat"
|
msgstr "Bekijk boek op apparaat"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419
|
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:419
|
||||||
msgid "Set default send to device action"
|
msgid "Set default send to device action"
|
||||||
@ -5748,7 +5758,7 @@ msgstr ""
|
|||||||
msgid ""
|
msgid ""
|
||||||
"Could not email the following books as no suitable formats were found:"
|
"Could not email the following books as no suitable formats were found:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"De voilgende boeken konden niet worden ge-emailed omdat geen beschikbare "
|
"De volgende boeken konden niet worden ge-emailed omdat geen beschikbare "
|
||||||
"formaten zijn gevonden:"
|
"formaten zijn gevonden:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951
|
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:951
|
||||||
@ -5852,7 +5862,7 @@ msgstr "&Plak van klembord"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68
|
||||||
msgid "Fit &cover within view"
|
msgid "Fit &cover within view"
|
||||||
msgstr ""
|
msgstr "Pas de &omslag in het overzicht"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69
|
||||||
msgid "&Previous"
|
msgid "&Previous"
|
||||||
@ -6062,8 +6072,8 @@ msgid ""
|
|||||||
"If checked, downloaded news will be automatically mailed <br>to this email "
|
"If checked, downloaded news will be automatically mailed <br>to this email "
|
||||||
"address (provided it is in one of the listed formats)."
|
"address (provided it is in one of the listed formats)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Indien gekozen, gedownload nieuws zal automatisch worden geemailed<br>\r\n"
|
"Indien aangevinkt zal gedownload nieuws automatisch worden verstuurd<br> "
|
||||||
"naar dit adres (indien het in een van de ondersteunde formaten is)."
|
"naar dit e-mailadres (indien het in een van de vermelde formaten is)."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:308
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:308
|
||||||
msgid "new email address"
|
msgid "new email address"
|
||||||
@ -6560,7 +6570,7 @@ msgstr "Gebruikers Interface &layout (heeft een herstart nodig):"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640
|
||||||
msgid "Restriction to apply when the current library is opened:"
|
msgid "Restriction to apply when the current library is opened:"
|
||||||
msgstr ""
|
msgstr "aan te brengen beperkingen de huidige bibliotheek wordt geopend:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -6568,6 +6578,9 @@ msgid ""
|
|||||||
"used. Also applied when switching to this library. Note that this setting is "
|
"used. Also applied when switching to this library. Note that this setting is "
|
||||||
"per library. "
|
"per library. "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Pas deze beperking to bij opstarten van calibre als de huidige bibliotheek "
|
||||||
|
"in gebruik is. Ook gebruikt als naar deze bibliotheek wordt overgeschakeld. "
|
||||||
|
"NB. Deze instelling is per bibliotheek. "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642
|
||||||
msgid "Disable all animations. Useful if you have a slow/old computer."
|
msgid "Disable all animations. Useful if you have a slow/old computer."
|
||||||
@ -6738,7 +6751,7 @@ msgstr "Max. OPDS &ongegroepeerde items:"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675
|
||||||
msgid "Restriction (saved search) to apply:"
|
msgid "Restriction (saved search) to apply:"
|
||||||
msgstr ""
|
msgstr "Beperking (opgeslagen zoekactie) toe te passen:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -6746,6 +6759,10 @@ msgid ""
|
|||||||
"content server makes available to those matching the search. This setting is "
|
"content server makes available to those matching the search. This setting is "
|
||||||
"per library (i.e. you can have a different restriction per library)."
|
"per library (i.e. you can have a different restriction per library)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Deze beperking (gebaseerd op een opgeslagen zoekactie) zal de door de "
|
||||||
|
"inhoudsserver beschikbare boeken berperken tot die welke overenkoemen met de "
|
||||||
|
"zoekactie. De instelling is per bibliotheek (dat betekent dat men per "
|
||||||
|
"bibliotheek een verschillende beperking kan instellen)."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677
|
||||||
msgid "&Start Server"
|
msgid "&Start Server"
|
||||||
@ -7052,47 +7069,47 @@ msgstr "Download sociale metagegevens, even geduld...."
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50
|
||||||
msgid "Separator"
|
msgid "Separator"
|
||||||
msgstr ""
|
msgstr "Scheidingsteken"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:63
|
||||||
msgid "Choose library"
|
msgid "Choose library"
|
||||||
msgstr ""
|
msgstr "Kies bibliotheek"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:113
|
||||||
msgid "The main toolbar"
|
msgid "The main toolbar"
|
||||||
msgstr ""
|
msgstr "de hoofdwerkbalk"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:114
|
||||||
msgid "The main toolbar when a device is connected"
|
msgid "The main toolbar when a device is connected"
|
||||||
msgstr ""
|
msgstr "De hoofwerkbalk wanneer een apparaat wordt aangekoppeld"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:115
|
||||||
msgid "The context menu for the books in the calibre library"
|
msgid "The context menu for the books in the calibre library"
|
||||||
msgstr ""
|
msgstr "Het context menu voor de boeken in de Calibre bibliotheek"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:117
|
||||||
msgid "The context menu for the books on the device"
|
msgid "The context menu for the books on the device"
|
||||||
msgstr ""
|
msgstr "Het context menu voor de boeken op het apparaat"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:94
|
||||||
msgid "Customize the actions in:"
|
msgid "Customize the actions in:"
|
||||||
msgstr ""
|
msgstr "Pas deze acties aan in:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:95
|
||||||
msgid "A&vailable actions"
|
msgid "A&vailable actions"
|
||||||
msgstr ""
|
msgstr "&Beschikbare acties"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:96
|
||||||
msgid "&Current actions"
|
msgid "&Current actions"
|
||||||
msgstr ""
|
msgstr "&Huidige acties"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:97
|
||||||
msgid "Move selected action up"
|
msgid "Move selected action up"
|
||||||
msgstr ""
|
msgstr "Verplaats de gesecteerde actie omhoog"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:99
|
||||||
msgid "Move selected action down"
|
msgid "Move selected action down"
|
||||||
msgstr ""
|
msgstr "Verplaats geselecteerde actie omlaag"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:78
|
||||||
@ -7101,11 +7118,11 @@ msgstr "Ctrl+S"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:102
|
||||||
msgid "Add selected actions to toolbar"
|
msgid "Add selected actions to toolbar"
|
||||||
msgstr ""
|
msgstr "Voeg geselecteerde acties toe aan werkbalk"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:104
|
||||||
msgid "Remove selected actions from toolbar"
|
msgid "Remove selected actions from toolbar"
|
||||||
msgstr ""
|
msgstr "Verwijder geselecteerde acties van de werkbalk"
|
||||||
|
|
||||||
#: /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"
|
||||||
@ -7279,7 +7296,7 @@ msgstr "Bewerk van <b>%d boeken</b de meta gegevens"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:222
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:222
|
||||||
msgid "Applying changes to %d books. This may take a while."
|
msgid "Applying changes to %d books. This may take a while."
|
||||||
msgstr ""
|
msgstr "Wijzigingen toepassen op %d boeken. Dit kan geruime tijd duren."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:157
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:157
|
||||||
msgid "Edit Meta information"
|
msgid "Edit Meta information"
|
||||||
@ -7370,6 +7387,7 @@ msgid ""
|
|||||||
"Future conversion of these books will use the default settings."
|
"Future conversion of these books will use the default settings."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Verwijder voor de geselecteerde boeken de conversie instellingen.\n"
|
"Verwijder voor de geselecteerde boeken de conversie instellingen.\n"
|
||||||
|
"\n"
|
||||||
"Toekomstige conversies van deze boeken zullen de standaard instellingen "
|
"Toekomstige conversies van deze boeken zullen de standaard instellingen "
|
||||||
"gebruiken."
|
"gebruiken."
|
||||||
|
|
||||||
@ -8045,8 +8063,8 @@ msgid ""
|
|||||||
"If the tag you want is not in the available list, you can add it here. "
|
"If the tag you want is not in the available list, you can add it here. "
|
||||||
"Accepts a comma separated list of tags."
|
"Accepts a comma separated list of tags."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Als het label die wilt gebruiken niet in de beschikbare lijst voorkomt, dan "
|
"Als het label die u wilt gebruiken niet in de beschikbare lijst voorkomt, "
|
||||||
"kun je hem hier toevoegen als lijst gescheiden met komma's."
|
"dan kun u hem hier toevoegen als lijst gescheiden met komma's."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:134
|
||||||
msgid "Add tag to available tags and apply it to current book"
|
msgid "Add tag to available tags and apply it to current book"
|
||||||
@ -8521,11 +8539,11 @@ msgstr "Opdrachten"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:285
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:285
|
||||||
msgid "Shift+Alt+J"
|
msgid "Shift+Alt+J"
|
||||||
msgstr ""
|
msgstr "Shift+Alt+J"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:302
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:302
|
||||||
msgid "Click to see list of jobs"
|
msgid "Click to see list of jobs"
|
||||||
msgstr ""
|
msgstr "Klik om een takenlijst te zien"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:371
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:371
|
||||||
msgid " - Jobs"
|
msgid " - Jobs"
|
||||||
@ -8590,7 +8608,7 @@ msgid ""
|
|||||||
"<p>Search the list of books by title, author, publisher, tags, comments, "
|
"<p>Search the list of books by title, author, publisher, tags, comments, "
|
||||||
"etc.<br><br>Words separated by spaces are ANDed"
|
"etc.<br><br>Words separated by spaces are ANDed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"<p>Zoek door de boekenlijst gesorteerd op titek, auteur, uitgever, labels, "
|
"<p>Zoek door de boekenlijst gesorteerd op titel, auteur, uitgever, labels, "
|
||||||
"commentaar, enz.<br><br>Woorden gescheiden door spaties worden samengevoegd"
|
"commentaar, enz.<br><br>Woorden gescheiden door spaties worden samengevoegd"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181
|
||||||
@ -9117,7 +9135,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:789
|
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:789
|
||||||
msgid "Manage &user categories"
|
msgid "Manage &user categories"
|
||||||
msgstr "Beheer &door de gebuiker gecreëerde categorien"
|
msgstr "Beheer &door de gebruiker gecreëerde categorien"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:792
|
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:792
|
||||||
msgid "Add your own categories to the Tag Browser"
|
msgid "Add your own categories to the Tag Browser"
|
||||||
@ -9916,8 +9934,8 @@ msgid ""
|
|||||||
"Choose a location for your books. When you add books to calibre, they will "
|
"Choose a location for your books. When you add books to calibre, they will "
|
||||||
"be copied here:"
|
"be copied here:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Kies een locatie voor je boeken. Wanneer je boeken toevoegt aan celibre, dan "
|
"Kies een locatie voor je boeken. Wanneer je boeken toevoegt aan Calibre, dan "
|
||||||
"zullen ze hier naar toe worden gecopieerd:"
|
"zullen ze hier naar toe worden gekopieerd:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:54
|
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:54
|
||||||
msgid "&Change"
|
msgid "&Change"
|
||||||
@ -10182,7 +10200,7 @@ msgid ""
|
|||||||
"Default: '%default'\n"
|
"Default: '%default'\n"
|
||||||
"Applies to: BIBTEX output format"
|
"Applies to: BIBTEX output format"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Creëer een citaat voor BIBTEX ingaves.\n"
|
"Maak een citaat voor BIBTEX ingaves.\n"
|
||||||
"Boolean waarde : True, False\n"
|
"Boolean waarde : True, False\n"
|
||||||
"Standaard: '%default'\n"
|
"Standaard: '%default'\n"
|
||||||
"Van toepassing voor: BIBTEX weergave formaat"
|
"Van toepassing voor: BIBTEX weergave formaat"
|
||||||
@ -10195,7 +10213,7 @@ msgid ""
|
|||||||
"Default: '%%default'\n"
|
"Default: '%%default'\n"
|
||||||
"Applies to: BIBTEX output format"
|
"Applies to: BIBTEX output format"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Het sjabloon voor het creëren van citaten gebaseerd op velden uit de "
|
"Het sjabloon voor het maken van citaten gebaseerd op velden uit de "
|
||||||
"database.\n"
|
"database.\n"
|
||||||
" Zou een sjabloon moeten zijn met velden ingesloten door {}.\n"
|
" Zou een sjabloon moeten zijn met velden ingesloten door {}.\n"
|
||||||
"Beschikbare velden: %s.\n"
|
"Beschikbare velden: %s.\n"
|
||||||
@ -10233,8 +10251,8 @@ msgid ""
|
|||||||
"Default: '%default'\n"
|
"Default: '%default'\n"
|
||||||
"Applies to: BIBTEX output format"
|
"Applies to: BIBTEX output format"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Ingave type voor Bibtex catalogus.\n"
|
"Soort item voor Bibtex catalogus.\n"
|
||||||
"Beschikbare types: book, misc, mixed\n"
|
"Beschikbare soorten: book, misc, mixed\n"
|
||||||
"Standaard: '%default'\n"
|
"Standaard: '%default'\n"
|
||||||
"Van toepassing op: BIBTEX weergave formaat"
|
"Van toepassing op: BIBTEX weergave formaat"
|
||||||
|
|
||||||
@ -10269,8 +10287,7 @@ msgid ""
|
|||||||
"Default: '%default' excludes bracketed tags, e.g. '[<tag>]'\n"
|
"Default: '%default' excludes bracketed tags, e.g. '[<tag>]'\n"
|
||||||
"Applies to: ePub, MOBI output formats"
|
"Applies to: ePub, MOBI output formats"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Reguliere Expressie die de labels beschijft die worden uitgesloten als "
|
"Regex die de labels beschijft die worden uitgesloten als genres.\n"
|
||||||
"genres.\n"
|
|
||||||
"Standaard: '%default' uitgezonderd labels in haken, b.v. '[<label>]'\n"
|
"Standaard: '%default' uitgezonderd labels in haken, b.v. '[<label>]'\n"
|
||||||
"Betrekking tot: ePub, MOBI uitvoer formaten"
|
"Betrekking tot: ePub, MOBI uitvoer formaten"
|
||||||
|
|
||||||
@ -10283,7 +10300,7 @@ msgid ""
|
|||||||
"Applies to: ePub, MOBI output formats"
|
"Applies to: ePub, MOBI output formats"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Komma-gescheiden lijst van tag woorden die aangeeft dat het boek uit de "
|
"Komma-gescheiden lijst van tag woorden die aangeeft dat het boek uit de "
|
||||||
"uitvoer moet gehouden worden. Nit hoodletter-gevoelig.\n"
|
"uitvoer moet gehouden worden. Neit hoofdletter gevoelig.\n"
|
||||||
"--exclude-tags=skip komt overeen met 'skip this book' en 'Skip will like "
|
"--exclude-tags=skip komt overeen met 'skip this book' en 'Skip will like "
|
||||||
"this'\n"
|
"this'\n"
|
||||||
"Standaard: '%default'\n"
|
"Standaard: '%default'\n"
|
||||||
@ -10464,7 +10481,8 @@ msgstr ""
|
|||||||
"%prog add [opties] bestand1 bestand2 bestand3 ...\n"
|
"%prog add [opties] bestand1 bestand2 bestand3 ...\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Voeg de opgegeven bestanden toe als boeken in de database. Folders kunnen "
|
"Voeg de opgegeven bestanden toe als boeken in de database. Folders kunnen "
|
||||||
"ook worden opgegeven, zie de folder gerelateerde opties hier onder.\n"
|
"ook worden\n"
|
||||||
|
"opgegeven, zie de folder gerelateerde opties hier onder.\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:276
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:276
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -10518,9 +10536,9 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"%prog remove ids\n"
|
"%prog remove ids\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Verwijder de boeken die zijn geidentificeerd als ids van de database. ids "
|
"Verwijder de boeken die zijn geïdentificeerd als id's van de database. id's "
|
||||||
"moeten een lijst zijn die is gescheiden door komma's. (Je kan de id nummers "
|
"moeten staan in een kommagescheiden lijst. (id nummers kan men krijgen door "
|
||||||
"zien door het list commando te gebruiken). Bijvoorbeeld, 23,34,57-85\n"
|
"de opsommingsopdracht te gebruiken). Bv. 23,34,57-85\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:344
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:344
|
||||||
msgid "You must specify at least one book to remove"
|
msgid "You must specify at least one book to remove"
|
||||||
@ -10536,10 +10554,9 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"%prog aa_format [opties] id eboek_bestand\n"
|
"%prog aa_format [opties] id eboek_bestand\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Voeg het eboek in eboek_bestand toe aan de beschikbare formaten voor het "
|
"Voeg het eboek in eboek_file toe aan de beschikbare formaten voor het "
|
||||||
"logische boek dat word geidentificeerd als id. Je kan de id nummers zien "
|
"logische boek geïdentificeerd door id. Je kan id nummers krijgen met de "
|
||||||
"door het list commando te gebruiken. Als het formaat al bestaat, dan zal het "
|
"opsommingsopdracht. Als het formaat al bestaat, wordt het vervangen.\n"
|
||||||
"worden vervangen.\n"
|
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:378
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:378
|
||||||
msgid "You must specify an id and an ebook file"
|
msgid "You must specify an id and an ebook file"
|
||||||
@ -10561,7 +10578,7 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"%prog remove_format [opties] id fmt\n"
|
"%prog remove_format [opties] id fmt\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Verwijder het formaat fmt van het logische boek geidentificeerd door id. Je "
|
"Verwijder het formaat fmt van het logische boek geïdentificeerd door id. Je "
|
||||||
"kunt de id verkrijgen door het list commando te gebruiken. fmt is een "
|
"kunt de id verkrijgen door het list commando te gebruiken. fmt is een "
|
||||||
"bestands extensie zoals LRF, TXT of EPUB. Als het logische boek niet in dit "
|
"bestands extensie zoals LRF, TXT of EPUB. Als het logische boek niet in dit "
|
||||||
"formaat bestaat, dan zal er niets gebeuren.\n"
|
"formaat bestaat, dan zal er niets gebeuren.\n"
|
||||||
@ -10580,11 +10597,11 @@ msgid ""
|
|||||||
"id is an id number from the list command.\n"
|
"id is an id number from the list command.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"%prog show_metagegevens [opties] id\n"
|
"%prog show_metadata [opties] id\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Geef de metagegevens weer die zijn opgeslagen in de Calibre database voor "
|
"Geef de metagegevens weer die zijn opgeslagen in de Calibre database voor "
|
||||||
"het boek dat word geidentificeerd door id.\n"
|
"het boek dat word geïdentificeerd door id.\n"
|
||||||
"id is een id nummer uit het lijst commando.\n"
|
"id is een id nummer uit de opsommingsopdracht.\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:434
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:434
|
||||||
msgid "Print metadata in OPF form (XML)"
|
msgid "Print metadata in OPF form (XML)"
|
||||||
@ -10610,10 +10627,12 @@ msgstr ""
|
|||||||
"%prog set_metadata [opties] if /pad/naar/metadata.opf\n"
|
"%prog set_metadata [opties] if /pad/naar/metadata.opf\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Geef de metagegevens weer diezijn opgeslagen in de Calibre database voor het "
|
"Geef de metagegevens weer diezijn opgeslagen in de Calibre database voor het "
|
||||||
"boek dat word geidentificeerd door id uit het OPF bestand metadata.opf. id "
|
"boek dat word geïdentificeerd door id\n"
|
||||||
"is een id nummer uit het lijst commando. Je kunt een kort overzicht voor het "
|
" uit het OPF bestand metadata.opf. id is een id nummer uit het lijst "
|
||||||
"OPF formaat krijgen door de --as-opf schakel te gebruiken met het "
|
"commando.\n"
|
||||||
"show_metadata commando.\n"
|
"Je kunt een kort overzicht voor het OPF formaat krijgen door de --as-opf "
|
||||||
|
"schakel te\n"
|
||||||
|
"gebruiken met het show_metadata commando.\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:472
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:472
|
||||||
msgid "You must specify an id and a metadata file"
|
msgid "You must specify an id and a metadata file"
|
||||||
@ -10633,9 +10652,9 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"Exporteer de boeken gespecificeerd door ids (een lijst gescheiden door "
|
"Exporteer de boeken gespecificeerd door ids (een lijst gescheiden door "
|
||||||
"komma's) naar het bestandssysteem.\n"
|
"komma's) naar het bestandssysteem.\n"
|
||||||
"De export operatie bewaard alle formaten van het boek, de cover en "
|
"De export operatie bewaard alle formaten van het boek, de omslag en "
|
||||||
"metagegevens (in een opf bestand). Je kunt ID nummers verkrijgen door middel "
|
"metagegevens (in een opf bestand). \n"
|
||||||
"van het lijst commando.\n"
|
"Je kunt ID nummers verkrijgen door middel van de opsommingsopdracht.\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:500
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:500
|
||||||
msgid "Export all books in database, ignoring the list of ids."
|
msgid "Export all books in database, ignoring the list of ids."
|
||||||
@ -10831,6 +10850,9 @@ msgstr "Vraag niet om een bevestiging"
|
|||||||
msgid "Error: You must specify a column label"
|
msgid "Error: You must specify a column label"
|
||||||
msgstr "Fout: Je moet een kolomlabel opgeven"
|
msgstr "Fout: Je moet een kolomlabel opgeven"
|
||||||
|
|
||||||
|
# is this correct?
|
||||||
|
# don't know if lines with prog saved_searches
|
||||||
|
# have to be translated.
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:803
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:803
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
@ -10843,38 +10865,49 @@ msgid ""
|
|||||||
" replaced.\n"
|
" replaced.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
" %prog saved_searches [options] opsommen\n"
|
||||||
|
" %prog saved_searches naam zoekactie toevoegen\n"
|
||||||
|
" %prog saved_searches naam verwijderen\n"
|
||||||
|
"\n"
|
||||||
|
" Beheer de opgeslagen zoekacties opgeslagen in deze database.\n"
|
||||||
|
" Als een query wordt toegevoegd met een bestaande naam,\n"
|
||||||
|
" dan wordt die vervangen.\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:821
|
||||||
msgid "Error: You must specify an action (add|remove|list)"
|
msgid "Error: You must specify an action (add|remove|list)"
|
||||||
msgstr ""
|
msgstr "Fout: U moet een actie opgeven (toevoegen|verwijderen|opsommen)"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:829
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:829
|
||||||
msgid "Name:"
|
msgid "Name:"
|
||||||
msgstr ""
|
msgstr "Naam:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:830
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:830
|
||||||
msgid "Search string:"
|
msgid "Search string:"
|
||||||
msgstr ""
|
msgstr "Zoekargument:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:836
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:836
|
||||||
msgid "Error: You must specify a name and a search string"
|
msgid "Error: You must specify a name and a search string"
|
||||||
msgstr ""
|
msgstr "Fout: je moet een naam en een zoekargument opgeven"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:839
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:839
|
||||||
msgid "added"
|
msgid "added"
|
||||||
msgstr ""
|
msgstr "toegevoegd"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:844
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:844
|
||||||
msgid "Error: You must specify a name"
|
msgid "Error: You must specify a name"
|
||||||
msgstr ""
|
msgstr "Fout: U moet een naam opgeven"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:847
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:847
|
||||||
msgid "removed"
|
msgid "removed"
|
||||||
msgstr ""
|
msgstr "verwijderd"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:851
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:851
|
||||||
msgid "Error: Action %s not recognized, must be one of: (add|remove|list)"
|
msgid "Error: Action %s not recognized, must be one of: (add|remove|list)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Fout: Actie %s wordt niet herkend, het moet een van deze zijn : "
|
||||||
|
"(toevoegen|verwijderen|opsommen)"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:865
|
#: /home/kovid/work/calibre/src/calibre/library/cli.py:865
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -10922,7 +10955,7 @@ msgstr "<p>Migreer oude database naar eboek bibliotheek in %s<br><center>"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1944
|
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1944
|
||||||
msgid "Copying <b>%s</b>"
|
msgid "Copying <b>%s</b>"
|
||||||
msgstr "Copieer <b>%s</b>"
|
msgstr "Kopiëren van <b>%s</b>"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1961
|
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1961
|
||||||
msgid "Compacting database"
|
msgid "Compacting database"
|
||||||
@ -11026,7 +11059,7 @@ msgid ""
|
|||||||
"Normally, calibre will save the cover in a separate file along with the "
|
"Normally, calibre will save the cover in a separate file along with the "
|
||||||
"actual e-book file(s)."
|
"actual e-book file(s)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Normaal gesproken zal calibre de omslag afbeeling opslaan in een apart "
|
"Normaal gesproken zal calibre de omslag afbeelding opslaan in een apart "
|
||||||
"bestand, samen met de daadwerkelijke e-boek bestanden."
|
"bestand, samen met de daadwerkelijke e-boek bestanden."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:63
|
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:63
|
||||||
@ -11171,10 +11204,12 @@ msgid ""
|
|||||||
"Specifies a restriction to be used for this invocation. This option "
|
"Specifies a restriction to be used for this invocation. This option "
|
||||||
"overrides any per-library settings specified in the GUI"
|
"overrides any per-library settings specified in the GUI"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Specificeert een beperking die gebruikt wordt bij deze aanroeping. Deze "
|
||||||
|
"optie gaat boven elke per-bibliotheek instelling gespecificeerd in de GUI"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
|
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
|
||||||
msgid "%d book"
|
msgid "%d book"
|
||||||
msgstr ""
|
msgstr "%d boek"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:129
|
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:129
|
||||||
msgid "%d items"
|
msgid "%d items"
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 23:12+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:48+0000\n"
|
||||||
"Last-Translator: tedric <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Portuguese <pt@li.org>\n"
|
"Language-Team: Portuguese <pt@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-22 03:45+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:56+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
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 21:26+0000\n"
|
"PO-Revision-Date: 2010-08-24 11:38+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Thomaz Rodrigues Botelho <Unknown>\n"
|
||||||
"Language-Team: American English <kde-i18n-doc@kde.org>\n"
|
"Language-Team: American English <kde-i18n-doc@kde.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-21 03:53+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-25 03:50+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
|
||||||
@ -2178,7 +2178,7 @@ msgstr "Assinatura de tempo (timestamp)"
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70
|
||||||
msgid "Published"
|
msgid "Published"
|
||||||
msgstr ""
|
msgstr "Publicado"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:418
|
||||||
msgid "Rights"
|
msgid "Rights"
|
||||||
@ -3058,7 +3058,7 @@ msgstr "Sobrescrever autor e título com os novos metadados"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95
|
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:95
|
||||||
msgid "Limit max simultaneous jobs to number of CPUs"
|
msgid "Limit max simultaneous jobs to number of CPUs"
|
||||||
msgstr ""
|
msgstr "Limitar o máximo de tarefas simultâneas ao número de CPUs"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97
|
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:97
|
||||||
msgid "tag browser categories not to display"
|
msgid "tag browser categories not to display"
|
||||||
@ -3341,7 +3341,7 @@ msgstr "Escolha a biblioteca do calibre para trabalhar com"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:81
|
||||||
msgid "Switch to library..."
|
msgid "Switch to library..."
|
||||||
msgstr ""
|
msgstr "Mudar para biblioteca..."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:88
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:88
|
||||||
msgid "Quick switch"
|
msgid "Quick switch"
|
||||||
@ -3371,6 +3371,7 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184
|
||||||
msgid "You cannot change libraries while jobs are running."
|
msgid "You cannot change libraries while jobs are running."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Você não pode mudar bibliotecas enquanto tarefas estão sendo executadas."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:22
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:22
|
||||||
msgid "C"
|
msgid "C"
|
||||||
@ -3765,7 +3766,7 @@ msgstr "Não foi possível configurar"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:33
|
||||||
msgid "Cannot configure while there are running jobs."
|
msgid "Cannot configure while there are running jobs."
|
||||||
msgstr ""
|
msgstr "Não pode ser configurado enquanto há tarefas sendo executadas."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:38
|
||||||
msgid "Cannot configure before calibre is restarted."
|
msgid "Cannot configure before calibre is restarted."
|
||||||
@ -4176,7 +4177,7 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56
|
||||||
msgid "Click to open"
|
msgid "Click to open"
|
||||||
msgstr ""
|
msgstr "Clique para abrir"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:305
|
||||||
@ -4193,7 +4194,7 @@ msgstr "Nenhum"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310
|
||||||
msgid "Click to open Book Details window"
|
msgid "Click to open Book Details window"
|
||||||
msgstr "Click para abrir a janela de Detalhes do Livro"
|
msgstr "Clique para abrir a janela de Detalhes do Livro"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:16
|
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:16
|
||||||
msgid "BibTeX Options"
|
msgid "BibTeX Options"
|
||||||
@ -5366,7 +5367,7 @@ msgstr "Navegar pelas capas"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:149
|
#: /home/kovid/work/calibre/src/calibre/gui2/cover_flow.py:149
|
||||||
msgid "Cover browser could not be loaded"
|
msgid "Cover browser could not be loaded"
|
||||||
msgstr ""
|
msgstr "Navegador de Capas não pode ser carregado"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59
|
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:84
|
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:84
|
||||||
@ -6379,7 +6380,7 @@ msgstr "&Layout da Interface do Usuário (precisa reiniciar):"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640
|
||||||
msgid "Restriction to apply when the current library is opened:"
|
msgid "Restriction to apply when the current library is opened:"
|
||||||
msgstr ""
|
msgstr "Restrição para aplicar quando a biblioteca atual é aberta:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -6387,6 +6388,9 @@ msgid ""
|
|||||||
"used. Also applied when switching to this library. Note that this setting is "
|
"used. Also applied when switching to this library. Note that this setting is "
|
||||||
"per library. "
|
"per library. "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Aplica esta restrição quando calibre inicia se a biblioteca atual estiver "
|
||||||
|
"sendo usada. Também aplicada quando mudando para esta biblioteca. Note que "
|
||||||
|
"está é uma configuração por biblioteca. "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642
|
||||||
msgid "Disable all animations. Useful if you have a slow/old computer."
|
msgid "Disable all animations. Useful if you have a slow/old computer."
|
||||||
@ -6446,7 +6450,7 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654
|
||||||
msgid "Limit the max. simultaneous jobs to the available CPU &cores"
|
msgid "Limit the max. simultaneous jobs to the available CPU &cores"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Limitar o máx. número de processos simultâneos ao número de nú&cleos da CPU"
|
"Limitar o máx. número de tarefas simultâneos ao número de nú&cleos da CPU"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655
|
||||||
msgid "Debug &device detection"
|
msgid "Debug &device detection"
|
||||||
@ -7053,19 +7057,19 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44
|
||||||
msgid "Active Jobs"
|
msgid "Active Jobs"
|
||||||
msgstr ""
|
msgstr "Tarefas Ativas"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45
|
||||||
msgid "&Stop selected job"
|
msgid "&Stop selected job"
|
||||||
msgstr ""
|
msgstr "&Parar tarefa selecionada"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:46
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:46
|
||||||
msgid "Show job &details"
|
msgid "Show job &details"
|
||||||
msgstr ""
|
msgstr "Mostrar &detalhes da tarefa"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47
|
||||||
msgid "Stop &all non device jobs"
|
msgid "Stop &all non device jobs"
|
||||||
msgstr ""
|
msgstr "Parar tod&as as tarefas que não são de dispositivo"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:111
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:111
|
||||||
msgid "Editing meta information for <b>%d books</b>"
|
msgid "Editing meta information for <b>%d books</b>"
|
||||||
@ -7384,7 +7388,7 @@ msgstr "Remover do banco de dados os formatos selecionados deste livro"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:398
|
||||||
msgid "Set the cover for the book from the selected format"
|
msgid "Set the cover for the book from the selected format"
|
||||||
msgstr ""
|
msgstr "Defina a capa para o livro a partir do formato selecionado"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:400
|
||||||
msgid "Update metadata from the metadata in the selected format"
|
msgid "Update metadata from the metadata in the selected format"
|
||||||
@ -7401,11 +7405,11 @@ msgstr "Baixar &capa"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:408
|
||||||
msgid "Generate a default cover based on the title and author"
|
msgid "Generate a default cover based on the title and author"
|
||||||
msgstr ""
|
msgstr "Gerar uma capa padrão baseada no título e autor"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:409
|
||||||
msgid "&Generate cover"
|
msgid "&Generate cover"
|
||||||
msgstr ""
|
msgstr "&Gerar capa"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56
|
||||||
msgid "Password needed"
|
msgid "Password needed"
|
||||||
@ -8176,7 +8180,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105
|
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105
|
||||||
msgid "Cover Browser"
|
msgid "Cover Browser"
|
||||||
msgstr ""
|
msgstr "Navegador de Capas"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110
|
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:110
|
||||||
msgid "Shift+Alt+B"
|
msgid "Shift+Alt+B"
|
||||||
@ -8225,7 +8229,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:62
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:62
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr ""
|
msgstr "Estado"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:63
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:63
|
||||||
msgid "Progress"
|
msgid "Progress"
|
||||||
@ -8233,7 +8237,7 @@ msgstr "Progresso"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:64
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:64
|
||||||
msgid "Running time"
|
msgid "Running time"
|
||||||
msgstr ""
|
msgstr "Tempo de execução"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:76
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:76
|
||||||
msgid "There are %d running jobs:"
|
msgid "There are %d running jobs:"
|
||||||
@ -8268,7 +8272,7 @@ msgstr "Indísponivel"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:283
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:283
|
||||||
msgid "Jobs:"
|
msgid "Jobs:"
|
||||||
msgstr "Trabalhos:"
|
msgstr "Tarefas:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:285
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:285
|
||||||
msgid "Shift+Alt+J"
|
msgid "Shift+Alt+J"
|
||||||
@ -8276,11 +8280,11 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:302
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:302
|
||||||
msgid "Click to see list of jobs"
|
msgid "Click to see list of jobs"
|
||||||
msgstr ""
|
msgstr "Clique para ver a lista de tarefas"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:371
|
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:371
|
||||||
msgid " - Jobs"
|
msgid " - Jobs"
|
||||||
msgstr ""
|
msgstr " - Tarefas"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:66
|
||||||
msgid "Eject this device"
|
msgid "Eject this device"
|
||||||
@ -8508,12 +8512,12 @@ msgstr "Página Anterior"
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:133
|
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:133
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:188
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:188
|
||||||
msgid "Back"
|
msgid "Back"
|
||||||
msgstr ""
|
msgstr "Voltar"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:134
|
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:134
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:189
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:189
|
||||||
msgid "Forward"
|
msgid "Forward"
|
||||||
msgstr ""
|
msgstr "Avançar"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:135
|
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:135
|
||||||
msgid "Next match"
|
msgid "Next match"
|
||||||
@ -8966,7 +8970,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511
|
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:511
|
||||||
msgid "WARNING: Active jobs"
|
msgid "WARNING: Active jobs"
|
||||||
msgstr ""
|
msgstr "AVISO: Tarefas ativas"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569
|
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -9054,11 +9058,11 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:156
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:156
|
||||||
msgid "Se&rif family:"
|
msgid "Se&rif family:"
|
||||||
msgstr ""
|
msgstr "Familia Se&rif:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:157
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:157
|
||||||
msgid "&Sans family:"
|
msgid "&Sans family:"
|
||||||
msgstr ""
|
msgstr "Familia &Sans:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:158
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:158
|
||||||
msgid "&Monospace family:"
|
msgid "&Monospace family:"
|
||||||
@ -9104,7 +9108,7 @@ msgstr "Máximo comprimento para &visualizar:"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:170
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:170
|
||||||
msgid "H&yphenate (break line in the middle of large words)"
|
msgid "H&yphenate (break line in the middle of large words)"
|
||||||
msgstr ""
|
msgstr "H&ifenizar (quebrar linha no meio de palavras grandes)"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:171
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:171
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -9116,7 +9120,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:172
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:172
|
||||||
msgid "Default &language for hyphenation:"
|
msgid "Default &language for hyphenation:"
|
||||||
msgstr ""
|
msgstr "&Linguagem padrão para hifenização"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:173
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:173
|
||||||
msgid "&Resize images larger than the viewer window (needs restart)"
|
msgid "&Resize images larger than the viewer window (needs restart)"
|
||||||
@ -9126,7 +9130,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:174
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:174
|
||||||
msgid "&User stylesheet"
|
msgid "&User stylesheet"
|
||||||
msgstr ""
|
msgstr "Folha de estilo do &Usuário"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:175
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:175
|
||||||
msgid "&General"
|
msgid "&General"
|
||||||
@ -9138,7 +9142,7 @@ msgstr "Duplo clique para mudar um atalho do teclado"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:177
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:177
|
||||||
msgid "&Keyboard shortcuts"
|
msgid "&Keyboard shortcuts"
|
||||||
msgstr ""
|
msgstr "Atalhos do &Teclado"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/dictionary.py:53
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/dictionary.py:53
|
||||||
msgid "No results found for:"
|
msgid "No results found for:"
|
||||||
@ -9172,7 +9176,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49
|
||||||
msgid "Hyphenate text"
|
msgid "Hyphenate text"
|
||||||
msgstr ""
|
msgstr "Hifenizar texto"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:51
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:51
|
||||||
msgid "Default language for hyphenation rules"
|
msgid "Default language for hyphenation rules"
|
||||||
@ -9204,7 +9208,7 @@ msgstr "O tamanho da fonte monoespaçada em px"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62
|
||||||
msgid "The standard font type"
|
msgid "The standard font type"
|
||||||
msgstr ""
|
msgstr "O tipo padrão de fonte"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:453
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:453
|
||||||
msgid "&Lookup in dictionary"
|
msgid "&Lookup in dictionary"
|
||||||
@ -9241,31 +9245,31 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:12
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:12
|
||||||
msgid "Scroll to the next page"
|
msgid "Scroll to the next page"
|
||||||
msgstr ""
|
msgstr "Rolar para a próxima página"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:15
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:15
|
||||||
msgid "Scroll to the previous page"
|
msgid "Scroll to the previous page"
|
||||||
msgstr ""
|
msgstr "Rolar para a página anterior"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:18
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:18
|
||||||
msgid "Scroll to the next section"
|
msgid "Scroll to the next section"
|
||||||
msgstr ""
|
msgstr "Rolar para a próxima seção"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:21
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:21
|
||||||
msgid "Scroll to the previous section"
|
msgid "Scroll to the previous section"
|
||||||
msgstr ""
|
msgstr "Rolar para a seção anterior"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:24
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:24
|
||||||
msgid "Scroll to the bottom of the section"
|
msgid "Scroll to the bottom of the section"
|
||||||
msgstr ""
|
msgstr "Rolar para o fim da seção"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:27
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:27
|
||||||
msgid "Scroll to the top of the section"
|
msgid "Scroll to the top of the section"
|
||||||
msgstr ""
|
msgstr "Rolar para o início da seção"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:30
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:30
|
||||||
msgid "Scroll to the end of the document"
|
msgid "Scroll to the end of the document"
|
||||||
msgstr ""
|
msgstr "Rolar para o fim do documento"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:33
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:33
|
||||||
msgid "Scroll to the start of the document"
|
msgid "Scroll to the start of the document"
|
||||||
@ -9273,15 +9277,15 @@ msgstr "Rolar para o início do documento"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:36
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:36
|
||||||
msgid "Scroll down"
|
msgid "Scroll down"
|
||||||
msgstr ""
|
msgstr "Rolar para baixo"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:39
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:39
|
||||||
msgid "Scroll up"
|
msgid "Scroll up"
|
||||||
msgstr ""
|
msgstr "Rolar para cima"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:42
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:42
|
||||||
msgid "Scroll left"
|
msgid "Scroll left"
|
||||||
msgstr ""
|
msgstr "Rolar para a esquerda"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:45
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/keys.py:45
|
||||||
msgid "Scroll right"
|
msgid "Scroll right"
|
||||||
@ -9298,6 +9302,8 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:192
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:192
|
||||||
msgid "Go to a reference. To get reference numbers, use the reference mode."
|
msgid "Go to a reference. To get reference numbers, use the reference mode."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Ir para uma referência. Para conseguir números de referência, use o Modo de "
|
||||||
|
"Referência"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:200
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:200
|
||||||
msgid "Search for text in book"
|
msgid "Search for text in book"
|
||||||
@ -9430,7 +9436,7 @@ msgstr "Copiar para a área de transferência"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:202
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:202
|
||||||
msgid "Reference Mode"
|
msgid "Reference Mode"
|
||||||
msgstr ""
|
msgstr "Modo de Referência"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:203
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:203
|
||||||
msgid "Bookmark"
|
msgid "Bookmark"
|
||||||
@ -10783,6 +10789,8 @@ msgid ""
|
|||||||
"Specifies a restriction to be used for this invocation. This option "
|
"Specifies a restriction to be used for this invocation. This option "
|
||||||
"overrides any per-library settings specified in the GUI"
|
"overrides any per-library settings specified in the GUI"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Especifica uma restriçao para ser usada neste pedido. Esta opção sobrepõe "
|
||||||
|
"qualquer configurações por biblioteca especificadas na Interface gráfica."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
|
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110
|
||||||
msgid "%d book"
|
msgid "%d book"
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:21+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:45+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Romanian <ro@li.org>\n"
|
"Language-Team: Romanian <ro@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-22 03:45+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:56+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
|
||||||
|
@ -7,13 +7,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre 0.4.55\n"
|
"Project-Id-Version: calibre 0.4.55\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 23:48+0000\n"
|
"PO-Revision-Date: 2010-08-26 12:48+0000\n"
|
||||||
"Last-Translator: HelioS <Unknown>\n"
|
"Last-Translator: Ilya Telegin <devi29rus@gmail.com>\n"
|
||||||
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
|
"Language-Team: American English <kde-i18n-doc@lists.kde.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-22 03:45+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-27 03:36+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"X-Poedit-Country: RUSSIAN FEDERATION\n"
|
"X-Poedit-Country: RUSSIAN FEDERATION\n"
|
||||||
"X-Poedit-Language: Russian\n"
|
"X-Poedit-Language: Russian\n"
|
||||||
@ -770,6 +770,9 @@ msgid ""
|
|||||||
"\".kobo\" files do not exist on the device as books instead, they are rows "
|
"\".kobo\" files do not exist on the device as books instead, they are rows "
|
||||||
"in the sqlite database. Currently they cannot be exported or viewed."
|
"in the sqlite database. Currently they cannot be exported or viewed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Файлы \".kobo\" отсутствуют на устройстве в формате книг, они являются "
|
||||||
|
"записями в БД sqlite. На текущий момент они не могут быть экспортированы или "
|
||||||
|
"просмотрены."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:17
|
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:17
|
||||||
msgid "Communicate with the Palm Pre"
|
msgid "Communicate with the Palm Pre"
|
||||||
@ -785,7 +788,7 @@ msgstr "Устанавливает связь с Sweex MM300"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
|
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:79
|
||||||
msgid "Communicate with the Kogan"
|
msgid "Communicate with the Kogan"
|
||||||
msgstr ""
|
msgstr "Подключение к читалке Kogan"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
|
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87
|
||||||
msgid "Communicate with the Pandigital Novel"
|
msgid "Communicate with the Pandigital Novel"
|
||||||
@ -845,7 +848,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:11
|
#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:11
|
||||||
msgid "Communicate with the Teclast K3/K5 reader."
|
msgid "Communicate with the Teclast K3/K5 reader."
|
||||||
msgstr ""
|
msgstr "Подключиться к читалке Teclast K3/K5"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:36
|
#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:36
|
||||||
msgid "Communicate with the Newsmy reader."
|
msgid "Communicate with the Newsmy reader."
|
||||||
@ -1710,7 +1713,7 @@ msgstr "Создаю"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
|
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20
|
||||||
msgid "Failed to parse: %s with error: %s"
|
msgid "Failed to parse: %s with error: %s"
|
||||||
msgstr ""
|
msgstr "Не удалось разобрать: %s ошибка: %s"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
|
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26
|
||||||
msgid "ePub Fixer"
|
msgid "ePub Fixer"
|
||||||
@ -1819,6 +1822,10 @@ msgid ""
|
|||||||
"JetBook Lite. Without this option, such devices will display the cover as a "
|
"JetBook Lite. Without this option, such devices will display the cover as a "
|
||||||
"blank page."
|
"blank page."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Не используйте файл SVG в качестве обложки. Используйте эту опцию только, "
|
||||||
|
"если файл EPUB будет использоваться на устройстве не поддерживающем SVG, "
|
||||||
|
"таком как iPhone или JetBook Lite. Без включенной опции, подобные устройства "
|
||||||
|
"будут отображать обложку в виде пустой страницы."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:94
|
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:94
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -2345,12 +2352,12 @@ msgstr "Загрузка обложки"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:79
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:79
|
||||||
msgid "Download covers from openlibrary.org"
|
msgid "Download covers from openlibrary.org"
|
||||||
msgstr ""
|
msgstr "Загрузка обложек с openlibrary.org"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:107
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:107
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136
|
||||||
msgid "ISBN: %s not found"
|
msgid "ISBN: %s not found"
|
||||||
msgstr ""
|
msgstr "ISBN: %s не найден"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:117
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:117
|
||||||
msgid "Download covers from librarything.com"
|
msgid "Download covers from librarything.com"
|
||||||
@ -2512,7 +2519,7 @@ msgstr "Отказаться от сжатия содержимого файла
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:40
|
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:40
|
||||||
msgid "Tag marking book to be filed with Personal Docs"
|
msgid "Tag marking book to be filed with Personal Docs"
|
||||||
msgstr ""
|
msgstr "Тег маркировки книги с личными документами"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108
|
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108
|
||||||
msgid "All articles"
|
msgid "All articles"
|
||||||
@ -3436,11 +3443,11 @@ msgstr "Запрещено"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:179
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:179
|
||||||
msgid "You cannot change libraries when a device is connected."
|
msgid "You cannot change libraries when a device is connected."
|
||||||
msgstr ""
|
msgstr "Вы не можете сменить библиотеку пока устройство подключено."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:184
|
||||||
msgid "You cannot change libraries while jobs are running."
|
msgid "You cannot change libraries while jobs are running."
|
||||||
msgstr ""
|
msgstr "Вы не можете сменить библиотеку во время выполнения операции."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:22
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:22
|
||||||
msgid "C"
|
msgid "C"
|
||||||
@ -3468,32 +3475,32 @@ msgstr "Подготовка к конвертированию %d книг(и)"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63
|
||||||
msgid "Copy to library"
|
msgid "Copy to library"
|
||||||
msgstr ""
|
msgstr "Копировать в библиотеку"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py: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
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:97
|
||||||
msgid "Cannot copy"
|
msgid "Cannot copy"
|
||||||
msgstr ""
|
msgstr "Не удается скопировать"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:102
|
||||||
msgid "No library"
|
msgid "No library"
|
||||||
msgstr ""
|
msgstr "Нет библиотеки"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103
|
||||||
msgid "No library found at %s"
|
msgid "No library found at %s"
|
||||||
msgstr ""
|
msgstr "Не найдено в библиотеке %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:106
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:110
|
||||||
msgid "Copying"
|
msgid "Copying"
|
||||||
msgstr ""
|
msgstr "Копирование"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
|
||||||
msgid "Could not copy books: "
|
msgid "Could not copy books: "
|
||||||
msgstr ""
|
msgstr "Невозможно скопировать книги: "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:120
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
|
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678
|
||||||
@ -3503,7 +3510,7 @@ msgstr "Неудалось"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123
|
||||||
msgid "Copied %d books to %s"
|
msgid "Copied %d books to %s"
|
||||||
msgstr ""
|
msgstr "Скопировано %d книг из %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"
|
||||||
@ -10755,6 +10762,8 @@ msgid ""
|
|||||||
"Whenever you pass arguments to %prog that have spaces in them, enclose the "
|
"Whenever you pass arguments to %prog that have spaces in them, enclose the "
|
||||||
"arguments in quotation marks."
|
"arguments in quotation marks."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Всякий раз когда передаете аргументы содержащие пробелы в %prog, закрывайте "
|
||||||
|
"аргументы в кавычки."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/utils/config.py:663
|
#: /home/kovid/work/calibre/src/calibre/utils/config.py:663
|
||||||
msgid "Path to the database in which books are stored"
|
msgid "Path to the database in which books are stored"
|
||||||
@ -10786,7 +10795,7 @@ msgstr "Формат книги по умолчанию после преобр
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/utils/config.py:679
|
#: /home/kovid/work/calibre/src/calibre/utils/config.py:679
|
||||||
msgid "Ordered list of formats to prefer for input."
|
msgid "Ordered list of formats to prefer for input."
|
||||||
msgstr ""
|
msgstr "Упорядоченный список предпочитаемых форматов"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/utils/config.py:681
|
#: /home/kovid/work/calibre/src/calibre/utils/config.py:681
|
||||||
msgid "Read metadata from files"
|
msgid "Read metadata from files"
|
||||||
@ -10822,7 +10831,7 @@ msgstr "Ожидание..."
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:52
|
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:52
|
||||||
msgid "Stopped"
|
msgid "Stopped"
|
||||||
msgstr ""
|
msgstr "Остановлено"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54
|
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54
|
||||||
msgid "Finished"
|
msgid "Finished"
|
||||||
@ -10942,7 +10951,7 @@ msgstr "Контроль доставки электронной почты"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:118
|
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:118
|
||||||
msgid "Unknown section"
|
msgid "Unknown section"
|
||||||
msgstr ""
|
msgstr "Неизвестный раздел"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:140
|
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:140
|
||||||
msgid "Unknown feed"
|
msgid "Unknown feed"
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 21:51+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:26+0000\n"
|
||||||
"Last-Translator: Besnik <besnik@programeshqip.org>\n"
|
"Last-Translator: Besnik <besnik@programeshqip.org>\n"
|
||||||
"Language-Team: Albanian <sq@li.org>\n"
|
"Language-Team: Albanian <sq@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-21 03:48+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:53+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
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:40+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:18+0000\n"
|
||||||
"Last-Translator: Angel Spy <melissadilara@yahoo.com>\n"
|
"Last-Translator: Angel Spy <melissadilara@yahoo.com>\n"
|
||||||
"Language-Team: Turkish <tr@li.org>\n"
|
"Language-Team: Turkish <tr@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-22 03:46+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:56+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
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:26+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:13+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-22 03:46+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:57+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
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:38+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:16+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Simplified Chinese <wanglihao@gmail.com>\n"
|
"Language-Team: Simplified Chinese <wanglihao@gmail.com>\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-22 03:46+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:57+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"X-Poedit-Country: CHINA\n"
|
"X-Poedit-Country: CHINA\n"
|
||||||
"X-Poedit-Language: Chinese\n"
|
"X-Poedit-Language: Chinese\n"
|
||||||
|
@ -8,13 +8,13 @@ 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-20 20:19+0000\n"
|
"POT-Creation-Date: 2010-08-20 20:19+0000\n"
|
||||||
"PO-Revision-Date: 2010-08-20 22:46+0000\n"
|
"PO-Revision-Date: 2010-08-22 19:21+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Chinese (traditional)\n"
|
"Language-Team: Chinese (traditional)\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-22 03:46+0000\n"
|
"X-Launchpad-Export-Date: 2010-08-23 03:57+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"Language: zh_TW\n"
|
"Language: zh_TW\n"
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user