mirror of
				https://github.com/kovidgoyal/calibre.git
				synced 2025-11-03 19:17:02 -05:00 
			
		
		
		
	Merge upstream changes.
This commit is contained in:
		
						commit
						e2310c9970
					
				
							
								
								
									
										244
									
								
								installer/cx_Freeze/HISTORY.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								installer/cx_Freeze/HISTORY.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,244 @@
 | 
			
		||||
Changes from 4.0 to 4.0.1
 | 
			
		||||
 1) Added support for Python 2.6. On Windows a manifest file is now required
 | 
			
		||||
    because of the switch to using the new Microsoft C runtime.
 | 
			
		||||
 2) Ensure that hooks are run for builtin modules.
 | 
			
		||||
 | 
			
		||||
Changes from 4.0b1 to 4.0
 | 
			
		||||
 1) Added support for copying files to the target directory.
 | 
			
		||||
 2) Added support for a hook that runs when a module is missing.
 | 
			
		||||
 3) Added support for binary path includes as well as excludes; use sequences
 | 
			
		||||
    rather than dictionaries as a more convenient API; exclude the standard
 | 
			
		||||
    locations for 32-bit and 64-bit libaries in multi-architecture systems.
 | 
			
		||||
 4) Added support for searching zip files (egg files) for modules.
 | 
			
		||||
 5) Added support for handling system exit exceptions similarly to what Python
 | 
			
		||||
    does itself as requested by Sylvain.
 | 
			
		||||
 6) Added code to wait for threads to shut down like the normal Python
 | 
			
		||||
    interpreter does. Thanks to Mariano Disanzo for discovering this
 | 
			
		||||
    discrepancy.
 | 
			
		||||
 7) Hooks added or modified based on feedback from many people.
 | 
			
		||||
 8) Don't include the version name in the display name of the MSI.
 | 
			
		||||
 9) Use the OS dependent path normalization routines rather than simply use the
 | 
			
		||||
    lowercase value as on Unix case is important; thanks to Artie Eoff for
 | 
			
		||||
    pointing this out.
 | 
			
		||||
10) Include a version attribute in the cx_Freeze package and display it in the
 | 
			
		||||
    output for the --version option to the script.
 | 
			
		||||
11) Include build instructions as requested by Norbert Sebok.
 | 
			
		||||
12) Add support for copying files when modules are included which require data
 | 
			
		||||
    files to operate properly; add support for copying the necessary files for
 | 
			
		||||
    the Tkinter and matplotlib modules.
 | 
			
		||||
13) Handle deferred imports recursively as needed; ensure that from lists do
 | 
			
		||||
    not automatically indicate that they are part of the module or the deferred
 | 
			
		||||
    import processing doesn't actually work!
 | 
			
		||||
14) Handle the situation where a module imports everything from a package and
 | 
			
		||||
    the __all__ variable has been defined but the package has not actually
 | 
			
		||||
    imported everything in the __all__ variable during initialization.
 | 
			
		||||
15) Modified license text to more closely match the Python Software Foundation
 | 
			
		||||
    license as was intended.
 | 
			
		||||
16) Added sample script for freezing an application using matplotlib.
 | 
			
		||||
17) Renamed freeze to cxfreeze to avoid conflict with another package that uses
 | 
			
		||||
    that executable as requested by Siegfried Gevatter.
 | 
			
		||||
 | 
			
		||||
Changes from 3.0.3 to 4.0b1
 | 
			
		||||
 1) Added support for placing modules in library.zip or in a separate zip file
 | 
			
		||||
    for each executable that is produced.
 | 
			
		||||
 2) Added support for copying binary dependent files (DLLs and shared
 | 
			
		||||
    libraries)
 | 
			
		||||
 3) Added support for including all submodules in a package
 | 
			
		||||
 4) Added support for including icons in Windows executables
 | 
			
		||||
 5) Added support for constants module which can be used for determining
 | 
			
		||||
    certain build constants at runtime
 | 
			
		||||
 6) Added support for relative imports available in Python 2.5 and up
 | 
			
		||||
 7) Added support for building Windows installers (Python 2.5 and up) and
 | 
			
		||||
    RPM packages
 | 
			
		||||
 8) Added support for distutils configuration scripts
 | 
			
		||||
 9) Added support for hooks which can force inclusion or exclusion of modules
 | 
			
		||||
    when certain modules are included
 | 
			
		||||
10) Added documentation and samples
 | 
			
		||||
11) Added setup.py for building the cx_Freeze package instead of a script
 | 
			
		||||
    used to build only the frozen bases
 | 
			
		||||
12) FreezePython renamed to a script called freeze in the Python distribution
 | 
			
		||||
13) On Linux and other platforms that support it set LD_RUN_PATH to include
 | 
			
		||||
    the directory in which the executable is located
 | 
			
		||||
 | 
			
		||||
Changes from 3.0.2 to 3.0.3
 | 
			
		||||
 1) In Common.c, used MAXPATHLEN defined in the Python OS independent include
 | 
			
		||||
    file rather than the PATH_MAX define which is OS dependent and is not
 | 
			
		||||
    available on IRIX as noted by Andrew Jones.
 | 
			
		||||
 2) In the initscript ConsoleSetLibPath.py, added lines from initscript
 | 
			
		||||
    Console.py that should have been there since the only difference between
 | 
			
		||||
    that script and this one is the automatic re-execution of the executable.
 | 
			
		||||
 3) Added an explicit "import encodings" to the initscripts in order to handle
 | 
			
		||||
    Unicode encodings a little better. Thanks to Ralf Schmitt for pointing out
 | 
			
		||||
    the problem and its solution.
 | 
			
		||||
 4) Generated a meaningful name for the extension loader script so that it is
 | 
			
		||||
    clear which particular extension module is being loaded when an exception
 | 
			
		||||
    is being raised.
 | 
			
		||||
 5) In MakeFrozenBases.py, use distutils to figure out a few more
 | 
			
		||||
    platform-dependent linker flags as suggested by Ralf Schmitt.
 | 
			
		||||
 | 
			
		||||
Changes from 3.0.1 to 3.0.2
 | 
			
		||||
 1) Add support for compressing the byte code in the zip files that are
 | 
			
		||||
    produced.
 | 
			
		||||
 2) Add better support for the win32com package as requested by Barry Scott.
 | 
			
		||||
 3) Prevent deletion of target file if it happens to be identical to the
 | 
			
		||||
    source file.
 | 
			
		||||
 4) Include additional flags for local modifications to a Python build as
 | 
			
		||||
    suggested by Benjamin Rutt.
 | 
			
		||||
 5) Expanded instructions for building cx_Freeze from source based on a
 | 
			
		||||
    suggestion from Gregg Lind.
 | 
			
		||||
 6) Fix typo in help string.
 | 
			
		||||
 | 
			
		||||
Changes from 3.0 to 3.0.1
 | 
			
		||||
 1) Added option --default-path which is used to specify the path used when
 | 
			
		||||
    finding modules. This is particularly useful when performing cross
 | 
			
		||||
    compilations (such as for building a frozen executable for Windows CE).
 | 
			
		||||
 2) Added option --shared-lib-name which can be used to specify the name of
 | 
			
		||||
    the shared library (DLL) implementing the Python runtime that is required
 | 
			
		||||
    for the frozen executable to work. This option is also particularly useful
 | 
			
		||||
    when cross compiling since the normal method for determining this
 | 
			
		||||
    information cannot be used.
 | 
			
		||||
 3) Added option --zip-include which allows for additional files to be added
 | 
			
		||||
    to the zip file that contains the modules that implement the Python
 | 
			
		||||
    script. Thanks to Barray Warsaw for providing the initial patch.
 | 
			
		||||
 4) Added support for handling read-only files properly. Thanks to Peter
 | 
			
		||||
    Grayson for pointing out the problem and providing a solution.
 | 
			
		||||
 5) Added support for a frozen executable to be a symbolic link. Thanks to
 | 
			
		||||
    Robert Kiendl for providing the initial patch.
 | 
			
		||||
 6) Enhanced the support for running a frozen executable that uses an existing
 | 
			
		||||
    Python installation to locate modules it requires. This is primarily of
 | 
			
		||||
    use for embedding Python where the interface is C but the ability to run
 | 
			
		||||
    from source is still desired.
 | 
			
		||||
 7) Modified the documentation to indicate that building from source on
 | 
			
		||||
    Windows currently requires the mingw compiler (http://www.mingw.org).
 | 
			
		||||
 8) Workaround the problem in Python 2.3 (fixed in Python 2.4) which causes a
 | 
			
		||||
    broken module to be left in sys.modules if an ImportError takes place
 | 
			
		||||
    during the execution of the code in that module. Thanks to Roger Binns
 | 
			
		||||
    for pointing this out.
 | 
			
		||||
 | 
			
		||||
Changes from 3.0 beta3 to 3.0
 | 
			
		||||
 1) Ensure that ldd is only run on extension modules.
 | 
			
		||||
 2) Allow for using a compiler other than gcc for building the frozen base
 | 
			
		||||
    executables by setting the environment variable CC.
 | 
			
		||||
 3) Ensure that the import lock is not held while executing the main script;
 | 
			
		||||
    otherwise, attempts to import a module within a thread will hang that
 | 
			
		||||
    thread as noted by Roger Binns.
 | 
			
		||||
 4) Added support for replacing the paths in all frozen modules with something
 | 
			
		||||
    else (so that for example the path of the machine on which the freezing
 | 
			
		||||
    was done is not displayed in tracebacks)
 | 
			
		||||
 | 
			
		||||
Changes from 3.0 beta2 to 3.0 beta3
 | 
			
		||||
 1) Explicitly include the warnings module so that at runtime warnings are
 | 
			
		||||
    suppressed as when running Python normally.
 | 
			
		||||
 2) Improve the extension loader so that an ImportError is raised when the
 | 
			
		||||
    dynamic module is not located; otherwise an error about missing attributes
 | 
			
		||||
    is raised instead.
 | 
			
		||||
 3) Extension loaders are only created when copying dependencies since the
 | 
			
		||||
    normal module should be loadable in the situation where a Python
 | 
			
		||||
    installation is available.
 | 
			
		||||
 4) Added support for Python 2.4.
 | 
			
		||||
 5) Fixed the dependency checking for wxPython to be a little more
 | 
			
		||||
    intelligent.
 | 
			
		||||
 | 
			
		||||
Changes from 3.0 beta1 to 3.0 beta2
 | 
			
		||||
 1) Fix issues with locating the initscripts and bases relative to the
 | 
			
		||||
    directory in which the executable was started.
 | 
			
		||||
 2) Added new base executable ConsoleKeepPath which is used when an existing
 | 
			
		||||
    Python installation is required (such as for FreezePython itself).
 | 
			
		||||
 3) Forced the existence of a Python installation to be ignored when using the
 | 
			
		||||
    standard Console base executable.
 | 
			
		||||
 4) Remove the existing file when copying dependent files; otherwise, an error
 | 
			
		||||
    is raised when attempting to overwrite read-only files.
 | 
			
		||||
 5) Added option -O (or -OO) to FreezePython to set the optimization used when
 | 
			
		||||
    generating bytecode.
 | 
			
		||||
 | 
			
		||||
Changes from 2.2 to 3.0 beta1
 | 
			
		||||
 1) cx_Freeze now requires Python 2.3 or higher since it takes advantage of
 | 
			
		||||
    the ability of Python 2.3 and higher to import modules from zip files.
 | 
			
		||||
    This makes the freezing process considerably simpler and also allows for
 | 
			
		||||
    the execution of multiple frozen packages (such as found in COM servers or
 | 
			
		||||
    shared libraries) without requiring modification to the Python modules.
 | 
			
		||||
 2) All external dependencies have been removed. cx_Freeze now only requires
 | 
			
		||||
    a standard Python distribution to do its work.
 | 
			
		||||
 3) Added the ability to define the initialization scripts that cx_Freeze uses
 | 
			
		||||
    on startup of the frozen program. Previously, these scripts were written
 | 
			
		||||
    in C and could not easily be changed; now they are written in Python and
 | 
			
		||||
    can be found in the initscripts directory (and chosen with the
 | 
			
		||||
    new --init-script option to FreezePython).
 | 
			
		||||
 4) The base executable ConsoleSetLibPath has been removed and replaced with
 | 
			
		||||
    the initscript ConsoleSetLibPath.
 | 
			
		||||
 5) Removed base executables for Win32 services and Win32 COM servers. This
 | 
			
		||||
    functionality will be restored in the future but it is not currently in a
 | 
			
		||||
    state that is ready for release. If this functionality is required, please
 | 
			
		||||
    use py2exe or contact me for my work in progress.
 | 
			
		||||
 6) The attribute sys.frozen is now set so that more recent pywin32 modules
 | 
			
		||||
    work as expected when frozen.
 | 
			
		||||
 7) Added option --include-path to FreezePython to allow overriding of
 | 
			
		||||
    sys.path without modifying the environment variable PYTHONPATH.
 | 
			
		||||
 8) Added option --target-dir/--install-dir to specify the directory in which
 | 
			
		||||
    the frozen executable and its dependencies will be placed.
 | 
			
		||||
 9) Removed the option --shared-lib since it was used for building shared
 | 
			
		||||
    libraries and can be managed with the initscript SharedLib.py.
 | 
			
		||||
10) MakeFrozenBases.py now checks the platform specific include directory as
 | 
			
		||||
    requested by Michael Partridge.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Changes from 2.1 to 2.2
 | 
			
		||||
 1) Add option (--ext-list-file) to FreezePython to write the list of
 | 
			
		||||
    extensions copied to the installation directory to a file. This option is
 | 
			
		||||
    useful in cases where multiple builds are performed into the same
 | 
			
		||||
    installation directory.
 | 
			
		||||
 2) Pass the arguments on the command line through to Win32 GUI applications.
 | 
			
		||||
    Thanks to Michael Porter for pointing this out.
 | 
			
		||||
 3) Link directly against the python DLL when building the frozen bases on
 | 
			
		||||
    Windows, thus eliminating the need for building an import library.
 | 
			
		||||
 4) Force sys.path to include the directory in which the script to be frozen
 | 
			
		||||
    is found.
 | 
			
		||||
 5) Make sure that the installation directory exists before attempting to
 | 
			
		||||
    copy the target binary into it.
 | 
			
		||||
 6) The Win32GUI base has been modified to display fatal errors in message
 | 
			
		||||
    boxes, rather than printing errors to stderr, since on Windows the
 | 
			
		||||
    standard file IO handles are all closed.
 | 
			
		||||
 | 
			
		||||
Changes from 2.0 to 2.1
 | 
			
		||||
 1) Remove dependency on Python 2.2. Thanks to Paul Moore for not only
 | 
			
		||||
    pointing it out but providing patches.
 | 
			
		||||
 2) Set up the list of frozen modules in advance, rather than doing it after
 | 
			
		||||
    Python is initialized so that implicit imports done by Python can be
 | 
			
		||||
    satisfied. The bug in Python 2.3 that demonstrated this issue has been
 | 
			
		||||
    fixed in the first release candidate. Thanks to Thomas Heller for pointing
 | 
			
		||||
    out the obvious in this instance!
 | 
			
		||||
 3) Added additional base executable (ConsoleSetLibPath) to support setting
 | 
			
		||||
    the LD_LIBRARY_PATH variable on Unix platforms and restarting the
 | 
			
		||||
    executable to put the new setting into effect. This is primarily of use
 | 
			
		||||
    in distributing wxPython applications on Unix where the shared library
 | 
			
		||||
    has an embedded RPATH value which can cause problems.
 | 
			
		||||
 4) Small improvements of documentation based on feedback from several people.
 | 
			
		||||
 5) Print information about the files written or copied during the freezing
 | 
			
		||||
    process.
 | 
			
		||||
 6) Do not copy extensions when freezing if the path is being overridden since
 | 
			
		||||
    it is expected that a full Python installation is available to the target
 | 
			
		||||
    users of the frozen binary.
 | 
			
		||||
 7) Provide meaningful error message when the wxPython library cannot be
 | 
			
		||||
    found during the freezing process.
 | 
			
		||||
 | 
			
		||||
Changes from 1.1 to 2.0
 | 
			
		||||
 1) Added support for in process (DLL) COM servers using PythonCOM.
 | 
			
		||||
 2) Ensured that the frozen flag is set prior to determining the full path for
 | 
			
		||||
    the program in order to avoid warnings about Python not being found on
 | 
			
		||||
    some platforms.
 | 
			
		||||
 3) Added include file and resource file to the source tree to avoid the
 | 
			
		||||
    dependency on the Wine message compiler for Win32 builds.
 | 
			
		||||
 4) Dropped the option --copy-extensions; this now happens automatically since
 | 
			
		||||
    the resulting binary is useless without them.
 | 
			
		||||
 5) Added a sample for building a Win32 service.
 | 
			
		||||
 6) Make use of improved modules from Python 2.3 (which function under 2.2)
 | 
			
		||||
 | 
			
		||||
Changes from 1.0 to 1.1
 | 
			
		||||
 1) Fixed import error with C extensions in packages; thanks to Thomas Heller
 | 
			
		||||
    for pointing out the solution to this problem.
 | 
			
		||||
 2) Added options to FreezePython to allow for the inclusion of modules which
 | 
			
		||||
    will not be found by the module finder (--include-modules) and the
 | 
			
		||||
    exclusion of modules which will be found by the module finder but should
 | 
			
		||||
    not be included (--exclude-modules).
 | 
			
		||||
 3) Fixed typo in README.txt.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										53
									
								
								installer/cx_Freeze/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								installer/cx_Freeze/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
Copyright © 2007-2008, Colt Engineering, Edmonton, Alberta, Canada.
 | 
			
		||||
Copyright © 2001-2006, Computronix (Canada) Ltd., Edmonton, Alberta, Canada.
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
NOTE: this license is derived from the Python Software Foundation License
 | 
			
		||||
which can be found at http://www.python.org/psf/license
 | 
			
		||||
 | 
			
		||||
License for cx_Freeze 4.0.1
 | 
			
		||||
---------------------------
 | 
			
		||||
 | 
			
		||||
1. This LICENSE AGREEMENT is between the copyright holders and the Individual
 | 
			
		||||
   or Organization ("Licensee") accessing and otherwise using cx_Freeze
 | 
			
		||||
   software in source or binary form and its associated documentation.
 | 
			
		||||
 | 
			
		||||
2. Subject to the terms and conditions of this License Agreement, the
 | 
			
		||||
   copyright holders hereby grant Licensee a nonexclusive, royalty-free,
 | 
			
		||||
   world-wide license to reproduce, analyze, test, perform and/or display
 | 
			
		||||
   publicly, prepare derivative works, distribute, and otherwise use cx_Freeze
 | 
			
		||||
   alone or in any derivative version, provided, however, that this License
 | 
			
		||||
   Agreement and this notice of copyright are retained in cx_Freeze alone or in
 | 
			
		||||
   any derivative version prepared by Licensee.
 | 
			
		||||
 | 
			
		||||
3. In the event Licensee prepares a derivative work that is based on or
 | 
			
		||||
   incorporates cx_Freeze or any part thereof, and wants to make the derivative
 | 
			
		||||
   work available to others as provided herein, then Licensee hereby agrees to
 | 
			
		||||
   include in any such work a brief summary of the changes made to cx_Freeze.
 | 
			
		||||
 | 
			
		||||
4. The copyright holders are making cx_Freeze available to Licensee on an
 | 
			
		||||
   "AS IS" basis.  THE COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES,
 | 
			
		||||
   EXPRESS OR IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, THE COPYRIGHT
 | 
			
		||||
   HOLDERS MAKE NO AND DISCLAIM ANY REPRESENTATION OR WARRANTY OF
 | 
			
		||||
   MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
 | 
			
		||||
   CX_FREEZE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
 | 
			
		||||
 | 
			
		||||
5. THE COPYRIGHT HOLDERS SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF
 | 
			
		||||
   CX_FREEZE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
 | 
			
		||||
   A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING CX_FREEZE, OR ANY
 | 
			
		||||
   DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
 | 
			
		||||
 | 
			
		||||
6. This License Agreement will automatically terminate upon a material breach
 | 
			
		||||
   of its terms and conditions.
 | 
			
		||||
 | 
			
		||||
7. Nothing in this License Agreement shall be deemed to create any relationship
 | 
			
		||||
   of agency, partnership, or joint venture between the copyright holders and
 | 
			
		||||
   Licensee.  This License Agreement does not grant permission to use
 | 
			
		||||
   copyright holder's trademarks or trade name in a trademark sense to endorse
 | 
			
		||||
   or promote products or services of Licensee, or any third party.
 | 
			
		||||
 | 
			
		||||
8. By copying, installing or otherwise using cx_Freeze, Licensee agrees to be
 | 
			
		||||
   bound by the terms and conditions of this License Agreement.
 | 
			
		||||
 | 
			
		||||
Computronix® is a registered trademark of Computronix (Canada) Ltd.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								installer/cx_Freeze/MANIFEST.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								installer/cx_Freeze/MANIFEST.in
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
include MANIFEST.in
 | 
			
		||||
include *.txt
 | 
			
		||||
recursive-include doc *.html
 | 
			
		||||
recursive-include initscripts *.py
 | 
			
		||||
recursive-include samples *.py
 | 
			
		||||
recursive-include source *.c *.rc
 | 
			
		||||
							
								
								
									
										22
									
								
								installer/cx_Freeze/PKG-INFO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								installer/cx_Freeze/PKG-INFO
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
Metadata-Version: 1.0
 | 
			
		||||
Name: cx_Freeze
 | 
			
		||||
Version: 4.0.1
 | 
			
		||||
Summary: create standalone executables from Python scripts
 | 
			
		||||
Home-page: http://cx-freeze.sourceforge.net
 | 
			
		||||
Author: Anthony Tuininga
 | 
			
		||||
Author-email: anthony.tuininga@gmail.com
 | 
			
		||||
License: Python Software Foundation License
 | 
			
		||||
Description: create standalone executables from Python scripts
 | 
			
		||||
Keywords: freeze
 | 
			
		||||
Platform: UNKNOWN
 | 
			
		||||
Classifier: Development Status :: 5 - Production/Stable
 | 
			
		||||
Classifier: Intended Audience :: Developers
 | 
			
		||||
Classifier: License :: OSI Approved :: Python Software Foundation License
 | 
			
		||||
Classifier: Natural Language :: English
 | 
			
		||||
Classifier: Operating System :: OS Independent
 | 
			
		||||
Classifier: Programming Language :: C
 | 
			
		||||
Classifier: Programming Language :: Python
 | 
			
		||||
Classifier: Topic :: Software Development :: Build Tools
 | 
			
		||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
 | 
			
		||||
Classifier: Topic :: System :: Software Distribution
 | 
			
		||||
Classifier: Topic :: Utilities
 | 
			
		||||
							
								
								
									
										12
									
								
								installer/cx_Freeze/README.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								installer/cx_Freeze/README.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
Please see cx_Freeze.html for documentation on how to use cx_Freeze.
 | 
			
		||||
 | 
			
		||||
To build:
 | 
			
		||||
 | 
			
		||||
python setup.py build
 | 
			
		||||
python setup.py install
 | 
			
		||||
 | 
			
		||||
On Windows I have used the MinGW compiler (http://www.mingw.org)
 | 
			
		||||
 | 
			
		||||
python setup.py build --compiler=mingw32
 | 
			
		||||
python setup.py build --compiler=mingw32 install
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								installer/cx_Freeze/cx_Freeze/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								installer/cx_Freeze/cx_Freeze/__init__.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
version = "4.0.1"
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
from dist import *
 | 
			
		||||
if sys.platform == "win32" and sys.version_info[:2] >= (2, 5):
 | 
			
		||||
    from windist import *
 | 
			
		||||
from finder import *
 | 
			
		||||
from freezer import *
 | 
			
		||||
from main import *
 | 
			
		||||
 | 
			
		||||
del dist
 | 
			
		||||
del finder
 | 
			
		||||
del freezer
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										279
									
								
								installer/cx_Freeze/cx_Freeze/dist.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										279
									
								
								installer/cx_Freeze/cx_Freeze/dist.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,279 @@
 | 
			
		||||
import distutils.command.bdist_rpm
 | 
			
		||||
import distutils.command.build
 | 
			
		||||
import distutils.command.install
 | 
			
		||||
import distutils.core
 | 
			
		||||
import distutils.dir_util
 | 
			
		||||
import distutils.dist
 | 
			
		||||
import distutils.util
 | 
			
		||||
import distutils.version
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
import cx_Freeze
 | 
			
		||||
 | 
			
		||||
__all__ = [ "bdist_rpm", "build", "build_exe", "install", "install_exe",
 | 
			
		||||
            "setup" ]
 | 
			
		||||
 | 
			
		||||
class Distribution(distutils.dist.Distribution):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, attrs):
 | 
			
		||||
        self.executables = []
 | 
			
		||||
        distutils.dist.Distribution.__init__(self, attrs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class bdist_rpm(distutils.command.bdist_rpm.bdist_rpm):
 | 
			
		||||
 | 
			
		||||
    def finalize_options(self):
 | 
			
		||||
        distutils.command.bdist_rpm.bdist_rpm.finalize_options(self)
 | 
			
		||||
        self.use_rpm_opt_flags = 1
 | 
			
		||||
 | 
			
		||||
    def _make_spec_file(self):
 | 
			
		||||
        contents = distutils.command.bdist_rpm.bdist_rpm._make_spec_file(self)
 | 
			
		||||
        return [c for c in contents if c != 'BuildArch: noarch']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class build(distutils.command.build.build):
 | 
			
		||||
    user_options = distutils.command.build.build.user_options + [
 | 
			
		||||
        ('build-exe=', None, 'build directory for executables')
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    def get_sub_commands(self):
 | 
			
		||||
        subCommands = distutils.command.build.build.get_sub_commands(self)
 | 
			
		||||
        if self.distribution.executables:
 | 
			
		||||
            subCommands.append("build_exe")
 | 
			
		||||
        return subCommands
 | 
			
		||||
 | 
			
		||||
    def initialize_options(self):
 | 
			
		||||
        distutils.command.build.build.initialize_options(self)
 | 
			
		||||
        self.build_exe = None
 | 
			
		||||
 | 
			
		||||
    def finalize_options(self):
 | 
			
		||||
        distutils.command.build.build.finalize_options(self)
 | 
			
		||||
        if self.build_exe is None:
 | 
			
		||||
            dirName = "exe.%s-%s" % \
 | 
			
		||||
                    (distutils.util.get_platform(), sys.version[0:3])
 | 
			
		||||
            self.build_exe = os.path.join(self.build_base, dirName)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class build_exe(distutils.core.Command):
 | 
			
		||||
    description = "build executables from Python scripts"
 | 
			
		||||
    user_options = [
 | 
			
		||||
        ('build-exe=', 'b',
 | 
			
		||||
         'directory for built executables'),
 | 
			
		||||
        ('optimize=', 'O',
 | 
			
		||||
         'optimization level: -O1 for "python -O", '
 | 
			
		||||
         '-O2 for "python -OO" and -O0 to disable [default: -O0]'),
 | 
			
		||||
        ('excludes=', 'e',
 | 
			
		||||
         'comma-separated list of modules to exclude'),
 | 
			
		||||
        ('includes=', 'i',
 | 
			
		||||
         'comma-separated list of modules to include'),
 | 
			
		||||
        ('packages=', 'p',
 | 
			
		||||
         'comma-separated list of packages to include'),
 | 
			
		||||
        ('replace-paths=', None,
 | 
			
		||||
         'comma-separated list of paths to replace in included modules'),
 | 
			
		||||
        ('path=', None,
 | 
			
		||||
         'comma-separated list of paths to search'),
 | 
			
		||||
        ('init-script=', 'i',
 | 
			
		||||
         'name of script to use during initialization'),
 | 
			
		||||
        ('base=', None,
 | 
			
		||||
         'name of base executable to use'),
 | 
			
		||||
        ('compressed', 'c',
 | 
			
		||||
         'create a compressed zipfile'),
 | 
			
		||||
        ('copy-dependent-files', None,
 | 
			
		||||
         'copy all dependent files'),
 | 
			
		||||
        ('create-shared-zip', None,
 | 
			
		||||
         'create a shared zip file containing shared modules'),
 | 
			
		||||
        ('append-script-to-exe', None,
 | 
			
		||||
         'append the script module to the exe'),
 | 
			
		||||
        ('include-in-shared-zip', None,
 | 
			
		||||
         'include the script module in the shared zip file'),
 | 
			
		||||
        ('icon', None,
 | 
			
		||||
         'include the icon along with the frozen executable(s)'),
 | 
			
		||||
        ('constants=', None,
 | 
			
		||||
         'comma-separated list of constants to include'),
 | 
			
		||||
        ('include-files=', 'f',
 | 
			
		||||
         'list of tuples of additional files to include in distribution'),
 | 
			
		||||
        ('bin-includes', None,
 | 
			
		||||
         'list of names of files to include when determining dependencies'),
 | 
			
		||||
        ('bin-excludes', None,
 | 
			
		||||
         'list of names of files to exclude when determining dependencies')
 | 
			
		||||
    ]
 | 
			
		||||
    boolean_options = ["compressed", "copy_dependent_files",
 | 
			
		||||
            "create_shared_zip", "append_script_to_exe",
 | 
			
		||||
            "include_in_shared_zip"]
 | 
			
		||||
 | 
			
		||||
    def _normalize(self, attrName):
 | 
			
		||||
        value = getattr(self, attrName)
 | 
			
		||||
        if value is None:
 | 
			
		||||
            normalizedValue = []
 | 
			
		||||
        elif isinstance(value, basestring):
 | 
			
		||||
            normalizedValue = value.split()
 | 
			
		||||
        else:
 | 
			
		||||
            normalizedValue = list(value)
 | 
			
		||||
        setattr(self, attrName, normalizedValue)
 | 
			
		||||
 | 
			
		||||
    def initialize_options(self):
 | 
			
		||||
        self.optimize = 0
 | 
			
		||||
        self.build_exe = None
 | 
			
		||||
        self.excludes = []
 | 
			
		||||
        self.includes = []
 | 
			
		||||
        self.packages = []
 | 
			
		||||
        self.replace_paths = []
 | 
			
		||||
        self.compressed = None
 | 
			
		||||
        self.copy_dependent_files = None
 | 
			
		||||
        self.init_script = None
 | 
			
		||||
        self.base = None
 | 
			
		||||
        self.path = None
 | 
			
		||||
        self.create_shared_zip = None
 | 
			
		||||
        self.append_script_to_exe = None
 | 
			
		||||
        self.include_in_shared_zip = None
 | 
			
		||||
        self.icon = None
 | 
			
		||||
        self.constants = []
 | 
			
		||||
        self.include_files = []
 | 
			
		||||
        self.bin_excludes = []
 | 
			
		||||
        self.bin_includes = []
 | 
			
		||||
 | 
			
		||||
    def finalize_options(self):
 | 
			
		||||
        self.set_undefined_options('build', ('build_exe', 'build_exe'))
 | 
			
		||||
        self.optimize = int(self.optimize)
 | 
			
		||||
        self._normalize("excludes")
 | 
			
		||||
        self._normalize("includes")
 | 
			
		||||
        self._normalize("packages")
 | 
			
		||||
        self._normalize("constants")
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        metadata = self.distribution.metadata
 | 
			
		||||
        constantsModule = cx_Freeze.ConstantsModule(metadata.version)
 | 
			
		||||
        for constant in self.constants:
 | 
			
		||||
            parts = constant.split("=")
 | 
			
		||||
            if len(parts) == 1:
 | 
			
		||||
                name = constant
 | 
			
		||||
                value = None
 | 
			
		||||
            else:
 | 
			
		||||
                name, stringValue = parts
 | 
			
		||||
                value = eval(stringValue)
 | 
			
		||||
            constantsModule.values[name] = value
 | 
			
		||||
        freezer = cx_Freeze.Freezer(self.distribution.executables,
 | 
			
		||||
                [constantsModule], self.includes, self.excludes, self.packages,
 | 
			
		||||
                self.replace_paths, self.compressed, self.optimize,
 | 
			
		||||
                self.copy_dependent_files, self.init_script, self.base,
 | 
			
		||||
                self.path, self.create_shared_zip, self.append_script_to_exe,
 | 
			
		||||
                self.include_in_shared_zip, self.build_exe, icon = self.icon,
 | 
			
		||||
                includeFiles = self.include_files,
 | 
			
		||||
                binIncludes = self.bin_includes,
 | 
			
		||||
                binExcludes = self.bin_excludes)
 | 
			
		||||
        freezer.Freeze()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class install(distutils.command.install.install):
 | 
			
		||||
    user_options = distutils.command.install.install.user_options + [
 | 
			
		||||
            ('install-exe=', None,
 | 
			
		||||
             'installation directory for executables')
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    def expand_dirs(self):
 | 
			
		||||
        distutils.command.install.install.expand_dirs(self)
 | 
			
		||||
        self._expand_attrs(['install_exe'])
 | 
			
		||||
 | 
			
		||||
    def get_sub_commands(self):
 | 
			
		||||
        subCommands = distutils.command.install.install.get_sub_commands(self)
 | 
			
		||||
        if self.distribution.executables:
 | 
			
		||||
            subCommands.append("install_exe")
 | 
			
		||||
        return [s for s in subCommands if s != "install_egg_info"]
 | 
			
		||||
 | 
			
		||||
    def initialize_options(self):
 | 
			
		||||
        distutils.command.install.install.initialize_options(self)
 | 
			
		||||
        self.install_exe = None
 | 
			
		||||
 | 
			
		||||
    def finalize_options(self):
 | 
			
		||||
        if self.prefix is None and sys.platform == "win32":
 | 
			
		||||
            import _winreg
 | 
			
		||||
            key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
 | 
			
		||||
                    r"Software\Microsoft\Windows\CurrentVersion")
 | 
			
		||||
            prefix = str(_winreg.QueryValueEx(key, "ProgramFilesDir")[0])
 | 
			
		||||
            metadata = self.distribution.metadata
 | 
			
		||||
            dirName = "%s-%s" % (metadata.name, metadata.version)
 | 
			
		||||
            self.prefix = "%s/%s" % (prefix, dirName)
 | 
			
		||||
        distutils.command.install.install.finalize_options(self)
 | 
			
		||||
        self.convert_paths('exe')
 | 
			
		||||
        if self.root is not None:
 | 
			
		||||
            self.change_roots('exe')
 | 
			
		||||
 | 
			
		||||
    def select_scheme(self, name):
 | 
			
		||||
        distutils.command.install.install.select_scheme(self, name)
 | 
			
		||||
        if self.install_exe is None:
 | 
			
		||||
            if sys.platform == "win32":
 | 
			
		||||
                self.install_exe = '$base'
 | 
			
		||||
            else:
 | 
			
		||||
                metadata = self.distribution.metadata
 | 
			
		||||
                dirName = "%s-%s" % (metadata.name, metadata.version)
 | 
			
		||||
                self.install_exe = '$base/lib/%s' % dirName
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class install_exe(distutils.core.Command):
 | 
			
		||||
    description = "install executables built from Python scripts"
 | 
			
		||||
    user_options = [
 | 
			
		||||
        ('install-dir=', 'd', 'directory to install executables to'),
 | 
			
		||||
        ('build-dir=', 'b', 'build directory (where to install from)'),
 | 
			
		||||
        ('force', 'f', 'force installation (overwrite existing files)'),
 | 
			
		||||
        ('skip-build', None, 'skip the build steps')
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    def initialize_options(self):
 | 
			
		||||
        self.install_dir = None
 | 
			
		||||
        self.force = 0
 | 
			
		||||
        self.build_dir = None
 | 
			
		||||
        self.skip_build = None
 | 
			
		||||
 | 
			
		||||
    def finalize_options(self):
 | 
			
		||||
        self.set_undefined_options('build', ('build_exe', 'build_dir'))
 | 
			
		||||
        self.set_undefined_options('install',
 | 
			
		||||
                ('install_exe', 'install_dir'),
 | 
			
		||||
                ('force', 'force'),
 | 
			
		||||
                ('skip_build', 'skip_build'))
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        if not self.skip_build:
 | 
			
		||||
            self.run_command('build_exe')
 | 
			
		||||
        self.outfiles = self.copy_tree(self.build_dir, self.install_dir)
 | 
			
		||||
        if sys.platform != "win32":
 | 
			
		||||
            baseDir = os.path.dirname(os.path.dirname(self.install_dir))
 | 
			
		||||
            binDir = os.path.join(baseDir, "bin")
 | 
			
		||||
            if not os.path.exists(binDir):
 | 
			
		||||
                os.makedirs(binDir)
 | 
			
		||||
            sourceDir = os.path.join("..", self.install_dir[len(baseDir) + 1:])
 | 
			
		||||
            for executable in self.distribution.executables:
 | 
			
		||||
                name = os.path.basename(executable.targetName)
 | 
			
		||||
                source = os.path.join(sourceDir, name)
 | 
			
		||||
                target = os.path.join(binDir, name)
 | 
			
		||||
                if os.path.exists(target):
 | 
			
		||||
                    os.unlink(target)
 | 
			
		||||
                os.symlink(source, target)
 | 
			
		||||
                self.outfiles.append(target)
 | 
			
		||||
 | 
			
		||||
    def get_inputs(self):
 | 
			
		||||
        return self.distribution.executables or []
 | 
			
		||||
 | 
			
		||||
    def get_outputs(self):
 | 
			
		||||
        return self.outfiles or []
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _AddCommandClass(commandClasses, name, cls):
 | 
			
		||||
    if name not in commandClasses:
 | 
			
		||||
        commandClasses[name] = cls
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def setup(**attrs):
 | 
			
		||||
    attrs["distclass"] = Distribution
 | 
			
		||||
    commandClasses = attrs.setdefault("cmdclass", {})
 | 
			
		||||
    if sys.platform == "win32":
 | 
			
		||||
        if sys.version_info[:2] >= (2, 5):
 | 
			
		||||
            _AddCommandClass(commandClasses, "bdist_msi", cx_Freeze.bdist_msi)
 | 
			
		||||
    else:
 | 
			
		||||
        _AddCommandClass(commandClasses, "bdist_rpm", cx_Freeze.bdist_rpm)
 | 
			
		||||
    _AddCommandClass(commandClasses, "build", build)
 | 
			
		||||
    _AddCommandClass(commandClasses, "build_exe", build_exe)
 | 
			
		||||
    _AddCommandClass(commandClasses, "install", install)
 | 
			
		||||
    _AddCommandClass(commandClasses, "install_exe", install_exe)
 | 
			
		||||
    distutils.core.setup(**attrs)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										455
									
								
								installer/cx_Freeze/cx_Freeze/finder.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										455
									
								
								installer/cx_Freeze/cx_Freeze/finder.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,455 @@
 | 
			
		||||
"""
 | 
			
		||||
Base class for finding modules.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import dis
 | 
			
		||||
import imp
 | 
			
		||||
import marshal
 | 
			
		||||
import new
 | 
			
		||||
import opcode
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import zipfile
 | 
			
		||||
 | 
			
		||||
import cx_Freeze.hooks
 | 
			
		||||
 | 
			
		||||
BUILD_LIST = opcode.opmap["BUILD_LIST"]
 | 
			
		||||
INPLACE_ADD = opcode.opmap["INPLACE_ADD"]
 | 
			
		||||
LOAD_CONST = opcode.opmap["LOAD_CONST"]
 | 
			
		||||
IMPORT_NAME = opcode.opmap["IMPORT_NAME"]
 | 
			
		||||
IMPORT_FROM = opcode.opmap["IMPORT_FROM"]
 | 
			
		||||
STORE_NAME = opcode.opmap["STORE_NAME"]
 | 
			
		||||
STORE_GLOBAL = opcode.opmap["STORE_GLOBAL"]
 | 
			
		||||
STORE_OPS = (STORE_NAME, STORE_GLOBAL)
 | 
			
		||||
 | 
			
		||||
__all__ = [ "Module", "ModuleFinder" ]
 | 
			
		||||
 | 
			
		||||
class ModuleFinder(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, includeFiles, excludes, path, replacePaths):
 | 
			
		||||
        self.includeFiles = includeFiles
 | 
			
		||||
        self.excludes = dict.fromkeys(excludes)
 | 
			
		||||
        self.replacePaths = replacePaths
 | 
			
		||||
        self.path = path or sys.path
 | 
			
		||||
        self.modules = []
 | 
			
		||||
        self.aliases = {}
 | 
			
		||||
        self._modules = dict.fromkeys(excludes)
 | 
			
		||||
        self._builtinModules = dict.fromkeys(sys.builtin_module_names)
 | 
			
		||||
        self._badModules = {}
 | 
			
		||||
        self._zipFileEntries = {}
 | 
			
		||||
        self._zipFiles = {}
 | 
			
		||||
        cx_Freeze.hooks.initialize(self)
 | 
			
		||||
 | 
			
		||||
    def _AddModule(self, name):
 | 
			
		||||
        """Add a module to the list of modules but if one is already found,
 | 
			
		||||
           then return it instead; this is done so that packages can be
 | 
			
		||||
           handled properly."""
 | 
			
		||||
        module = self._modules.get(name)
 | 
			
		||||
        if module is None:
 | 
			
		||||
            module = self._modules[name] = Module(name)
 | 
			
		||||
            self.modules.append(module)
 | 
			
		||||
            if name in self._badModules:
 | 
			
		||||
                del self._badModules[name]
 | 
			
		||||
        return module
 | 
			
		||||
 | 
			
		||||
    def _DetermineParent(self, caller):
 | 
			
		||||
        """Determine the parent to use when searching packages."""
 | 
			
		||||
        if caller is not None:
 | 
			
		||||
            if caller.path is not None:
 | 
			
		||||
                return caller
 | 
			
		||||
            return self._GetParentByName(caller.name)
 | 
			
		||||
 | 
			
		||||
    def _EnsureFromList(self, caller, packageModule, fromList,
 | 
			
		||||
            deferredImports):
 | 
			
		||||
        """Ensure that the from list is satisfied. This is only necessary for
 | 
			
		||||
           package modules. If the caller is the package itself, actually
 | 
			
		||||
           attempt to import right then since it must be a submodule; otherwise
 | 
			
		||||
           defer until after all global names are defined in order to avoid
 | 
			
		||||
           spurious complaints about missing modules."""
 | 
			
		||||
        if caller is not packageModule:
 | 
			
		||||
            deferredImports.append((packageModule, fromList))
 | 
			
		||||
        else:
 | 
			
		||||
            if fromList == ("*",):
 | 
			
		||||
                fromList = packageModule.allNames
 | 
			
		||||
            for name in fromList:
 | 
			
		||||
                if name in packageModule.globalNames:
 | 
			
		||||
                    continue
 | 
			
		||||
                subModuleName = "%s.%s" % (packageModule.name, name)
 | 
			
		||||
                self._ImportModule(subModuleName, deferredImports, caller)
 | 
			
		||||
 | 
			
		||||
    def _FindModule(self, name, path):
 | 
			
		||||
        try:
 | 
			
		||||
            return imp.find_module(name, path)
 | 
			
		||||
        except ImportError:
 | 
			
		||||
            if not path:
 | 
			
		||||
                path = []
 | 
			
		||||
            for location in path:
 | 
			
		||||
                if name in self._zipFileEntries:
 | 
			
		||||
                    break
 | 
			
		||||
                if location in self._zipFiles:
 | 
			
		||||
                    continue
 | 
			
		||||
                if os.path.isdir(location) or not zipfile.is_zipfile(location):
 | 
			
		||||
                    self._zipFiles[location] = None
 | 
			
		||||
                    continue
 | 
			
		||||
                zip = zipfile.ZipFile(location)
 | 
			
		||||
                for archiveName in zip.namelist():
 | 
			
		||||
                    baseName, ext = os.path.splitext(archiveName)
 | 
			
		||||
                    if ext not in ('.pyc', '.pyo'):
 | 
			
		||||
                        continue
 | 
			
		||||
                    moduleName = ".".join(baseName.split("/"))
 | 
			
		||||
                    if moduleName in self._zipFileEntries:
 | 
			
		||||
                        continue
 | 
			
		||||
                    self._zipFileEntries[moduleName] = (zip, archiveName)
 | 
			
		||||
                self._zipFiles[location] = None
 | 
			
		||||
            info = self._zipFileEntries.get(name)
 | 
			
		||||
            if info is not None:
 | 
			
		||||
                zip, archiveName = info
 | 
			
		||||
                fp = zip.read(archiveName)
 | 
			
		||||
                info = (".pyc", "rb", imp.PY_COMPILED)
 | 
			
		||||
                return fp, os.path.join(zip.filename, archiveName), info
 | 
			
		||||
            raise
 | 
			
		||||
 | 
			
		||||
    def _GetParentByName(self, name):
 | 
			
		||||
        """Return the parent module given the name of a module."""
 | 
			
		||||
        pos = name.rfind(".")
 | 
			
		||||
        if pos > 0:
 | 
			
		||||
            parentName = name[:pos]
 | 
			
		||||
            return self._modules[parentName]
 | 
			
		||||
 | 
			
		||||
    def _ImportAllSubModules(self, module, deferredImports, recursive = True):
 | 
			
		||||
        """Import all sub modules to the given package."""
 | 
			
		||||
        suffixes = dict.fromkeys([s[0] for s in imp.get_suffixes()])
 | 
			
		||||
        for dir in module.path:
 | 
			
		||||
            try:
 | 
			
		||||
                fileNames = os.listdir(dir)
 | 
			
		||||
            except os.error:
 | 
			
		||||
                continue
 | 
			
		||||
            for fileName in fileNames:
 | 
			
		||||
                name, ext = os.path.splitext(fileName)
 | 
			
		||||
                if ext not in suffixes:
 | 
			
		||||
                    continue
 | 
			
		||||
                if name == "__init__":
 | 
			
		||||
                    continue
 | 
			
		||||
                subModuleName = "%s.%s" % (module.name, name)
 | 
			
		||||
                subModule, returnError = \
 | 
			
		||||
                        self._InternalImportModule(subModuleName,
 | 
			
		||||
                                deferredImports)
 | 
			
		||||
                if returnError and subModule is None:
 | 
			
		||||
                    raise ImportError, "No module named %s" % subModuleName
 | 
			
		||||
                module.globalNames[name] = None
 | 
			
		||||
                if subModule.path and recursive:
 | 
			
		||||
                    self._ImportAllSubModules(subModule, deferredImports,
 | 
			
		||||
                            recursive)
 | 
			
		||||
 | 
			
		||||
    def _ImportDeferredImports(self, deferredImports):
 | 
			
		||||
        """Import any sub modules that were deferred, if applicable."""
 | 
			
		||||
        while deferredImports:
 | 
			
		||||
            newDeferredImports = []
 | 
			
		||||
            for packageModule, subModuleNames in deferredImports:
 | 
			
		||||
                self._EnsureFromList(packageModule, packageModule,
 | 
			
		||||
                        subModuleNames, newDeferredImports)
 | 
			
		||||
            deferredImports = newDeferredImports
 | 
			
		||||
 | 
			
		||||
    def _ImportModule(self, name, deferredImports, caller = None,
 | 
			
		||||
            relativeImportIndex = 0):
 | 
			
		||||
        """Attempt to find the named module and return it or None if no module
 | 
			
		||||
           by that name could be found."""
 | 
			
		||||
 | 
			
		||||
        # absolute import (available in Python 2.5 and up)
 | 
			
		||||
        # the name given is the only name that will be searched
 | 
			
		||||
        if relativeImportIndex == 0:
 | 
			
		||||
            module, returnError = self._InternalImportModule(name,
 | 
			
		||||
                    deferredImports)
 | 
			
		||||
 | 
			
		||||
        # old style relative import (only possibility in Python 2.4 and prior)
 | 
			
		||||
        # the name given is tried in all parents until a match is found and if
 | 
			
		||||
        # no match is found, the global namespace is searched
 | 
			
		||||
        elif relativeImportIndex < 0:
 | 
			
		||||
            parent = self._DetermineParent(caller)
 | 
			
		||||
            while parent is not None:
 | 
			
		||||
                fullName = "%s.%s" % (parent.name, name)
 | 
			
		||||
                module, returnError = self._InternalImportModule(fullName,
 | 
			
		||||
                        deferredImports)
 | 
			
		||||
                if module is not None:
 | 
			
		||||
                    parent.globalNames[name] = None
 | 
			
		||||
                    return module
 | 
			
		||||
                parent = self._GetParentByName(parent.name)
 | 
			
		||||
            module, returnError = self._InternalImportModule(name,
 | 
			
		||||
                    deferredImports)
 | 
			
		||||
 | 
			
		||||
        # new style relative import (available in Python 2.5 and up)
 | 
			
		||||
        # the index indicates how many levels to traverse and only that level
 | 
			
		||||
        # is searched for the named module
 | 
			
		||||
        elif relativeImportIndex > 0:
 | 
			
		||||
            parent = caller
 | 
			
		||||
            if parent.path is not None:
 | 
			
		||||
                relativeImportIndex -= 1
 | 
			
		||||
            while parent is not None and relativeImportIndex > 0:
 | 
			
		||||
                parent = self._GetParentByName(parent.name)
 | 
			
		||||
                relativeImportIndex -= 1
 | 
			
		||||
            if parent is None:
 | 
			
		||||
                module = None
 | 
			
		||||
                returnError = True
 | 
			
		||||
            elif not name:
 | 
			
		||||
                module = parent
 | 
			
		||||
            else:
 | 
			
		||||
                name = "%s.%s" % (parent.name, name)
 | 
			
		||||
                module, returnError = self._InternalImportModule(name,
 | 
			
		||||
                        deferredImports)
 | 
			
		||||
 | 
			
		||||
        # if module not found, track that fact
 | 
			
		||||
        if module is None:
 | 
			
		||||
            if caller is None:
 | 
			
		||||
                raise ImportError, "No module named %s" % name
 | 
			
		||||
            self._RunHook("missing", name, caller)
 | 
			
		||||
            if returnError and name not in caller.ignoreNames:
 | 
			
		||||
                callers = self._badModules.setdefault(name, {})
 | 
			
		||||
                callers[caller.name] = None
 | 
			
		||||
 | 
			
		||||
        return module
 | 
			
		||||
 | 
			
		||||
    def _InternalImportModule(self, name, deferredImports):
 | 
			
		||||
        """Internal method used for importing a module which assumes that the
 | 
			
		||||
           name given is an absolute name. None is returned if the module
 | 
			
		||||
           cannot be found."""
 | 
			
		||||
        try:
 | 
			
		||||
            return self._modules[name], False
 | 
			
		||||
        except KeyError:
 | 
			
		||||
            pass
 | 
			
		||||
        if name in self._builtinModules:
 | 
			
		||||
            module = self._AddModule(name)
 | 
			
		||||
            self._RunHook("load", module.name, module)
 | 
			
		||||
            return module, False
 | 
			
		||||
        pos = name.rfind(".")
 | 
			
		||||
        if pos < 0:
 | 
			
		||||
            path = self.path
 | 
			
		||||
            searchName = name
 | 
			
		||||
            parentModule = None
 | 
			
		||||
        else:
 | 
			
		||||
            parentName = name[:pos]
 | 
			
		||||
            parentModule, returnError = \
 | 
			
		||||
                    self._InternalImportModule(parentName, deferredImports)
 | 
			
		||||
            if parentModule is None:
 | 
			
		||||
                return None, returnError
 | 
			
		||||
            path = parentModule.path
 | 
			
		||||
            searchName = name[pos + 1:]
 | 
			
		||||
        if name in self.aliases:
 | 
			
		||||
            actualName = self.aliases[name]
 | 
			
		||||
            module, returnError = \
 | 
			
		||||
                    self._InternalImportModule(actualName, deferredImports)
 | 
			
		||||
            self._modules[name] = module
 | 
			
		||||
            return module, returnError
 | 
			
		||||
        try:
 | 
			
		||||
            fp, path, info = self._FindModule(searchName, path)
 | 
			
		||||
        except ImportError:
 | 
			
		||||
            self._modules[name] = None
 | 
			
		||||
            return None, True
 | 
			
		||||
        module = self._LoadModule(name, fp, path, info, deferredImports,
 | 
			
		||||
                parentModule)
 | 
			
		||||
        return module, False
 | 
			
		||||
 | 
			
		||||
    def _LoadModule(self, name, fp, path, info, deferredImports,
 | 
			
		||||
            parent = None):
 | 
			
		||||
        """Load the module, given the information acquired by the finder."""
 | 
			
		||||
        suffix, mode, type = info
 | 
			
		||||
        if type == imp.PKG_DIRECTORY:
 | 
			
		||||
            return self._LoadPackage(name, path, parent, deferredImports)
 | 
			
		||||
        module = self._AddModule(name)
 | 
			
		||||
        module.file = path
 | 
			
		||||
        module.parent = parent
 | 
			
		||||
        if type == imp.PY_SOURCE:
 | 
			
		||||
            module.code = compile(fp.read() + "\n", path, "exec")
 | 
			
		||||
        elif type == imp.PY_COMPILED:
 | 
			
		||||
            if isinstance(fp, str):
 | 
			
		||||
                magic = fp[:4]
 | 
			
		||||
            else:
 | 
			
		||||
                magic = fp.read(4)
 | 
			
		||||
            if magic != imp.get_magic():
 | 
			
		||||
                raise ImportError, "Bad magic number in %s" % path
 | 
			
		||||
            if isinstance(fp, str):
 | 
			
		||||
                module.code = marshal.loads(fp[8:])
 | 
			
		||||
                module.inZipFile = True
 | 
			
		||||
            else:
 | 
			
		||||
                fp.read(4)
 | 
			
		||||
                module.code = marshal.load(fp)
 | 
			
		||||
        self._RunHook("load", module.name, module)
 | 
			
		||||
        if module.code is not None:
 | 
			
		||||
            if self.replacePaths:
 | 
			
		||||
                topLevelModule = module
 | 
			
		||||
                while topLevelModule.parent is not None:
 | 
			
		||||
                    topLevelModule = topLevelModule.parent
 | 
			
		||||
                module.code = self._ReplacePathsInCode(topLevelModule,
 | 
			
		||||
                        module.code)
 | 
			
		||||
            self._ScanCode(module.code, module, deferredImports)
 | 
			
		||||
        return module
 | 
			
		||||
 | 
			
		||||
    def _LoadPackage(self, name, path, parent, deferredImports):
 | 
			
		||||
        """Load the package, given its name and path."""
 | 
			
		||||
        module = self._AddModule(name)
 | 
			
		||||
        module.path = [path]
 | 
			
		||||
        fp, path, info = imp.find_module("__init__", module.path)
 | 
			
		||||
        self._LoadModule(name, fp, path, info, deferredImports, parent)
 | 
			
		||||
        return module
 | 
			
		||||
 | 
			
		||||
    def _ReplacePathsInCode(self, topLevelModule, co):
 | 
			
		||||
        """Replace paths in the code as directed, returning a new code object
 | 
			
		||||
           with the modified paths in place."""
 | 
			
		||||
        origFileName = newFileName = os.path.normpath(co.co_filename)
 | 
			
		||||
        for searchValue, replaceValue in self.replacePaths:
 | 
			
		||||
            if searchValue == "*":
 | 
			
		||||
                searchValue = os.path.dirname(topLevelModule.file)
 | 
			
		||||
                if topLevelModule.path:
 | 
			
		||||
                    searchValue = os.path.dirname(searchValue)
 | 
			
		||||
                if searchValue:
 | 
			
		||||
                    searchValue = searchValue + os.pathsep
 | 
			
		||||
            elif not origFileName.startswith(searchValue):
 | 
			
		||||
                continue
 | 
			
		||||
            newFileName = replaceValue + origFileName[len(searchValue):]
 | 
			
		||||
            break
 | 
			
		||||
        constants = list(co.co_consts)
 | 
			
		||||
        for i, value in enumerate(constants):
 | 
			
		||||
            if isinstance(value, type(co)):
 | 
			
		||||
                constants[i] = self._ReplacePathsInCode(topLevelModule, value)
 | 
			
		||||
        return new.code(co.co_argcount, co.co_nlocals, co.co_stacksize,
 | 
			
		||||
                co.co_flags, co.co_code, tuple(constants), co.co_names,
 | 
			
		||||
                co.co_varnames, newFileName, co.co_name, co.co_firstlineno,
 | 
			
		||||
                co.co_lnotab, co.co_freevars, co.co_cellvars)
 | 
			
		||||
 | 
			
		||||
    def _RunHook(self, hookName, moduleName, *args):
 | 
			
		||||
        """Run hook for the given module if one is present."""
 | 
			
		||||
        name = "%s_%s" % (hookName, moduleName.replace(".", "_"))
 | 
			
		||||
        method = getattr(cx_Freeze.hooks, name, None)
 | 
			
		||||
        if method is not None:
 | 
			
		||||
            method(self, *args)
 | 
			
		||||
 | 
			
		||||
    def _ScanCode(self, co, module, deferredImports):
 | 
			
		||||
        """Scan code, looking for imported modules and keeping track of the
 | 
			
		||||
           constants that have been created in order to better tell which
 | 
			
		||||
           modules are truly missing."""
 | 
			
		||||
        opIndex = 0
 | 
			
		||||
        arguments = []
 | 
			
		||||
        code = co.co_code
 | 
			
		||||
        numOps = len(code)
 | 
			
		||||
        while opIndex < numOps:
 | 
			
		||||
            op = ord(code[opIndex])
 | 
			
		||||
            opIndex += 1
 | 
			
		||||
            if op >= dis.HAVE_ARGUMENT:
 | 
			
		||||
                opArg = ord(code[opIndex]) + ord(code[opIndex + 1]) * 256
 | 
			
		||||
                opIndex += 2
 | 
			
		||||
            if op == LOAD_CONST:
 | 
			
		||||
                arguments.append(co.co_consts[opArg])
 | 
			
		||||
            elif op == IMPORT_NAME:
 | 
			
		||||
                name = co.co_names[opArg]
 | 
			
		||||
                if len(arguments) == 2:
 | 
			
		||||
                    relativeImportIndex, fromList = arguments
 | 
			
		||||
                else:
 | 
			
		||||
                    relativeImportIndex = -1
 | 
			
		||||
                    fromList, = arguments
 | 
			
		||||
                if name not in module.excludeNames:
 | 
			
		||||
                    subModule = self._ImportModule(name, deferredImports,
 | 
			
		||||
                            module, relativeImportIndex)
 | 
			
		||||
                    if subModule is not None:
 | 
			
		||||
                        module.globalNames.update(subModule.globalNames)
 | 
			
		||||
                        if fromList and subModule.path is not None:
 | 
			
		||||
                            self._EnsureFromList(module, subModule, fromList,
 | 
			
		||||
                                    deferredImports)
 | 
			
		||||
            elif op == IMPORT_FROM:
 | 
			
		||||
                opIndex += 3
 | 
			
		||||
            elif op not in (BUILD_LIST, INPLACE_ADD):
 | 
			
		||||
                if op in STORE_OPS:
 | 
			
		||||
                    name = co.co_names[opArg]
 | 
			
		||||
                    if name == "__all__":
 | 
			
		||||
                        module.allNames.extend(arguments)
 | 
			
		||||
                    module.globalNames[name] = None
 | 
			
		||||
                arguments = []
 | 
			
		||||
        for constant in co.co_consts:
 | 
			
		||||
            if isinstance(constant, type(co)):
 | 
			
		||||
                self._ScanCode(constant, module, deferredImports)
 | 
			
		||||
 | 
			
		||||
    def AddAlias(self, name, aliasFor):
 | 
			
		||||
        """Add an alias for a particular module; when an attempt is made to
 | 
			
		||||
           import a module using the alias name, import the actual name
 | 
			
		||||
           instead."""
 | 
			
		||||
        self.aliases[name] = aliasFor
 | 
			
		||||
 | 
			
		||||
    def ExcludeModule(self, name):
 | 
			
		||||
        """Exclude the named module from the resulting frozen executable."""
 | 
			
		||||
        self.excludes[name] = None
 | 
			
		||||
        self._modules[name] = None
 | 
			
		||||
 | 
			
		||||
    def IncludeFile(self, path, moduleName = None):
 | 
			
		||||
        """Include the named file as a module in the frozen executable."""
 | 
			
		||||
        name, ext = os.path.splitext(os.path.basename(path))
 | 
			
		||||
        if moduleName is None:
 | 
			
		||||
            moduleName = name
 | 
			
		||||
        info = (ext, "r", imp.PY_SOURCE)
 | 
			
		||||
        deferredImports = []
 | 
			
		||||
        module = self._LoadModule(moduleName, file(path, "U"), path, info,
 | 
			
		||||
                deferredImports)
 | 
			
		||||
        self._ImportDeferredImports(deferredImports)
 | 
			
		||||
        return module
 | 
			
		||||
 | 
			
		||||
    def IncludeFiles(self, sourcePath, targetPath):
 | 
			
		||||
        """Include the files in the given directory in the target build."""
 | 
			
		||||
        self.includeFiles.append((sourcePath, targetPath))
 | 
			
		||||
 | 
			
		||||
    def IncludeModule(self, name):
 | 
			
		||||
        """Include the named module in the frozen executable."""
 | 
			
		||||
        deferredImports = []
 | 
			
		||||
        module = self._ImportModule(name, deferredImports)
 | 
			
		||||
        self._ImportDeferredImports(deferredImports)
 | 
			
		||||
        return module
 | 
			
		||||
 | 
			
		||||
    def IncludePackage(self, name):
 | 
			
		||||
        """Include the named package and any submodules in the frozen
 | 
			
		||||
           executable."""
 | 
			
		||||
        deferredImports = []
 | 
			
		||||
        module = self._ImportModule(name, deferredImports)
 | 
			
		||||
        if module.path:
 | 
			
		||||
            self._ImportAllSubModules(module, deferredImports)
 | 
			
		||||
        self._ImportDeferredImports(deferredImports)
 | 
			
		||||
        return module
 | 
			
		||||
 | 
			
		||||
    def ReportMissingModules(self):
 | 
			
		||||
        if self._badModules:
 | 
			
		||||
            print "Missing modules:"
 | 
			
		||||
            names = self._badModules.keys()
 | 
			
		||||
            names.sort()
 | 
			
		||||
            for name in names:
 | 
			
		||||
                callers = self._badModules[name].keys()
 | 
			
		||||
                callers.sort()
 | 
			
		||||
                print "?", name, "imported from", ", ".join(callers)
 | 
			
		||||
            print
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Module(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, name):
 | 
			
		||||
        self.name = name
 | 
			
		||||
        self.file = None
 | 
			
		||||
        self.path = None
 | 
			
		||||
        self.code = None
 | 
			
		||||
        self.parent = None
 | 
			
		||||
        self.globalNames = {}
 | 
			
		||||
        self.excludeNames = {}
 | 
			
		||||
        self.ignoreNames = {}
 | 
			
		||||
        self.allNames = []
 | 
			
		||||
        self.inZipFile = False
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        parts = ["name=%s" % repr(self.name)]
 | 
			
		||||
        if self.file is not None:
 | 
			
		||||
            parts.append("file=%s" % repr(self.file))
 | 
			
		||||
        if self.path is not None:
 | 
			
		||||
            parts.append("path=%s" % repr(self.path))
 | 
			
		||||
        return "<Module %s>" % ", ".join(parts)
 | 
			
		||||
 | 
			
		||||
    def AddGlobalName(self, name):
 | 
			
		||||
        self.globalNames[name] = None
 | 
			
		||||
 | 
			
		||||
    def ExcludeName(self, name):
 | 
			
		||||
        self.excludeNames[name] = None
 | 
			
		||||
 | 
			
		||||
    def IgnoreName(self, name):
 | 
			
		||||
        self.ignoreNames[name] = None
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										550
									
								
								installer/cx_Freeze/cx_Freeze/freezer.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										550
									
								
								installer/cx_Freeze/cx_Freeze/freezer.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,550 @@
 | 
			
		||||
"""
 | 
			
		||||
Base class for freezing scripts into executables.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import datetime
 | 
			
		||||
import distutils.sysconfig
 | 
			
		||||
import imp
 | 
			
		||||
import marshal
 | 
			
		||||
import os
 | 
			
		||||
import shutil
 | 
			
		||||
import socket
 | 
			
		||||
import stat
 | 
			
		||||
import struct
 | 
			
		||||
import sys
 | 
			
		||||
import time
 | 
			
		||||
import zipfile
 | 
			
		||||
 | 
			
		||||
import cx_Freeze
 | 
			
		||||
import cx_Freeze.util
 | 
			
		||||
 | 
			
		||||
__all__ = [ "ConfigError", "ConstantsModule", "Executable", "Freezer" ]
 | 
			
		||||
 | 
			
		||||
if sys.platform == "win32":
 | 
			
		||||
    pythonDll = "python%s%s.dll" % sys.version_info[:2]
 | 
			
		||||
    GLOBAL_BIN_PATH_EXCLUDES = [cx_Freeze.util.GetSystemDir()]
 | 
			
		||||
    GLOBAL_BIN_INCLUDES = [
 | 
			
		||||
            pythonDll,
 | 
			
		||||
            "gdiplus.dll",
 | 
			
		||||
            "mfc71.dll",
 | 
			
		||||
            "msvcp71.dll",
 | 
			
		||||
            "msvcr71.dll"
 | 
			
		||||
    ]
 | 
			
		||||
    GLOBAL_BIN_EXCLUDES = [
 | 
			
		||||
            "comctl32.dll",
 | 
			
		||||
            "oci.dll",
 | 
			
		||||
            "cx_Logging.pyd"
 | 
			
		||||
    ]
 | 
			
		||||
else:
 | 
			
		||||
    extension = distutils.sysconfig.get_config_var("SO")
 | 
			
		||||
    pythonSharedLib = "libpython%s.%s%s" % \
 | 
			
		||||
            (sys.version_info[:2] + (extension,))
 | 
			
		||||
    GLOBAL_BIN_INCLUDES = [pythonSharedLib]
 | 
			
		||||
    GLOBAL_BIN_EXCLUDES = [
 | 
			
		||||
            "libclntsh.so",
 | 
			
		||||
            "libwtc9.so"
 | 
			
		||||
    ]
 | 
			
		||||
    GLOBAL_BIN_PATH_EXCLUDES = ["/lib", "/lib32", "/lib64", "/usr/lib",
 | 
			
		||||
            "/usr/lib32", "/usr/lib64"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# NOTE: the try: except: block in this code is not necessary under Python 2.4
 | 
			
		||||
# and higher and can be removed once support for Python 2.3 is no longer needed
 | 
			
		||||
EXTENSION_LOADER_SOURCE = \
 | 
			
		||||
"""
 | 
			
		||||
import imp, os, sys
 | 
			
		||||
 | 
			
		||||
found = False
 | 
			
		||||
for p in sys.path:
 | 
			
		||||
    if not os.path.isdir(p):
 | 
			
		||||
        continue
 | 
			
		||||
    f = os.path.join(p, "%s")
 | 
			
		||||
    if not os.path.exists(f):
 | 
			
		||||
        continue
 | 
			
		||||
    try:
 | 
			
		||||
        m = imp.load_dynamic(__name__, f)
 | 
			
		||||
    except ImportError:
 | 
			
		||||
        del sys.modules[__name__]
 | 
			
		||||
        raise
 | 
			
		||||
    sys.modules[__name__] = m
 | 
			
		||||
    found = True
 | 
			
		||||
    break
 | 
			
		||||
if not found:
 | 
			
		||||
    del sys.modules[__name__]
 | 
			
		||||
    raise ImportError, "No module named %%s" %% __name__
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Freezer(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, executables, constantsModules = [], includes = [],
 | 
			
		||||
            excludes = [], packages = [], replacePaths = [], compress = None,
 | 
			
		||||
            optimizeFlag = 0, copyDependentFiles = None, initScript = None,
 | 
			
		||||
            base = None, path = None, createLibraryZip = None,
 | 
			
		||||
            appendScriptToExe = None, appendScriptToLibrary = None,
 | 
			
		||||
            targetDir = None, binIncludes = [], binExcludes = [],
 | 
			
		||||
            binPathIncludes = [], binPathExcludes = [], icon = None,
 | 
			
		||||
            includeFiles = []):
 | 
			
		||||
        self.executables = executables
 | 
			
		||||
        self.constantsModules = constantsModules
 | 
			
		||||
        self.includes = includes
 | 
			
		||||
        self.excludes = excludes
 | 
			
		||||
        self.packages = packages
 | 
			
		||||
        self.replacePaths = replacePaths
 | 
			
		||||
        self.compress = compress
 | 
			
		||||
        self.optimizeFlag = optimizeFlag
 | 
			
		||||
        self.copyDependentFiles = copyDependentFiles
 | 
			
		||||
        self.initScript = initScript
 | 
			
		||||
        self.base = base
 | 
			
		||||
        self.path = path
 | 
			
		||||
        self.createLibraryZip = createLibraryZip
 | 
			
		||||
        self.appendScriptToExe = appendScriptToExe
 | 
			
		||||
        self.appendScriptToLibrary = appendScriptToLibrary
 | 
			
		||||
        self.targetDir = targetDir
 | 
			
		||||
        self.binIncludes = [os.path.normcase(n) \
 | 
			
		||||
                for n in GLOBAL_BIN_INCLUDES + binIncludes]
 | 
			
		||||
        self.binExcludes = [os.path.normcase(n) \
 | 
			
		||||
                for n in GLOBAL_BIN_EXCLUDES + binExcludes]
 | 
			
		||||
        self.binPathIncludes = [os.path.normcase(n) for n in binPathIncludes]
 | 
			
		||||
        self.binPathExcludes = [os.path.normcase(n) \
 | 
			
		||||
                for n in GLOBAL_BIN_PATH_EXCLUDES + binPathExcludes]
 | 
			
		||||
        self.icon = icon
 | 
			
		||||
        self.includeFiles = includeFiles
 | 
			
		||||
        self._VerifyConfiguration()
 | 
			
		||||
 | 
			
		||||
    def _CopyFile(self, source, target, copyDependentFiles,
 | 
			
		||||
            includeMode = False):
 | 
			
		||||
        normalizedSource = os.path.normcase(os.path.normpath(source))
 | 
			
		||||
        normalizedTarget = os.path.normcase(os.path.normpath(target))
 | 
			
		||||
        if normalizedTarget in self.filesCopied:
 | 
			
		||||
            return
 | 
			
		||||
        if normalizedSource == normalizedTarget:
 | 
			
		||||
            return
 | 
			
		||||
        self._RemoveFile(target)
 | 
			
		||||
        targetDir = os.path.dirname(target)
 | 
			
		||||
        self._CreateDirectory(targetDir)
 | 
			
		||||
        print "copying", source, "->", target
 | 
			
		||||
        shutil.copyfile(source, target)
 | 
			
		||||
        if includeMode:
 | 
			
		||||
            shutil.copymode(source, target)
 | 
			
		||||
        self.filesCopied[normalizedTarget] = None
 | 
			
		||||
        if copyDependentFiles:
 | 
			
		||||
            for source in self._GetDependentFiles(source):
 | 
			
		||||
                target = os.path.join(targetDir, os.path.basename(source))
 | 
			
		||||
                self._CopyFile(source, target, copyDependentFiles)
 | 
			
		||||
 | 
			
		||||
    def _CreateDirectory(self, path):
 | 
			
		||||
        if not os.path.isdir(path):
 | 
			
		||||
            print "creating directory", path
 | 
			
		||||
            os.makedirs(path)
 | 
			
		||||
 | 
			
		||||
    def _FreezeExecutable(self, exe):
 | 
			
		||||
        if self.createLibraryZip:
 | 
			
		||||
            finder = self.finder
 | 
			
		||||
        else:
 | 
			
		||||
            finder = self._GetModuleFinder(exe)
 | 
			
		||||
        if exe.script is None:
 | 
			
		||||
            scriptModule = None
 | 
			
		||||
        else:
 | 
			
		||||
            scriptModule = finder.IncludeFile(exe.script, exe.moduleName)
 | 
			
		||||
        self._CopyFile(exe.base, exe.targetName, exe.copyDependentFiles,
 | 
			
		||||
                includeMode = True)
 | 
			
		||||
        if exe.icon is not None:
 | 
			
		||||
            if sys.platform == "win32":
 | 
			
		||||
                cx_Freeze.util.AddIcon(exe.targetName, exe.icon)
 | 
			
		||||
            else:
 | 
			
		||||
                targetName = os.path.join(os.path.dirname(exe.targetName),
 | 
			
		||||
                        os.path.basename(exe.icon))
 | 
			
		||||
                self._CopyFile(exe.icon, targetName,
 | 
			
		||||
                        copyDependentFiles = False)
 | 
			
		||||
        if not os.access(exe.targetName, os.W_OK):
 | 
			
		||||
            mode = os.stat(exe.targetName).st_mode
 | 
			
		||||
            os.chmod(exe.targetName, mode | stat.S_IWUSR)
 | 
			
		||||
        if not exe.appendScriptToLibrary:
 | 
			
		||||
            if exe.appendScriptToExe:
 | 
			
		||||
                fileName = exe.targetName
 | 
			
		||||
            else:
 | 
			
		||||
                baseFileName, ext = os.path.splitext(exe.targetName)
 | 
			
		||||
                fileName = baseFileName + ".zip"
 | 
			
		||||
                self._RemoveFile(fileName)
 | 
			
		||||
            if not self.createLibraryZip and exe.copyDependentFiles:
 | 
			
		||||
                scriptModule = None
 | 
			
		||||
            self._WriteModules(fileName, exe.initScript, finder, exe.compress,
 | 
			
		||||
                    exe.copyDependentFiles, scriptModule)
 | 
			
		||||
 | 
			
		||||
    def _GetBaseFileName(self, argsSource = None):
 | 
			
		||||
        if argsSource is None:
 | 
			
		||||
            argsSource = self
 | 
			
		||||
        name = argsSource.base
 | 
			
		||||
        if name is None:
 | 
			
		||||
            if argsSource.copyDependentFiles:
 | 
			
		||||
                name = "Console"
 | 
			
		||||
            else:
 | 
			
		||||
                name = "ConsoleKeepPath"
 | 
			
		||||
        argsSource.base = self._GetFileName("bases", name)
 | 
			
		||||
        if argsSource.base is None:
 | 
			
		||||
            raise ConfigError("no base named %s", name)
 | 
			
		||||
 | 
			
		||||
    def _GetDependentFiles(self, path):
 | 
			
		||||
        dependentFiles = self.dependentFiles.get(path)
 | 
			
		||||
        if dependentFiles is None:
 | 
			
		||||
            if sys.platform == "win32":
 | 
			
		||||
                origPath = os.environ["PATH"]
 | 
			
		||||
                os.environ["PATH"] = origPath + os.pathsep + \
 | 
			
		||||
                        os.pathsep.join(sys.path)
 | 
			
		||||
                dependentFiles = cx_Freeze.util.GetDependentFiles(path)
 | 
			
		||||
                os.environ["PATH"] = origPath
 | 
			
		||||
            else:
 | 
			
		||||
                dependentFiles = []
 | 
			
		||||
                for line in os.popen('ldd "%s"' % path):
 | 
			
		||||
                    parts = line.strip().split(" => ")
 | 
			
		||||
                    if len(parts) != 2:
 | 
			
		||||
                        continue
 | 
			
		||||
                    dependentFile = parts[1]
 | 
			
		||||
                    if dependentFile == "not found":
 | 
			
		||||
                        print "WARNING: cannot find", parts[0]
 | 
			
		||||
                        continue
 | 
			
		||||
                    pos = dependentFile.find(" (")
 | 
			
		||||
                    if pos >= 0:
 | 
			
		||||
                        dependentFile = dependentFile[:pos].strip()
 | 
			
		||||
                    if dependentFile:
 | 
			
		||||
                        dependentFiles.append(dependentFile)
 | 
			
		||||
            dependentFiles = self.dependentFiles[path] = \
 | 
			
		||||
                    [f for f in dependentFiles if self._ShouldCopyFile(f)]
 | 
			
		||||
        return dependentFiles
 | 
			
		||||
 | 
			
		||||
    def _GetFileName(self, dir, name):
 | 
			
		||||
        if os.path.isabs(name):
 | 
			
		||||
            return name
 | 
			
		||||
        name = os.path.normcase(name)
 | 
			
		||||
        fullDir = os.path.join(os.path.dirname(cx_Freeze.__file__), dir)
 | 
			
		||||
        if os.path.isdir(fullDir):
 | 
			
		||||
            for fileName in os.listdir(fullDir):
 | 
			
		||||
                if name == os.path.splitext(os.path.normcase(fileName))[0]:
 | 
			
		||||
                    return os.path.join(fullDir, fileName)
 | 
			
		||||
 | 
			
		||||
    def _GetInitScriptFileName(self, argsSource = None):
 | 
			
		||||
        if argsSource is None:
 | 
			
		||||
            argsSource = self
 | 
			
		||||
        name = argsSource.initScript
 | 
			
		||||
        if name is None:
 | 
			
		||||
            if argsSource.copyDependentFiles:
 | 
			
		||||
                name = "Console"
 | 
			
		||||
            else:
 | 
			
		||||
                name = "ConsoleKeepPath"
 | 
			
		||||
        argsSource.initScript = self._GetFileName("initscripts", name)
 | 
			
		||||
        if argsSource.initScript is None:
 | 
			
		||||
            raise ConfigError("no initscript named %s", name)
 | 
			
		||||
 | 
			
		||||
    def _GetModuleFinder(self, argsSource = None):
 | 
			
		||||
        if argsSource is None:
 | 
			
		||||
            argsSource = self
 | 
			
		||||
        finder = cx_Freeze.ModuleFinder(self.includeFiles, argsSource.excludes,
 | 
			
		||||
                argsSource.path, argsSource.replacePaths)
 | 
			
		||||
        if argsSource.copyDependentFiles:
 | 
			
		||||
            finder.IncludeModule("imp")
 | 
			
		||||
            finder.IncludeModule("os")
 | 
			
		||||
            finder.IncludeModule("sys")
 | 
			
		||||
            if argsSource.compress:
 | 
			
		||||
                finder.IncludeModule("zlib")
 | 
			
		||||
        for name in argsSource.includes:
 | 
			
		||||
            finder.IncludeModule(name)
 | 
			
		||||
        for name in argsSource.packages:
 | 
			
		||||
            finder.IncludePackage(name)
 | 
			
		||||
        return finder
 | 
			
		||||
 | 
			
		||||
    def _PrintReport(self, fileName, modules):
 | 
			
		||||
        print "writing zip file", fileName
 | 
			
		||||
        print
 | 
			
		||||
        print "  %-25s %s" % ("Name", "File")
 | 
			
		||||
        print "  %-25s %s" % ("----", "----")
 | 
			
		||||
        for module in modules:
 | 
			
		||||
            if module.path:
 | 
			
		||||
                print "P",
 | 
			
		||||
            else:
 | 
			
		||||
                print "m",
 | 
			
		||||
            print "%-25s" % module.name, module.file or ""
 | 
			
		||||
        print
 | 
			
		||||
 | 
			
		||||
    def _RemoveFile(self, path):
 | 
			
		||||
        if os.path.exists(path):
 | 
			
		||||
            os.chmod(path, 0777)
 | 
			
		||||
            os.remove(path)
 | 
			
		||||
 | 
			
		||||
    def _ShouldCopyFile(self, path):
 | 
			
		||||
        dir, name = os.path.split(os.path.normcase(path))
 | 
			
		||||
        parts = name.split(".")
 | 
			
		||||
        tweaked = False
 | 
			
		||||
        while True:
 | 
			
		||||
            if not parts[-1].isdigit():
 | 
			
		||||
                break
 | 
			
		||||
            parts.pop(-1)
 | 
			
		||||
            tweaked = True
 | 
			
		||||
        if tweaked:
 | 
			
		||||
            name = ".".join(parts)
 | 
			
		||||
        if name in self.binIncludes:
 | 
			
		||||
            return True
 | 
			
		||||
        if name in self.binExcludes:
 | 
			
		||||
            return False
 | 
			
		||||
        for path in self.binPathIncludes:
 | 
			
		||||
            if dir.startswith(path):
 | 
			
		||||
                return True
 | 
			
		||||
        for path in self.binPathExcludes:
 | 
			
		||||
            if dir.startswith(path):
 | 
			
		||||
                return False
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
    def _VerifyCanAppendToLibrary(self):
 | 
			
		||||
        if not self.createLibraryZip:
 | 
			
		||||
            raise ConfigError("script cannot be appended to library zip if "
 | 
			
		||||
                    "one is not being created")
 | 
			
		||||
 | 
			
		||||
    def _VerifyConfiguration(self):
 | 
			
		||||
        if self.compress is None:
 | 
			
		||||
            self.compress = True
 | 
			
		||||
        if self.copyDependentFiles is None:
 | 
			
		||||
            self.copyDependentFiles = True
 | 
			
		||||
        if self.createLibraryZip is None:
 | 
			
		||||
            self.createLibraryZip = True
 | 
			
		||||
        if self.appendScriptToExe is None:
 | 
			
		||||
            self.appendScriptToExe = False
 | 
			
		||||
        if self.appendScriptToLibrary is None:
 | 
			
		||||
            self.appendScriptToLibrary = \
 | 
			
		||||
                    self.createLibraryZip and not self.appendScriptToExe
 | 
			
		||||
        if self.targetDir is None:
 | 
			
		||||
            self.targetDir = os.path.abspath("dist")
 | 
			
		||||
        self._GetInitScriptFileName()
 | 
			
		||||
        self._GetBaseFileName()
 | 
			
		||||
        if self.path is None:
 | 
			
		||||
            self.path = sys.path
 | 
			
		||||
        if self.appendScriptToLibrary:
 | 
			
		||||
            self._VerifyCanAppendToLibrary()
 | 
			
		||||
        for sourceFileName, targetFileName in self.includeFiles:
 | 
			
		||||
            if not os.path.exists(sourceFileName):
 | 
			
		||||
                raise ConfigError("cannot find file/directory named %s",
 | 
			
		||||
                        sourceFileName)
 | 
			
		||||
            if os.path.isabs(targetFileName):
 | 
			
		||||
                raise ConfigError("target file/directory cannot be absolute")
 | 
			
		||||
        for executable in self.executables:
 | 
			
		||||
            executable._VerifyConfiguration(self)
 | 
			
		||||
 | 
			
		||||
    def _WriteModules(self, fileName, initScript, finder, compress,
 | 
			
		||||
            copyDependentFiles, scriptModule = None):
 | 
			
		||||
        initModule = finder.IncludeFile(initScript, "cx_Freeze__init__")
 | 
			
		||||
        if scriptModule is None:
 | 
			
		||||
            for module in self.constantsModules:
 | 
			
		||||
                module.Create(finder)
 | 
			
		||||
            modules = [m for m in finder.modules \
 | 
			
		||||
                    if m.name not in self.excludeModules]
 | 
			
		||||
        else:
 | 
			
		||||
            modules = [initModule, scriptModule]
 | 
			
		||||
            self.excludeModules[initModule.name] = None
 | 
			
		||||
            self.excludeModules[scriptModule.name] = None
 | 
			
		||||
        itemsToSort = [(m.name, m) for m in modules]
 | 
			
		||||
        itemsToSort.sort()
 | 
			
		||||
        modules = [m for n, m in itemsToSort]
 | 
			
		||||
        self._PrintReport(fileName, modules)
 | 
			
		||||
        if scriptModule is None:
 | 
			
		||||
            finder.ReportMissingModules()
 | 
			
		||||
        targetDir = os.path.dirname(fileName)
 | 
			
		||||
        self._CreateDirectory(targetDir)
 | 
			
		||||
        filesToCopy = []
 | 
			
		||||
        if os.path.exists(fileName):
 | 
			
		||||
            mode = "a"
 | 
			
		||||
        else:
 | 
			
		||||
            mode = "w"
 | 
			
		||||
        outFile = zipfile.PyZipFile(fileName, mode, zipfile.ZIP_DEFLATED)
 | 
			
		||||
        for module in modules:
 | 
			
		||||
            if module.code is None and module.file is not None:
 | 
			
		||||
                fileName = os.path.basename(module.file)
 | 
			
		||||
                baseFileName, ext = os.path.splitext(fileName)
 | 
			
		||||
                if baseFileName != module.name and module.name != "zlib":
 | 
			
		||||
                    if "." in module.name:
 | 
			
		||||
                        fileName = module.name + ext
 | 
			
		||||
                    generatedFileName = "ExtensionLoader_%s.py" % \
 | 
			
		||||
                            module.name.replace(".", "_")
 | 
			
		||||
                    module.code = compile(EXTENSION_LOADER_SOURCE % fileName,
 | 
			
		||||
                            generatedFileName, "exec")
 | 
			
		||||
                target = os.path.join(targetDir, fileName)
 | 
			
		||||
                filesToCopy.append((module, target))
 | 
			
		||||
            if module.code is None:
 | 
			
		||||
                continue
 | 
			
		||||
            fileName = "/".join(module.name.split("."))
 | 
			
		||||
            if module.path:
 | 
			
		||||
                fileName += "/__init__"
 | 
			
		||||
            if module.file is not None and os.path.exists(module.file):
 | 
			
		||||
                mtime = os.stat(module.file).st_mtime
 | 
			
		||||
            else:
 | 
			
		||||
                mtime = time.time()
 | 
			
		||||
            zipTime = time.localtime(mtime)[:6]
 | 
			
		||||
            data = imp.get_magic() + struct.pack("<i", mtime) + \
 | 
			
		||||
                    marshal.dumps(module.code)
 | 
			
		||||
            zinfo = zipfile.ZipInfo(fileName + ".pyc", zipTime)
 | 
			
		||||
            if compress:
 | 
			
		||||
                zinfo.compress_type = zipfile.ZIP_DEFLATED
 | 
			
		||||
            outFile.writestr(zinfo, data)
 | 
			
		||||
        origPath = os.environ["PATH"]
 | 
			
		||||
        for module, target in filesToCopy:
 | 
			
		||||
            try:
 | 
			
		||||
                if module.parent is not None:
 | 
			
		||||
                    path = os.pathsep.join([origPath] + module.parent.path)
 | 
			
		||||
                    os.environ["PATH"] = path
 | 
			
		||||
                self._CopyFile(module.file, target, copyDependentFiles)
 | 
			
		||||
            finally:
 | 
			
		||||
                os.environ["PATH"] = origPath
 | 
			
		||||
 | 
			
		||||
    def Freeze(self):
 | 
			
		||||
        self.finder = None
 | 
			
		||||
        self.excludeModules = {}
 | 
			
		||||
        self.dependentFiles = {}
 | 
			
		||||
        self.filesCopied = {}
 | 
			
		||||
        cx_Freeze.util.SetOptimizeFlag(self.optimizeFlag)
 | 
			
		||||
        if self.createLibraryZip:
 | 
			
		||||
            self.finder = self._GetModuleFinder()
 | 
			
		||||
        for executable in self.executables:
 | 
			
		||||
            self._FreezeExecutable(executable)
 | 
			
		||||
        if self.createLibraryZip:
 | 
			
		||||
            fileName = os.path.join(self.targetDir, "library.zip")
 | 
			
		||||
            self._RemoveFile(fileName)
 | 
			
		||||
            self._WriteModules(fileName, self.initScript, self.finder,
 | 
			
		||||
                    self.compress, self.copyDependentFiles)
 | 
			
		||||
        for sourceFileName, targetFileName in self.includeFiles:
 | 
			
		||||
            fullName = os.path.join(self.targetDir, targetFileName)
 | 
			
		||||
            if os.path.isdir(sourceFileName):
 | 
			
		||||
                for path, dirNames, fileNames in os.walk(sourceFileName):
 | 
			
		||||
                    shortPath = path[len(sourceFileName) + 1:]
 | 
			
		||||
                    if ".svn" in dirNames:
 | 
			
		||||
                        dirNames.remove(".svn")
 | 
			
		||||
                    if "CVS" in dirNames:
 | 
			
		||||
                        dirNames.remove("CVS")
 | 
			
		||||
                    for fileName in fileNames:
 | 
			
		||||
                        fullSourceName = os.path.join(path, fileName)
 | 
			
		||||
                        fullTargetName = os.path.join(self.targetDir,
 | 
			
		||||
                                targetFileName, shortPath, fileName)
 | 
			
		||||
                        self._CopyFile(fullSourceName, fullTargetName,
 | 
			
		||||
                                copyDependentFiles = False)
 | 
			
		||||
            else:
 | 
			
		||||
                self._CopyFile(sourceFileName, fullName,
 | 
			
		||||
                        copyDependentFiles = False)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ConfigError(Exception):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, format, *args):
 | 
			
		||||
        self.what = format % args
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.what
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Executable(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, script, initScript = None, base = None, path = None,
 | 
			
		||||
            targetDir = None, targetName = None, includes = None,
 | 
			
		||||
            excludes = None, packages = None, replacePaths = None,
 | 
			
		||||
            compress = None, copyDependentFiles = None,
 | 
			
		||||
            appendScriptToExe = None, appendScriptToLibrary = None,
 | 
			
		||||
            icon = None):
 | 
			
		||||
        self.script = script
 | 
			
		||||
        self.initScript = initScript
 | 
			
		||||
        self.base = base
 | 
			
		||||
        self.path = path
 | 
			
		||||
        self.targetDir = targetDir
 | 
			
		||||
        self.targetName = targetName
 | 
			
		||||
        self.includes = includes
 | 
			
		||||
        self.excludes = excludes
 | 
			
		||||
        self.packages = packages
 | 
			
		||||
        self.replacePaths = replacePaths
 | 
			
		||||
        self.compress = compress
 | 
			
		||||
        self.copyDependentFiles = copyDependentFiles
 | 
			
		||||
        self.appendScriptToExe = appendScriptToExe
 | 
			
		||||
        self.appendScriptToLibrary = appendScriptToLibrary
 | 
			
		||||
        self.icon = icon
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return "<Executable script=%s>" % self.script
 | 
			
		||||
 | 
			
		||||
    def _VerifyConfiguration(self, freezer):
 | 
			
		||||
        if self.path is None:
 | 
			
		||||
            self.path = freezer.path
 | 
			
		||||
        if self.targetDir is None:
 | 
			
		||||
            self.targetDir = freezer.targetDir
 | 
			
		||||
        if self.includes is None:
 | 
			
		||||
            self.includes = freezer.includes
 | 
			
		||||
        if self.excludes is None:
 | 
			
		||||
            self.excludes = freezer.excludes
 | 
			
		||||
        if self.packages is None:
 | 
			
		||||
            self.packages = freezer.packages
 | 
			
		||||
        if self.replacePaths is None:
 | 
			
		||||
            self.replacePaths = freezer.replacePaths
 | 
			
		||||
        if self.compress is None:
 | 
			
		||||
            self.compress = freezer.compress
 | 
			
		||||
        if self.copyDependentFiles is None:
 | 
			
		||||
            self.copyDependentFiles = freezer.copyDependentFiles
 | 
			
		||||
        if self.appendScriptToExe is None:
 | 
			
		||||
            self.appendScriptToExe = freezer.appendScriptToExe
 | 
			
		||||
        if self.appendScriptToLibrary is None:
 | 
			
		||||
            self.appendScriptToLibrary = freezer.appendScriptToLibrary
 | 
			
		||||
        if self.initScript is None:
 | 
			
		||||
            self.initScript = freezer.initScript
 | 
			
		||||
        else:
 | 
			
		||||
            freezer._GetInitScriptFileName(self)
 | 
			
		||||
        if self.base is None:
 | 
			
		||||
            self.base = freezer.base
 | 
			
		||||
        else:
 | 
			
		||||
            freezer._GetBaseFileName(self)
 | 
			
		||||
        if self.appendScriptToLibrary:
 | 
			
		||||
            freezer._VerifyCanAppendToLibrary()
 | 
			
		||||
        if self.icon is None:
 | 
			
		||||
            self.icon = freezer.icon
 | 
			
		||||
        if self.script is not None:
 | 
			
		||||
            name, ext = os.path.splitext(os.path.basename(self.script))
 | 
			
		||||
            if self.appendScriptToLibrary:
 | 
			
		||||
                self.moduleName = "%s__main__" % os.path.normcase(name)
 | 
			
		||||
            else:
 | 
			
		||||
                self.moduleName = "__main__"
 | 
			
		||||
        if self.targetName is None:
 | 
			
		||||
            baseName, ext = os.path.splitext(self.base)
 | 
			
		||||
            self.targetName = name + ext
 | 
			
		||||
        self.targetName = os.path.join(self.targetDir, self.targetName)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ConstantsModule(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, releaseString = None, copyright = None,
 | 
			
		||||
            moduleName = "BUILD_CONSTANTS", timeFormat = "%B %d, %Y %H:%M:%S"):
 | 
			
		||||
        self.moduleName = moduleName
 | 
			
		||||
        self.timeFormat = timeFormat
 | 
			
		||||
        self.values = {}
 | 
			
		||||
        self.values["BUILD_RELEASE_STRING"] = releaseString
 | 
			
		||||
        self.values["BUILD_COPYRIGHT"] = copyright
 | 
			
		||||
 | 
			
		||||
    def Create(self, finder):
 | 
			
		||||
        """Create the module which consists of declaration statements for each
 | 
			
		||||
           of the values."""
 | 
			
		||||
        today = datetime.datetime.today()
 | 
			
		||||
        sourceTimestamp = 0
 | 
			
		||||
        for module in finder.modules:
 | 
			
		||||
            if module.file is None:
 | 
			
		||||
                continue
 | 
			
		||||
            if module.inZipFile:
 | 
			
		||||
                continue
 | 
			
		||||
            if not os.path.exists(module.file):
 | 
			
		||||
                raise ConfigError("no file named %s", module.file)
 | 
			
		||||
            timestamp = os.stat(module.file).st_mtime
 | 
			
		||||
            sourceTimestamp = max(sourceTimestamp, timestamp)
 | 
			
		||||
        sourceTimestamp = datetime.datetime.fromtimestamp(sourceTimestamp)
 | 
			
		||||
        self.values["BUILD_TIMESTAMP"] = today.strftime(self.timeFormat)
 | 
			
		||||
        self.values["BUILD_HOST"] = socket.gethostname().split(".")[0]
 | 
			
		||||
        self.values["SOURCE_TIMESTAMP"] = \
 | 
			
		||||
                sourceTimestamp.strftime(self.timeFormat)
 | 
			
		||||
        module = finder._AddModule(self.moduleName)
 | 
			
		||||
        sourceParts = []
 | 
			
		||||
        names = self.values.keys()
 | 
			
		||||
        names.sort()
 | 
			
		||||
        for name in names:
 | 
			
		||||
            value = self.values[name]
 | 
			
		||||
            sourceParts.append("%s = %r" % (name, value))
 | 
			
		||||
        source = "\n".join(sourceParts)
 | 
			
		||||
        module.code = compile(source, "%s.py" % self.moduleName, "exec")
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										281
									
								
								installer/cx_Freeze/cx_Freeze/hooks.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										281
									
								
								installer/cx_Freeze/cx_Freeze/hooks.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,281 @@
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
def initialize(finder):
 | 
			
		||||
    """upon initialization of the finder, this routine is called to set up some
 | 
			
		||||
       automatic exclusions for various platforms."""
 | 
			
		||||
    finder.ExcludeModule("FCNTL")
 | 
			
		||||
    finder.ExcludeModule("os.path")
 | 
			
		||||
    if os.name == "nt":
 | 
			
		||||
        finder.ExcludeModule("fcntl")
 | 
			
		||||
        finder.ExcludeModule("grp")
 | 
			
		||||
        finder.ExcludeModule("pwd")
 | 
			
		||||
        finder.ExcludeModule("termios")
 | 
			
		||||
    else:
 | 
			
		||||
        finder.ExcludeModule("_winreg")
 | 
			
		||||
        finder.ExcludeModule("msilib")
 | 
			
		||||
        finder.ExcludeModule("msvcrt")
 | 
			
		||||
        finder.ExcludeModule("nt")
 | 
			
		||||
        if os.name not in ("os2", "ce"):
 | 
			
		||||
            finder.ExcludeModule("ntpath")
 | 
			
		||||
        finder.ExcludeModule("nturl2path")
 | 
			
		||||
        finder.ExcludeModule("pythoncom")
 | 
			
		||||
        finder.ExcludeModule("pywintypes")
 | 
			
		||||
        finder.ExcludeModule("winerror")
 | 
			
		||||
        finder.ExcludeModule("winsound")
 | 
			
		||||
        finder.ExcludeModule("win32api")
 | 
			
		||||
        finder.ExcludeModule("win32con")
 | 
			
		||||
        finder.ExcludeModule("win32event")
 | 
			
		||||
        finder.ExcludeModule("win32file")
 | 
			
		||||
        finder.ExcludeModule("win32pdh")
 | 
			
		||||
        finder.ExcludeModule("win32pipe")
 | 
			
		||||
        finder.ExcludeModule("win32process")
 | 
			
		||||
        finder.ExcludeModule("win32security")
 | 
			
		||||
        finder.ExcludeModule("win32service")
 | 
			
		||||
        finder.ExcludeModule("wx.activex")
 | 
			
		||||
    if os.name != "posix":
 | 
			
		||||
        finder.ExcludeModule("posix")
 | 
			
		||||
    if os.name != "mac":
 | 
			
		||||
        finder.ExcludeModule("Carbon")
 | 
			
		||||
        finder.ExcludeModule("gestalt")
 | 
			
		||||
        finder.ExcludeModule("ic")
 | 
			
		||||
        finder.ExcludeModule("mac")
 | 
			
		||||
        finder.ExcludeModule("MacOS")
 | 
			
		||||
        finder.ExcludeModule("macpath")
 | 
			
		||||
        finder.ExcludeModule("macurl2path")
 | 
			
		||||
        if os.name != "nt":
 | 
			
		||||
            finder.ExcludeModule("EasyDialogs")
 | 
			
		||||
    if os.name != "os2":
 | 
			
		||||
        finder.ExcludeModule("os2")
 | 
			
		||||
        finder.ExcludeModule("os2emxpath")
 | 
			
		||||
        finder.ExcludeModule("_emx_link")
 | 
			
		||||
    if os.name != "ce":
 | 
			
		||||
        finder.ExcludeModule("ce")
 | 
			
		||||
    if os.name != "riscos":
 | 
			
		||||
        finder.ExcludeModule("riscos")
 | 
			
		||||
        finder.ExcludeModule("riscosenviron")
 | 
			
		||||
        finder.ExcludeModule("riscospath")
 | 
			
		||||
        finder.ExcludeModule("rourl2path")
 | 
			
		||||
    if sys.platform[:4] != "java":
 | 
			
		||||
        finder.ExcludeModule("java.lang")
 | 
			
		||||
        finder.ExcludeModule("org.python.core")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_cElementTree(finder, module):
 | 
			
		||||
    """the cElementTree module implicitly loads the elementtree.ElementTree
 | 
			
		||||
       module; make sure this happens."""
 | 
			
		||||
    finder.IncludeModule("elementtree.ElementTree")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_ceODBC(finder, module):
 | 
			
		||||
    """the ceODBC module implicitly imports both datetime and decimal; make
 | 
			
		||||
       sure this happens."""
 | 
			
		||||
    finder.IncludeModule("datetime")
 | 
			
		||||
    finder.IncludeModule("decimal")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_cx_Oracle(finder, module):
 | 
			
		||||
    """the cx_Oracle module implicitly imports datetime; make sure this
 | 
			
		||||
       happens."""
 | 
			
		||||
    finder.IncludeModule("datetime")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_docutils_frontend(finder, module):
 | 
			
		||||
    """The optik module is the old name for the optparse module; ignore the
 | 
			
		||||
       module if it cannot be found."""
 | 
			
		||||
    module.IgnoreName("optik")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_dummy_threading(finder, module):
 | 
			
		||||
    """the dummy_threading module plays games with the name of the threading
 | 
			
		||||
       module for its own purposes; ignore that here"""
 | 
			
		||||
    finder.ExcludeModule("_dummy_threading")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_email(finder, module):
 | 
			
		||||
    """the email package has a bunch of aliases as the submodule names were
 | 
			
		||||
       all changed to lowercase in Python 2.5; mimic that here."""
 | 
			
		||||
    if sys.version_info[:2] >= (2, 5):
 | 
			
		||||
        for name in ("Charset", "Encoders", "Errors", "FeedParser",
 | 
			
		||||
                "Generator", "Header", "Iterators", "Message", "Parser",
 | 
			
		||||
                "Utils", "base64MIME", "quopriMIME"):
 | 
			
		||||
            finder.AddAlias("email.%s" % name, "email.%s" % name.lower())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_ftplib(finder, module):
 | 
			
		||||
    """the ftplib module attempts to import the SOCKS module; ignore this
 | 
			
		||||
       module if it cannot be found"""
 | 
			
		||||
    module.IgnoreName("SOCKS")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_matplotlib(finder, module):
 | 
			
		||||
    """the matplotlib module requires data to be found in mpl-data in the
 | 
			
		||||
       same directory as the frozen executable so oblige it"""
 | 
			
		||||
    dir = os.path.join(module.path[0], "mpl-data")
 | 
			
		||||
    finder.IncludeFiles(dir, "mpl-data")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_matplotlib_numerix(finder, module):
 | 
			
		||||
    """the numpy.numerix module loads a number of modules dynamically"""
 | 
			
		||||
    for name in ("ma", "fft", "linear_algebra", "random_array", "mlab"):
 | 
			
		||||
        finder.IncludeModule("%s.%s" % (module.name, name))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_numpy_linalg(finder, module):
 | 
			
		||||
    """the numpy.linalg module implicitly loads the lapack_lite module; make
 | 
			
		||||
       sure this happens"""
 | 
			
		||||
    finder.IncludeModule("numpy.linalg.lapack_lite")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_pty(finder, module):
 | 
			
		||||
    """The sgi module is not needed for this module to function."""
 | 
			
		||||
    module.IgnoreName("sgi")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_pythoncom(finder, module):
 | 
			
		||||
    """the pythoncom module is actually contained in a DLL but since those
 | 
			
		||||
       cannot be loaded directly in Python 2.5 and higher a special module is
 | 
			
		||||
       used to perform that task; simply use that technique directly to
 | 
			
		||||
       determine the name of the DLL and ensure it is included as a normal
 | 
			
		||||
       extension; also load the pywintypes module which is implicitly
 | 
			
		||||
       loaded."""
 | 
			
		||||
    import pythoncom
 | 
			
		||||
    module.file = pythoncom.__file__
 | 
			
		||||
    module.code = None
 | 
			
		||||
    finder.IncludeModule("pywintypes")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_pywintypes(finder, module):
 | 
			
		||||
    """the pywintypes module is actually contained in a DLL but since those
 | 
			
		||||
       cannot be loaded directly in Python 2.5 and higher a special module is
 | 
			
		||||
       used to perform that task; simply use that technique directly to
 | 
			
		||||
       determine the name of the DLL and ensure it is included as a normal
 | 
			
		||||
       extension."""
 | 
			
		||||
    import pywintypes
 | 
			
		||||
    module.file = pywintypes.__file__
 | 
			
		||||
    module.code = None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_PyQt4_Qt(finder, module):
 | 
			
		||||
    """the PyQt4.Qt module is an extension module which imports a number of
 | 
			
		||||
       other modules and injects their namespace into its own. It seems a
 | 
			
		||||
       foolish way of doing things but perhaps there is some hidden advantage
 | 
			
		||||
       to this technique over pure Python; ignore the absence of some of
 | 
			
		||||
       the modules since not every installation includes all of them."""
 | 
			
		||||
    finder.IncludeModule("PyQt4.QtCore")
 | 
			
		||||
    finder.IncludeModule("PyQt4.QtGui")
 | 
			
		||||
    finder.IncludeModule("sip")
 | 
			
		||||
    for name in ("PyQt4.QtSvg", "PyQt4.Qsci", "PyQt4.QtAssistant",
 | 
			
		||||
            "PyQt4.QtNetwork", "PyQt4.QtOpenGL", "PyQt4.QtScript", "PyQt4._qt",
 | 
			
		||||
            "PyQt4.QtSql", "PyQt4.QtSvg", "PyQt4.QtTest", "PyQt4.QtXml"):
 | 
			
		||||
        try:
 | 
			
		||||
            finder.IncludeModule(name)
 | 
			
		||||
        except ImportError:
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_Tkinter(finder, module):
 | 
			
		||||
    """the Tkinter module has data files that are required to be loaded so
 | 
			
		||||
       ensure that they are copied into the directory that is expected at
 | 
			
		||||
       runtime."""
 | 
			
		||||
    import Tkinter
 | 
			
		||||
    import _tkinter
 | 
			
		||||
    tk = _tkinter.create()
 | 
			
		||||
    tclDir = os.path.dirname(tk.call("info", "library"))
 | 
			
		||||
    tclSourceDir = os.path.join(tclDir, "tcl%s" % _tkinter.TCL_VERSION)
 | 
			
		||||
    tkSourceDir = os.path.join(tclDir, "tk%s" % _tkinter.TK_VERSION)
 | 
			
		||||
    finder.IncludeFiles(tclSourceDir, "tcl")
 | 
			
		||||
    finder.IncludeFiles(tkSourceDir, "tk")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_tempfile(finder, module):
 | 
			
		||||
    """the tempfile module attempts to load the fcntl and thread modules but
 | 
			
		||||
       continues if these modules cannot be found; ignore these modules if they
 | 
			
		||||
       cannot be found."""
 | 
			
		||||
    module.IgnoreName("fcntl")
 | 
			
		||||
    module.IgnoreName("thread")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_time(finder, module):
 | 
			
		||||
    """the time module implicitly loads _strptime; make sure this happens."""
 | 
			
		||||
    finder.IncludeModule("_strptime")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_win32api(finder, module):
 | 
			
		||||
    """the win32api module implicitly loads the pywintypes module; make sure
 | 
			
		||||
       this happens."""
 | 
			
		||||
    finder.IncludeModule("pywintypes")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_win32com(finder, module):
 | 
			
		||||
    """the win32com package manipulates its search path at runtime to include
 | 
			
		||||
       the sibling directory called win32comext; simulate that by changing the
 | 
			
		||||
       search path in a similar fashion here."""
 | 
			
		||||
    baseDir = os.path.dirname(os.path.dirname(module.file))
 | 
			
		||||
    module.path.append(os.path.join(baseDir, "win32comext"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_win32file(finder, module):
 | 
			
		||||
    """the win32api module implicitly loads the pywintypes module; make sure
 | 
			
		||||
       this happens."""
 | 
			
		||||
    finder.IncludeModule("pywintypes")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_xml(finder, module):
 | 
			
		||||
    """the builtin xml package attempts to load the _xmlplus module to see if
 | 
			
		||||
       that module should take its role instead; ignore the failure to find
 | 
			
		||||
       this module, though."""
 | 
			
		||||
    module.IgnoreName("_xmlplus")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_xml_etree_cElementTree(finder, module):
 | 
			
		||||
    """the xml.etree.cElementTree module implicitly loads the
 | 
			
		||||
       xml.etree.ElementTree module; make sure this happens."""
 | 
			
		||||
    finder.IncludeModule("xml.etree.ElementTree")
 | 
			
		||||
 | 
			
		||||
def load_IPython(finder, module):
 | 
			
		||||
    ipy = os.path.join(os.path.dirname(module.file), 'Extensions')
 | 
			
		||||
    extensions = set([])
 | 
			
		||||
    for m in os.listdir(ipy):
 | 
			
		||||
        extensions.add(os.path.splitext(m)[0])
 | 
			
		||||
    extensions.remove('__init__')
 | 
			
		||||
    for m in extensions:
 | 
			
		||||
        finder.IncludeModule('IPython.Extensions.'+m)
 | 
			
		||||
        
 | 
			
		||||
def load_lxml(finder, module):
 | 
			
		||||
    finder.IncludeModule('lxml._elementpath')
 | 
			
		||||
    
 | 
			
		||||
def load_cherrypy(finder, module):
 | 
			
		||||
    finder.IncludeModule('cherrypy.lib.encoding')
 | 
			
		||||
 | 
			
		||||
def missing_cElementTree(finder, caller):
 | 
			
		||||
    """the cElementTree has been incorporated into the standard library in
 | 
			
		||||
       Python 2.5 so ignore its absence if it cannot found."""
 | 
			
		||||
    if sys.version_info[:2] >= (2, 5):
 | 
			
		||||
        caller.IgnoreName("cElementTree")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def missing_EasyDialogs(finder, caller):
 | 
			
		||||
    """the EasyDialogs module is not normally present on Windows but it also
 | 
			
		||||
       may be so instead of excluding it completely, ignore it if it can't be
 | 
			
		||||
       found"""
 | 
			
		||||
    if sys.platform == "win32":
 | 
			
		||||
        caller.IgnoreName("EasyDialogs")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def missing_readline(finder, caller):
 | 
			
		||||
    """the readline module is not normally present on Windows but it also may
 | 
			
		||||
       be so instead of excluding it completely, ignore it if it can't be
 | 
			
		||||
       found"""
 | 
			
		||||
    if sys.platform == "win32":
 | 
			
		||||
        caller.IgnoreName("readline")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def missing_xml_etree(finder, caller):
 | 
			
		||||
    """the xml.etree package is new for Python 2.5 but it is common practice
 | 
			
		||||
       to use a try..except.. block in order to support versions earlier than
 | 
			
		||||
       Python 2.5 transparently; ignore the absence of the package in this
 | 
			
		||||
       situation."""
 | 
			
		||||
    if sys.version_info[:2] < (2, 5):
 | 
			
		||||
        caller.IgnoreName("xml.etree")
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										171
									
								
								installer/cx_Freeze/cx_Freeze/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								installer/cx_Freeze/cx_Freeze/main.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,171 @@
 | 
			
		||||
import optparse
 | 
			
		||||
import os
 | 
			
		||||
import shutil
 | 
			
		||||
import stat
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
import cx_Freeze
 | 
			
		||||
 | 
			
		||||
__all__ = ["main"]
 | 
			
		||||
 | 
			
		||||
USAGE = \
 | 
			
		||||
"""
 | 
			
		||||
%prog [options] [SCRIPT]
 | 
			
		||||
 | 
			
		||||
Freeze a Python script and all of its referenced modules to a base
 | 
			
		||||
executable which can then be distributed without requiring a Python
 | 
			
		||||
installation."""
 | 
			
		||||
 | 
			
		||||
VERSION = \
 | 
			
		||||
"""
 | 
			
		||||
%%prog %s
 | 
			
		||||
Copyright (c) 2007-2008 Colt Engineering. All rights reserved.
 | 
			
		||||
Copyright (c) 2001-2006 Computronix Corporation. All rights reserved.""" % \
 | 
			
		||||
        cx_Freeze.version
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ParseCommandLine():
 | 
			
		||||
    parser = optparse.OptionParser(version = VERSION.strip(),
 | 
			
		||||
            usage = USAGE.strip())
 | 
			
		||||
    parser.add_option("-O",
 | 
			
		||||
            action = "count",
 | 
			
		||||
            default = 0,
 | 
			
		||||
            dest = "optimized",
 | 
			
		||||
            help = "optimize generated bytecode as per PYTHONOPTIMIZE; "
 | 
			
		||||
                   "use -OO in order to remove doc strings")
 | 
			
		||||
    parser.add_option("-c", "--compress",
 | 
			
		||||
            action = "store_true",
 | 
			
		||||
            dest = "compress",
 | 
			
		||||
            help = "compress byte code in zip files")
 | 
			
		||||
    parser.add_option("--base-name",
 | 
			
		||||
            dest = "baseName",
 | 
			
		||||
            metavar = "NAME",
 | 
			
		||||
            help = "file on which to base the target file; if the name of the "
 | 
			
		||||
                   "file is not an absolute file name, the subdirectory bases "
 | 
			
		||||
                   "(rooted in the directory in which the freezer is found) "
 | 
			
		||||
                   "will be searched for a file matching the name")
 | 
			
		||||
    parser.add_option("--init-script",
 | 
			
		||||
            dest = "initScript",
 | 
			
		||||
            metavar = "NAME",
 | 
			
		||||
            help = "script which will be executed upon startup; if the name "
 | 
			
		||||
                   "of the file is not an absolute file name, the "
 | 
			
		||||
                   "subdirectory initscripts (rooted in the directory in "
 | 
			
		||||
                   "which the cx_Freeze package is found) will be searched "
 | 
			
		||||
                   "for a file matching the name")
 | 
			
		||||
    parser.add_option("--target-dir", "--install-dir",
 | 
			
		||||
            dest = "targetDir",
 | 
			
		||||
            metavar = "DIR",
 | 
			
		||||
            help = "the directory in which to place the target file and "
 | 
			
		||||
                   "any dependent files")
 | 
			
		||||
    parser.add_option("--target-name",
 | 
			
		||||
            dest = "targetName",
 | 
			
		||||
            metavar = "NAME",
 | 
			
		||||
            help = "the name of the file to create instead of the base name "
 | 
			
		||||
                   "of the script and the extension of the base binary")
 | 
			
		||||
    parser.add_option("--no-copy-deps",
 | 
			
		||||
            dest = "copyDeps",
 | 
			
		||||
            default = True,
 | 
			
		||||
            action = "store_false",
 | 
			
		||||
            help = "do not copy the dependent files (extensions, shared "
 | 
			
		||||
                   "libraries, etc.) to the target directory; this also "
 | 
			
		||||
                   "modifies the default init script to ConsoleKeepPath.py "
 | 
			
		||||
                   "and means that the target executable requires a Python "
 | 
			
		||||
                   "installation to execute properly")
 | 
			
		||||
    parser.add_option("--default-path",
 | 
			
		||||
            action = "append",
 | 
			
		||||
            dest = "defaultPath",
 | 
			
		||||
            metavar = "DIRS",
 | 
			
		||||
            help = "list of paths separated by the standard path separator "
 | 
			
		||||
                   "for the platform which will be used to initialize "
 | 
			
		||||
                   "sys.path prior to running the module finder")
 | 
			
		||||
    parser.add_option("--include-path",
 | 
			
		||||
            action = "append",
 | 
			
		||||
            dest = "includePath",
 | 
			
		||||
            metavar = "DIRS",
 | 
			
		||||
            help = "list of paths separated by the standard path separator "
 | 
			
		||||
                   "for the platform which will be used to modify sys.path "
 | 
			
		||||
                   "prior to running the module finder")
 | 
			
		||||
    parser.add_option("--replace-paths",
 | 
			
		||||
            dest = "replacePaths",
 | 
			
		||||
            metavar = "DIRECTIVES",
 | 
			
		||||
            help = "replace all the paths in modules found in the given paths "
 | 
			
		||||
                   "with the given replacement string; multiple values are "
 | 
			
		||||
                   "separated by the standard path separator and each value "
 | 
			
		||||
                   "is of the form path=replacement_string; path can be * "
 | 
			
		||||
                   "which means all paths not already specified")
 | 
			
		||||
    parser.add_option("--include-modules",
 | 
			
		||||
            dest = "includeModules",
 | 
			
		||||
            metavar = "NAMES",
 | 
			
		||||
            help = "comma separated list of modules to include")
 | 
			
		||||
    parser.add_option("--exclude-modules",
 | 
			
		||||
            dest = "excludeModules",
 | 
			
		||||
            metavar = "NAMES",
 | 
			
		||||
            help = "comma separated list of modules to exclude")
 | 
			
		||||
    parser.add_option("--ext-list-file",
 | 
			
		||||
            dest = "extListFile",
 | 
			
		||||
            metavar = "NAME",
 | 
			
		||||
            help = "name of file in which to place the list of dependent files "
 | 
			
		||||
                   "which were copied into the target directory")
 | 
			
		||||
    parser.add_option("-z", "--zip-include",
 | 
			
		||||
            dest = "zipIncludes",
 | 
			
		||||
            action = "append",
 | 
			
		||||
            default = [],
 | 
			
		||||
            metavar = "SPEC",
 | 
			
		||||
            help = "name of file to add to the zip file or a specification of "
 | 
			
		||||
                   "the form name=arcname which will specify the archive name "
 | 
			
		||||
                   "to use; multiple --zip-include arguments can be used")
 | 
			
		||||
    options, args = parser.parse_args()
 | 
			
		||||
    if len(args) == 0:
 | 
			
		||||
        options.script = None
 | 
			
		||||
    elif len(args) == 1:
 | 
			
		||||
        options.script, = args
 | 
			
		||||
    else:
 | 
			
		||||
        parser.error("only one script can be specified")
 | 
			
		||||
    if not args and options.includeModules is None and options.copyDeps:
 | 
			
		||||
        parser.error("script or a list of modules must be specified")
 | 
			
		||||
    if not args and options.targetName is None:
 | 
			
		||||
        parser.error("script or a target name must be specified")
 | 
			
		||||
    if options.excludeModules:
 | 
			
		||||
        options.excludeModules = options.excludeModules.split(",")
 | 
			
		||||
    else:
 | 
			
		||||
        options.excludeModules = []
 | 
			
		||||
    if options.includeModules:
 | 
			
		||||
        options.includeModules = options.includeModules.split(",")
 | 
			
		||||
    else:
 | 
			
		||||
        options.includeModules = []
 | 
			
		||||
    replacePaths = []
 | 
			
		||||
    if options.replacePaths:
 | 
			
		||||
        for directive in options.replacePaths.split(os.pathsep):
 | 
			
		||||
            fromPath, replacement = directive.split("=")
 | 
			
		||||
            replacePaths.append((fromPath, replacement))
 | 
			
		||||
    options.replacePaths = replacePaths
 | 
			
		||||
    if options.defaultPath is not None:
 | 
			
		||||
        sys.path = [p for mp in options.defaultPath \
 | 
			
		||||
                for p in mp.split(os.pathsep)]
 | 
			
		||||
    if options.includePath is not None:
 | 
			
		||||
        paths = [p for mp in options.includePath for p in mp.split(os.pathsep)]
 | 
			
		||||
        sys.path = paths + sys.path
 | 
			
		||||
    if options.script is not None:
 | 
			
		||||
        sys.path.insert(0, os.path.dirname(options.script))
 | 
			
		||||
    return options
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    options = ParseCommandLine()
 | 
			
		||||
    executables = [cx_Freeze.Executable(options.script,
 | 
			
		||||
            targetName = options.targetName)]
 | 
			
		||||
    freezer = cx_Freeze.Freezer(executables,
 | 
			
		||||
            includes = options.includeModules,
 | 
			
		||||
            excludes = options.excludeModules,
 | 
			
		||||
            replacePaths = options.replacePaths,
 | 
			
		||||
            compress = options.compress,
 | 
			
		||||
            optimizeFlag = options.optimized,
 | 
			
		||||
            copyDependentFiles = options.copyDeps,
 | 
			
		||||
            initScript = options.initScript,
 | 
			
		||||
            base = options.baseName,
 | 
			
		||||
            path = None,
 | 
			
		||||
            createLibraryZip = False,
 | 
			
		||||
            appendScriptToExe = True,
 | 
			
		||||
            targetDir = options.targetDir)
 | 
			
		||||
    freezer.Freeze()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										337
									
								
								installer/cx_Freeze/cx_Freeze/windist.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										337
									
								
								installer/cx_Freeze/cx_Freeze/windist.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,337 @@
 | 
			
		||||
import distutils.command.bdist_msi
 | 
			
		||||
import msilib
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
__all__ = [ "bdist_msi" ]
 | 
			
		||||
 | 
			
		||||
# force the remove existing products action to happen first since Windows
 | 
			
		||||
# installer appears to be braindead and doesn't handle files shared between
 | 
			
		||||
# different "products" very well
 | 
			
		||||
sequence = msilib.sequence.InstallExecuteSequence
 | 
			
		||||
for index, info in enumerate(sequence):
 | 
			
		||||
    if info[0] == u'RemoveExistingProducts':
 | 
			
		||||
        sequence[index] = (info[0], info[1], 1450)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class bdist_msi(distutils.command.bdist_msi.bdist_msi):
 | 
			
		||||
    user_options = distutils.command.bdist_msi.bdist_msi.user_options + [
 | 
			
		||||
        ('add-to-path=', None, 'add target dir to PATH environment variable'),
 | 
			
		||||
        ('upgrade-code=', None, 'upgrade code to use')
 | 
			
		||||
    ]
 | 
			
		||||
    x = y = 50
 | 
			
		||||
    width = 370
 | 
			
		||||
    height = 300
 | 
			
		||||
    title = "[ProductName] Setup"
 | 
			
		||||
    modeless = 1
 | 
			
		||||
    modal = 3
 | 
			
		||||
 | 
			
		||||
    def add_config(self, fullname):
 | 
			
		||||
        initialTargetDir = self.get_initial_target_dir(fullname)
 | 
			
		||||
        if self.add_to_path is None:
 | 
			
		||||
            self.add_to_path = False
 | 
			
		||||
            for executable in self.distribution.executables:
 | 
			
		||||
                if os.path.basename(executable.base).startswith("Console"):
 | 
			
		||||
                    self.add_to_path = True
 | 
			
		||||
                    break
 | 
			
		||||
        if self.add_to_path:
 | 
			
		||||
            msilib.add_data(self.db, 'Environment',
 | 
			
		||||
                    [("E_PATH", "Path", r"[~];[TARGETDIR]", "TARGETDIR")])
 | 
			
		||||
        msilib.add_data(self.db, 'CustomAction',
 | 
			
		||||
                [("InitialTargetDir", 256 + 51, "TARGETDIR", initialTargetDir)
 | 
			
		||||
                ])
 | 
			
		||||
        msilib.add_data(self.db, 'InstallExecuteSequence',
 | 
			
		||||
                [("InitialTargetDir", 'TARGETDIR=""', 401)])
 | 
			
		||||
        msilib.add_data(self.db, 'InstallUISequence',
 | 
			
		||||
                [("PrepareDlg", None, 140),
 | 
			
		||||
                 ("InitialTargetDir", 'TARGETDIR=""', 401),
 | 
			
		||||
                 ("SelectDirectoryDlg", "not Installed", 1230),
 | 
			
		||||
                 ("MaintenanceTypeDlg",
 | 
			
		||||
                        "Installed and not Resume and not Preselected", 1250),
 | 
			
		||||
                 ("ProgressDlg", None, 1280)
 | 
			
		||||
                ])
 | 
			
		||||
 | 
			
		||||
    def add_cancel_dialog(self):
 | 
			
		||||
        dialog = msilib.Dialog(self.db, "CancelDlg", 50, 10, 260, 85, 3,
 | 
			
		||||
                self.title, "No", "No", "No")
 | 
			
		||||
        dialog.text("Text", 48, 15, 194, 30, 3,
 | 
			
		||||
                "Are you sure you want to cancel [ProductName] installation?")
 | 
			
		||||
        button = dialog.pushbutton("Yes", 72, 57, 56, 17, 3, "Yes", "No")
 | 
			
		||||
        button.event("EndDialog", "Exit")
 | 
			
		||||
        button = dialog.pushbutton("No", 132, 57, 56, 17, 3, "No", "Yes")
 | 
			
		||||
        button.event("EndDialog", "Return")
 | 
			
		||||
 | 
			
		||||
    def add_error_dialog(self):
 | 
			
		||||
        dialog = msilib.Dialog(self.db, "ErrorDlg", 50, 10, 330, 101, 65543,
 | 
			
		||||
                self.title, "ErrorText", None, None)
 | 
			
		||||
        dialog.text("ErrorText", 50, 9, 280, 48, 3, "")
 | 
			
		||||
        for text, x in [("No", 120), ("Yes", 240), ("Abort", 0),
 | 
			
		||||
                ("Cancel", 42), ("Ignore", 81), ("Ok", 159), ("Retry", 198)]:
 | 
			
		||||
            button = dialog.pushbutton(text[0], x, 72, 81, 21, 3, text, None)
 | 
			
		||||
            button.event("EndDialog", "Error%s" % text)
 | 
			
		||||
 | 
			
		||||
    def add_exit_dialog(self):
 | 
			
		||||
        dialog = distutils.command.bdist_msi.PyDialog(self.db, "ExitDialog",
 | 
			
		||||
                self.x, self.y, self.width, self.height, self.modal,
 | 
			
		||||
                self.title, "Finish", "Finish", "Finish")
 | 
			
		||||
        dialog.title("Completing the [ProductName] installer")
 | 
			
		||||
        dialog.back("< Back", "Finish", active = False)
 | 
			
		||||
        dialog.cancel("Cancel", "Back", active = False)
 | 
			
		||||
        dialog.text("Description", 15, 235, 320, 20, 0x30003,
 | 
			
		||||
                "Click the Finish button to exit the installer.")
 | 
			
		||||
        button = dialog.next("Finish", "Cancel", name = "Finish")
 | 
			
		||||
        button.event("EndDialog", "Return")
 | 
			
		||||
 | 
			
		||||
    def add_fatal_error_dialog(self):
 | 
			
		||||
        dialog = distutils.command.bdist_msi.PyDialog(self.db, "FatalError",
 | 
			
		||||
                self.x, self.y, self.width, self.height, self.modal,
 | 
			
		||||
                self.title, "Finish", "Finish", "Finish")
 | 
			
		||||
        dialog.title("[ProductName] installer ended prematurely")
 | 
			
		||||
        dialog.back("< Back", "Finish", active = False)
 | 
			
		||||
        dialog.cancel("Cancel", "Back", active = False)
 | 
			
		||||
        dialog.text("Description1", 15, 70, 320, 80, 0x30003,
 | 
			
		||||
                "[ProductName] setup ended prematurely because of an error. "
 | 
			
		||||
                "Your system has not been modified. To install this program "
 | 
			
		||||
                "at a later time, please run the installation again.")
 | 
			
		||||
        dialog.text("Description2", 15, 155, 320, 20, 0x30003,
 | 
			
		||||
                "Click the Finish button to exit the installer.")
 | 
			
		||||
        button = dialog.next("Finish", "Cancel", name = "Finish")
 | 
			
		||||
        button.event("EndDialog", "Exit")
 | 
			
		||||
 | 
			
		||||
    def add_files_in_use_dialog(self):
 | 
			
		||||
        dialog = distutils.command.bdist_msi.PyDialog(self.db, "FilesInUse",
 | 
			
		||||
                self.x, self.y, self.width, self.height, 19, self.title,
 | 
			
		||||
                "Retry", "Retry", "Retry", bitmap = False)
 | 
			
		||||
        dialog.text("Title", 15, 6, 200, 15, 0x30003,
 | 
			
		||||
                r"{\DlgFontBold8}Files in Use")
 | 
			
		||||
        dialog.text("Description", 20, 23, 280, 20, 0x30003,
 | 
			
		||||
                "Some files that need to be updated are currently in use.")
 | 
			
		||||
        dialog.text("Text", 20, 55, 330, 50, 3,
 | 
			
		||||
                "The following applications are using files that need to be "
 | 
			
		||||
                "updated by this setup. Close these applications and then "
 | 
			
		||||
                "click Retry to continue the installation or Cancel to exit "
 | 
			
		||||
                "it.")
 | 
			
		||||
        dialog.control("List", "ListBox", 20, 107, 330, 130, 7,
 | 
			
		||||
                "FileInUseProcess", None, None, None)
 | 
			
		||||
        button = dialog.back("Exit", "Ignore", name = "Exit")
 | 
			
		||||
        button.event("EndDialog", "Exit")
 | 
			
		||||
        button = dialog.next("Ignore", "Retry", name = "Ignore")
 | 
			
		||||
        button.event("EndDialog", "Ignore")
 | 
			
		||||
        button = dialog.cancel("Retry", "Exit", name = "Retry")
 | 
			
		||||
        button.event("EndDialog", "Retry")
 | 
			
		||||
 | 
			
		||||
    def add_maintenance_type_dialog(self):
 | 
			
		||||
        dialog = distutils.command.bdist_msi.PyDialog(self.db,
 | 
			
		||||
                "MaintenanceTypeDlg", self.x, self.y, self.width, self.height,
 | 
			
		||||
                self.modal, self.title, "Next", "Next", "Cancel")
 | 
			
		||||
        dialog.title("Welcome to the [ProductName] Setup Wizard")
 | 
			
		||||
        dialog.text("BodyText", 15, 63, 330, 42, 3,
 | 
			
		||||
                "Select whether you want to repair or remove [ProductName].")
 | 
			
		||||
        group = dialog.radiogroup("RepairRadioGroup", 15, 108, 330, 60, 3,
 | 
			
		||||
                "MaintenanceForm_Action", "", "Next")
 | 
			
		||||
        group.add("Repair", 0, 18, 300, 17, "&Repair [ProductName]")
 | 
			
		||||
        group.add("Remove", 0, 36, 300, 17, "Re&move [ProductName]")
 | 
			
		||||
        dialog.back("< Back", None, active = False)
 | 
			
		||||
        button = dialog.next("Finish", "Cancel")
 | 
			
		||||
        button.event("[REINSTALL]", "ALL",
 | 
			
		||||
                'MaintenanceForm_Action="Repair"', 5)
 | 
			
		||||
        button.event("[Progress1]", "Repairing",
 | 
			
		||||
                'MaintenanceForm_Action="Repair"', 6)
 | 
			
		||||
        button.event("[Progress2]", "repairs",
 | 
			
		||||
                'MaintenanceForm_Action="Repair"', 7)
 | 
			
		||||
        button.event("Reinstall", "ALL",
 | 
			
		||||
                'MaintenanceForm_Action="Repair"', 8)
 | 
			
		||||
        button.event("[REMOVE]", "ALL",
 | 
			
		||||
                'MaintenanceForm_Action="Remove"', 11)
 | 
			
		||||
        button.event("[Progress1]", "Removing",
 | 
			
		||||
                'MaintenanceForm_Action="Remove"', 12)
 | 
			
		||||
        button.event("[Progress2]", "removes",
 | 
			
		||||
                'MaintenanceForm_Action="Remove"', 13)
 | 
			
		||||
        button.event("Remove", "ALL",
 | 
			
		||||
                'MaintenanceForm_Action="Remove"', 14)
 | 
			
		||||
        button.event("EndDialog", "Return",
 | 
			
		||||
                'MaintenanceForm_Action<>"Change"', 20)
 | 
			
		||||
        button = dialog.cancel("Cancel", "RepairRadioGroup")
 | 
			
		||||
        button.event("SpawnDialog", "CancelDlg")
 | 
			
		||||
 | 
			
		||||
    def add_prepare_dialog(self):
 | 
			
		||||
        dialog = distutils.command.bdist_msi.PyDialog(self.db, "PrepareDlg",
 | 
			
		||||
                self.x, self.y, self.width, self.height, self.modeless,
 | 
			
		||||
                self.title, "Cancel", "Cancel", "Cancel")
 | 
			
		||||
        dialog.text("Description", 15, 70, 320, 40, 0x30003,
 | 
			
		||||
                "Please wait while the installer prepares to guide you through"
 | 
			
		||||
                "the installation.")
 | 
			
		||||
        dialog.title("Welcome to the [ProductName] installer")
 | 
			
		||||
        text = dialog.text("ActionText", 15, 110, 320, 20, 0x30003,
 | 
			
		||||
                "Pondering...")
 | 
			
		||||
        text.mapping("ActionText", "Text")
 | 
			
		||||
        text = dialog.text("ActionData", 15, 135, 320, 30, 0x30003, None)
 | 
			
		||||
        text.mapping("ActionData", "Text")
 | 
			
		||||
        dialog.back("Back", None, active = False)
 | 
			
		||||
        dialog.next("Next", None, active = False)
 | 
			
		||||
        button = dialog.cancel("Cancel", None)
 | 
			
		||||
        button.event("SpawnDialog", "CancelDlg")
 | 
			
		||||
 | 
			
		||||
    def add_progress_dialog(self):
 | 
			
		||||
        dialog = distutils.command.bdist_msi.PyDialog(self.db, "ProgressDlg",
 | 
			
		||||
                self.x, self.y, self.width, self.height, self.modeless,
 | 
			
		||||
                self.title, "Cancel", "Cancel", "Cancel", bitmap = False)
 | 
			
		||||
        dialog.text("Title", 20, 15, 200, 15, 0x30003,
 | 
			
		||||
                r"{\DlgFontBold8}[Progress1] [ProductName]")
 | 
			
		||||
        dialog.text("Text", 35, 65, 300, 30, 3,
 | 
			
		||||
                "Please wait while the installer [Progress2] [ProductName].")
 | 
			
		||||
        dialog.text("StatusLabel", 35, 100 ,35, 20, 3, "Status:")
 | 
			
		||||
        text = dialog.text("ActionText", 70, 100, self.width - 70, 20, 3,
 | 
			
		||||
                "Pondering...")
 | 
			
		||||
        text.mapping("ActionText", "Text")
 | 
			
		||||
        control = dialog.control("ProgressBar", "ProgressBar", 35, 120, 300,
 | 
			
		||||
                10, 65537, None, "Progress done", None, None)
 | 
			
		||||
        control.mapping("SetProgress", "Progress")
 | 
			
		||||
        dialog.back("< Back", "Next", active = False)
 | 
			
		||||
        dialog.next("Next >", "Cancel", active = False)
 | 
			
		||||
        button = dialog.cancel("Cancel", "Back")
 | 
			
		||||
        button.event("SpawnDialog", "CancelDlg")
 | 
			
		||||
 | 
			
		||||
    def add_properties(self):
 | 
			
		||||
        metadata = self.distribution.metadata
 | 
			
		||||
        props = [
 | 
			
		||||
                ('DistVersion', metadata.get_version()),
 | 
			
		||||
                ('DefaultUIFont', 'DlgFont8'),
 | 
			
		||||
                ('ErrorDialog', 'ErrorDlg'),
 | 
			
		||||
                ('Progress1', 'Install'),
 | 
			
		||||
                ('Progress2', 'installs'),
 | 
			
		||||
                ('MaintenanceForm_Action', 'Repair')
 | 
			
		||||
        ]
 | 
			
		||||
        email = metadata.author_email or metadata.maintainer_email
 | 
			
		||||
        if email:
 | 
			
		||||
            props.append(("ARPCONTACT", email))
 | 
			
		||||
        if metadata.url:
 | 
			
		||||
            props.append(("ARPURLINFOABOUT", metadata.url))
 | 
			
		||||
        if self.upgrade_code is not None:
 | 
			
		||||
            props.append(("UpgradeCode", self.upgrade_code))
 | 
			
		||||
        msilib.add_data(self.db, 'Property', props)
 | 
			
		||||
 | 
			
		||||
    def add_select_directory_dialog(self):
 | 
			
		||||
        dialog = distutils.command.bdist_msi.PyDialog(self.db,
 | 
			
		||||
                "SelectDirectoryDlg", self.x, self.y, self.width, self.height,
 | 
			
		||||
                self.modal, self.title, "Next", "Next", "Cancel")
 | 
			
		||||
        dialog.title("Select destination directory")
 | 
			
		||||
        dialog.back("< Back", None, active = False)
 | 
			
		||||
        button = dialog.next("Next >", "Cancel")
 | 
			
		||||
        button.event("SetTargetPath", "TARGETDIR", ordering = 1)
 | 
			
		||||
        button.event("SpawnWaitDialog", "WaitForCostingDlg", ordering = 2)
 | 
			
		||||
        button.event("EndDialog", "Return", ordering = 3)
 | 
			
		||||
        button = dialog.cancel("Cancel", "DirectoryCombo")
 | 
			
		||||
        button.event("SpawnDialog", "CancelDlg")
 | 
			
		||||
        dialog.control("DirectoryCombo", "DirectoryCombo", 15, 70, 272, 80,
 | 
			
		||||
                393219, "TARGETDIR", None, "DirectoryList", None)
 | 
			
		||||
        dialog.control("DirectoryList", "DirectoryList", 15, 90, 308, 136, 3,
 | 
			
		||||
                "TARGETDIR", None, "PathEdit", None)
 | 
			
		||||
        dialog.control("PathEdit", "PathEdit", 15, 230, 306, 16, 3,
 | 
			
		||||
                "TARGETDIR", None, "Next", None)
 | 
			
		||||
        button = dialog.pushbutton("Up", 306, 70, 18, 18, 3, "Up", None)
 | 
			
		||||
        button.event("DirectoryListUp", "0")
 | 
			
		||||
        button = dialog.pushbutton("NewDir", 324, 70, 30, 18, 3, "New", None)
 | 
			
		||||
        button.event("DirectoryListNew", "0")
 | 
			
		||||
 | 
			
		||||
    def add_text_styles(self):
 | 
			
		||||
        msilib.add_data(self.db, 'TextStyle',
 | 
			
		||||
                [("DlgFont8", "Tahoma", 9, None, 0),
 | 
			
		||||
                 ("DlgFontBold8", "Tahoma", 8, None, 1),
 | 
			
		||||
                 ("VerdanaBold10", "Verdana", 10, None, 1),
 | 
			
		||||
                 ("VerdanaRed9", "Verdana", 9, 255, 0)
 | 
			
		||||
                ])
 | 
			
		||||
 | 
			
		||||
    def add_ui(self):
 | 
			
		||||
        self.add_text_styles()
 | 
			
		||||
        self.add_error_dialog()
 | 
			
		||||
        self.add_fatal_error_dialog()
 | 
			
		||||
        self.add_cancel_dialog()
 | 
			
		||||
        self.add_exit_dialog()
 | 
			
		||||
        self.add_user_exit_dialog()
 | 
			
		||||
        self.add_files_in_use_dialog()
 | 
			
		||||
        self.add_wait_for_costing_dialog()
 | 
			
		||||
        self.add_prepare_dialog()
 | 
			
		||||
        self.add_select_directory_dialog()
 | 
			
		||||
        self.add_progress_dialog()
 | 
			
		||||
        self.add_maintenance_type_dialog()
 | 
			
		||||
 | 
			
		||||
    def add_upgrade_config(self, sversion):
 | 
			
		||||
        if self.upgrade_code is not None:
 | 
			
		||||
            msilib.add_data(self.db, 'Upgrade',
 | 
			
		||||
                    [(self.upgrade_code, None, sversion, None, 513, None,
 | 
			
		||||
                            "REMOVEOLDVERSION"),
 | 
			
		||||
                     (self.upgrade_code, sversion, None, None, 257, None,
 | 
			
		||||
                            "REMOVENEWVERSION")
 | 
			
		||||
                    ])
 | 
			
		||||
 | 
			
		||||
    def add_user_exit_dialog(self):
 | 
			
		||||
        dialog = distutils.command.bdist_msi.PyDialog(self.db, "UserExit",
 | 
			
		||||
                self.x, self.y, self.width, self.height, self.modal,
 | 
			
		||||
                self.title, "Finish", "Finish", "Finish")
 | 
			
		||||
        dialog.title("[ProductName] installer was interrupted")
 | 
			
		||||
        dialog.back("< Back", "Finish", active = False)
 | 
			
		||||
        dialog.cancel("Cancel", "Back", active = False)
 | 
			
		||||
        dialog.text("Description1", 15, 70, 320, 80, 0x30003,
 | 
			
		||||
                "[ProductName] setup was interrupted. Your system has not "
 | 
			
		||||
                "been modified. To install this program at a later time, "
 | 
			
		||||
                "please run the installation again.")
 | 
			
		||||
        dialog.text("Description2", 15, 155, 320, 20, 0x30003,
 | 
			
		||||
                "Click the Finish button to exit the installer.")
 | 
			
		||||
        button = dialog.next("Finish", "Cancel", name = "Finish")
 | 
			
		||||
        button.event("EndDialog", "Exit")
 | 
			
		||||
 | 
			
		||||
    def add_wait_for_costing_dialog(self):
 | 
			
		||||
        dialog = msilib.Dialog(self.db, "WaitForCostingDlg", 50, 10, 260, 85,
 | 
			
		||||
                self.modal, self.title, "Return", "Return", "Return")
 | 
			
		||||
        dialog.text("Text", 48, 15, 194, 30, 3,
 | 
			
		||||
                "Please wait while the installer finishes determining your "
 | 
			
		||||
                "disk space requirements.")
 | 
			
		||||
        button = dialog.pushbutton("Return", 102, 57, 56, 17, 3, "Return",
 | 
			
		||||
                None)
 | 
			
		||||
        button.event("EndDialog", "Exit")
 | 
			
		||||
 | 
			
		||||
    def get_initial_target_dir(self, fullname):
 | 
			
		||||
        return r"[ProgramFilesFolder]\%s" % fullname
 | 
			
		||||
 | 
			
		||||
    def get_installer_filename(self, fullname):
 | 
			
		||||
        return os.path.join(self.dist_dir, "%s.msi" % fullname)
 | 
			
		||||
 | 
			
		||||
    def initialize_options(self):
 | 
			
		||||
        distutils.command.bdist_msi.bdist_msi.initialize_options(self)
 | 
			
		||||
        self.upgrade_code = None
 | 
			
		||||
        self.add_to_path = None
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        if not self.skip_build:
 | 
			
		||||
            self.run_command('build')
 | 
			
		||||
        install = self.reinitialize_command('install', reinit_subcommands = 1)
 | 
			
		||||
        install.prefix = self.bdist_dir
 | 
			
		||||
        install.skip_build = self.skip_build
 | 
			
		||||
        install.warn_dir = 0
 | 
			
		||||
        distutils.log.info("installing to %s", self.bdist_dir)
 | 
			
		||||
        install.ensure_finalized()
 | 
			
		||||
        install.run()
 | 
			
		||||
        self.mkpath(self.dist_dir)
 | 
			
		||||
        fullname = self.distribution.get_fullname()
 | 
			
		||||
        filename = os.path.abspath(self.get_installer_filename(fullname))
 | 
			
		||||
        if os.path.exists(filename):
 | 
			
		||||
            os.unlink(filename)
 | 
			
		||||
        metadata = self.distribution.metadata
 | 
			
		||||
        author = metadata.author or metadata.maintainer or "UNKNOWN"
 | 
			
		||||
        version = metadata.get_version()
 | 
			
		||||
        sversion = "%d.%d.%d" % \
 | 
			
		||||
                distutils.version.StrictVersion(version).version
 | 
			
		||||
        self.db = msilib.init_database(filename, msilib.schema,
 | 
			
		||||
                self.distribution.metadata.name, msilib.gen_uuid(), sversion,
 | 
			
		||||
                author)
 | 
			
		||||
        msilib.add_tables(self.db, msilib.sequence)
 | 
			
		||||
        self.add_properties()
 | 
			
		||||
        self.add_config(fullname)
 | 
			
		||||
        self.add_upgrade_config(sversion)
 | 
			
		||||
        self.add_ui()
 | 
			
		||||
        self.add_files()
 | 
			
		||||
        self.db.Commit()
 | 
			
		||||
        if not self.keep_temp:
 | 
			
		||||
            distutils.dir_util.remove_tree(self.bdist_dir,
 | 
			
		||||
                    dry_run = self.dry_run)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								installer/cx_Freeze/cxfreeze
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								installer/cx_Freeze/cxfreeze
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
#!/usr/bin/python
 | 
			
		||||
 | 
			
		||||
from cx_Freeze import main
 | 
			
		||||
 | 
			
		||||
main()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										35
									
								
								installer/cx_Freeze/initscripts/Console.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								installer/cx_Freeze/initscripts/Console.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
# Console.py
 | 
			
		||||
#   Initialization script for cx_Freeze which manipulates the path so that the
 | 
			
		||||
# directory in which the executable is found is searched for extensions but
 | 
			
		||||
# no other directory is searched. It also sets the attribute sys.frozen so that
 | 
			
		||||
# the Win32 extensions behave as expected.
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import encodings
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import warnings
 | 
			
		||||
import zipimport
 | 
			
		||||
 | 
			
		||||
sys.frozen = True
 | 
			
		||||
sys.path = sys.path[:4]
 | 
			
		||||
 | 
			
		||||
os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl")
 | 
			
		||||
os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk")
 | 
			
		||||
 | 
			
		||||
m = __import__("__main__")
 | 
			
		||||
importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME)
 | 
			
		||||
if INITSCRIPT_ZIP_FILE_NAME != SHARED_ZIP_FILE_NAME:
 | 
			
		||||
    moduleName = m.__name__
 | 
			
		||||
else:
 | 
			
		||||
    name, ext = os.path.splitext(os.path.basename(os.path.normcase(FILE_NAME)))
 | 
			
		||||
    moduleName = "%s__main__" % name
 | 
			
		||||
code = importer.get_code(moduleName)
 | 
			
		||||
exec code in m.__dict__
 | 
			
		||||
 | 
			
		||||
if sys.version_info[:2] >= (2, 5):
 | 
			
		||||
    module = sys.modules.get("threading")
 | 
			
		||||
    if module is not None:
 | 
			
		||||
        module._shutdown()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								installer/cx_Freeze/initscripts/ConsoleKeepPath.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								installer/cx_Freeze/initscripts/ConsoleKeepPath.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
# ConsoleKeepPath.py
 | 
			
		||||
#   Initialization script for cx_Freeze which leaves the path alone and does
 | 
			
		||||
# not set the sys.frozen attribute.
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
import zipimport
 | 
			
		||||
 | 
			
		||||
m = __import__("__main__")
 | 
			
		||||
importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME)
 | 
			
		||||
code = importer.get_code(m.__name__)
 | 
			
		||||
exec code in m.__dict__
 | 
			
		||||
 | 
			
		||||
if sys.version_info[:2] >= (2, 5):
 | 
			
		||||
    module = sys.modules.get("threading")
 | 
			
		||||
    if module is not None:
 | 
			
		||||
        module._shutdown()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										38
									
								
								installer/cx_Freeze/initscripts/ConsoleSetLibPath.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										38
									
								
								installer/cx_Freeze/initscripts/ConsoleSetLibPath.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,38 @@
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
# ConsoleSetLibPath.py
 | 
			
		||||
#   Initialization script for cx_Freeze which manipulates the path so that the
 | 
			
		||||
# directory in which the executable is found is searched for extensions but
 | 
			
		||||
# no other directory is searched. The environment variable LD_LIBRARY_PATH is
 | 
			
		||||
# manipulated first, however, to ensure that shared libraries found in the
 | 
			
		||||
# target directory are found. This requires a restart of the executable because
 | 
			
		||||
# the environment variable LD_LIBRARY_PATH is only checked at startup.
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import encodings
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import warnings
 | 
			
		||||
import zipimport
 | 
			
		||||
 | 
			
		||||
paths = os.environ.get("LD_LIBRARY_PATH", "").split(os.pathsep)
 | 
			
		||||
if DIR_NAME not in paths:
 | 
			
		||||
    paths.insert(0, DIR_NAME)
 | 
			
		||||
    os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(paths)
 | 
			
		||||
    os.execv(sys.executable, sys.argv)
 | 
			
		||||
 | 
			
		||||
sys.frozen = True
 | 
			
		||||
sys.path = sys.path[:4]
 | 
			
		||||
 | 
			
		||||
os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl")
 | 
			
		||||
os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk")
 | 
			
		||||
 | 
			
		||||
m = __import__("__main__")
 | 
			
		||||
importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME)
 | 
			
		||||
code = importer.get_code(m.__name__)
 | 
			
		||||
exec code in m.__dict__
 | 
			
		||||
 | 
			
		||||
if sys.version_info[:2] >= (2, 5):
 | 
			
		||||
    module = sys.modules.get("threading")
 | 
			
		||||
    if module is not None:
 | 
			
		||||
        module._shutdown()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								installer/cx_Freeze/initscripts/SharedLib.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								installer/cx_Freeze/initscripts/SharedLib.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
# SharedLib.py
 | 
			
		||||
#   Initialization script for cx_Freeze which behaves similarly to the one for
 | 
			
		||||
# console based applications but must handle the case where Python has already
 | 
			
		||||
# been initialized and another DLL of this kind has been loaded. As such it
 | 
			
		||||
# does not block the path unless sys.frozen is not already set.
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import encodings
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import warnings
 | 
			
		||||
 | 
			
		||||
if not hasattr(sys, "frozen"):
 | 
			
		||||
    sys.frozen = True
 | 
			
		||||
    sys.path = sys.path[:4]
 | 
			
		||||
 | 
			
		||||
os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl")
 | 
			
		||||
os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk")
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								installer/cx_Freeze/initscripts/SharedLibSource.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										23
									
								
								installer/cx_Freeze/initscripts/SharedLibSource.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
# SharedLibSource.py
 | 
			
		||||
#   Initialization script for cx_Freeze which imports the site module (as per
 | 
			
		||||
# normal processing of a Python script) and then searches for a file with the
 | 
			
		||||
# same name as the shared library but with the extension .pth. The entries in
 | 
			
		||||
# this file are used to modify the path to use for subsequent imports.
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import warnings
 | 
			
		||||
 | 
			
		||||
# the site module must be imported for normal behavior to take place; it is
 | 
			
		||||
# done dynamically so that cx_Freeze will not add all modules referenced by
 | 
			
		||||
# the site module to the frozen executable
 | 
			
		||||
__import__("site")
 | 
			
		||||
 | 
			
		||||
# now locate the pth file to modify the path appropriately
 | 
			
		||||
baseName, ext = os.path.splitext(FILE_NAME)
 | 
			
		||||
pathFileName = baseName + ".pth"
 | 
			
		||||
sys.path = [s.strip() for s in file(pathFileName).read().splitlines()] + \
 | 
			
		||||
        sys.path
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										7
									
								
								installer/cx_Freeze/samples/advanced/advanced_1.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								installer/cx_Freeze/samples/advanced/advanced_1.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
print "Hello from cx_Freeze Advanced #1"
 | 
			
		||||
print
 | 
			
		||||
 | 
			
		||||
module = __import__("testfreeze_1")
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										7
									
								
								installer/cx_Freeze/samples/advanced/advanced_2.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								installer/cx_Freeze/samples/advanced/advanced_2.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
print "Hello from cx_Freeze Advanced #2"
 | 
			
		||||
print
 | 
			
		||||
 | 
			
		||||
module = __import__("testfreeze_2")
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1 @@
 | 
			
		||||
print "Test freeze module #1"
 | 
			
		||||
@ -0,0 +1 @@
 | 
			
		||||
print "Test freeze module #2"
 | 
			
		||||
							
								
								
									
										31
									
								
								installer/cx_Freeze/samples/advanced/setup.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								installer/cx_Freeze/samples/advanced/setup.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
# An advanced setup script to create multiple executables and demonstrate a few
 | 
			
		||||
# of the features available to setup scripts
 | 
			
		||||
#
 | 
			
		||||
# hello.py is a very simple "Hello, world" type script which also displays the
 | 
			
		||||
# environment in which the script runs
 | 
			
		||||
#
 | 
			
		||||
# Run the build process by running the command 'python setup.py build'
 | 
			
		||||
#
 | 
			
		||||
# If everything works well you should find a subdirectory in the build
 | 
			
		||||
# subdirectory that contains the files needed to run the script without Python
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
from cx_Freeze import setup, Executable
 | 
			
		||||
 | 
			
		||||
executables = [
 | 
			
		||||
        Executable("advanced_1.py"),
 | 
			
		||||
        Executable("advanced_2.py")
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
buildOptions = dict(
 | 
			
		||||
        compressed = True,
 | 
			
		||||
        includes = ["testfreeze_1", "testfreeze_2"],
 | 
			
		||||
        path = sys.path + ["modules"])
 | 
			
		||||
 | 
			
		||||
setup(
 | 
			
		||||
        name = "advanced_cx_Freeze_sample",
 | 
			
		||||
        version = "0.1",
 | 
			
		||||
        description = "Advanced sample cx_Freeze script",
 | 
			
		||||
        options = dict(build_exe = buildOptions),
 | 
			
		||||
        executables = executables)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										27
									
								
								installer/cx_Freeze/samples/matplotlib/setup.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								installer/cx_Freeze/samples/matplotlib/setup.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
# A simple setup script to create an executable using matplotlib.
 | 
			
		||||
#
 | 
			
		||||
# test_matplotlib.py is a very simple matplotlib application that demonstrates
 | 
			
		||||
# its use.
 | 
			
		||||
#
 | 
			
		||||
# Run the build process by running the command 'python setup.py build'
 | 
			
		||||
#
 | 
			
		||||
# If everything works well you should find a subdirectory in the build
 | 
			
		||||
# subdirectory that contains the files needed to run the application
 | 
			
		||||
 | 
			
		||||
import cx_Freeze
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
base = None
 | 
			
		||||
if sys.platform == "win32":
 | 
			
		||||
    base = "Win32GUI"
 | 
			
		||||
 | 
			
		||||
executables = [
 | 
			
		||||
        cx_Freeze.Executable("test_matplotlib.py", base = base)
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
cx_Freeze.setup(
 | 
			
		||||
        name = "test_matplotlib",
 | 
			
		||||
        version = "0.1",
 | 
			
		||||
        description = "Sample matplotlib script",
 | 
			
		||||
        executables = executables)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										48
									
								
								installer/cx_Freeze/samples/matplotlib/test_matplotlib.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								installer/cx_Freeze/samples/matplotlib/test_matplotlib.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,48 @@
 | 
			
		||||
from numpy import arange, sin, pi
 | 
			
		||||
import matplotlib
 | 
			
		||||
matplotlib.use('WXAgg')
 | 
			
		||||
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
 | 
			
		||||
from matplotlib.backends.backend_wx import NavigationToolbar2Wx
 | 
			
		||||
from matplotlib.figure import Figure
 | 
			
		||||
from wx import *
 | 
			
		||||
 | 
			
		||||
class CanvasFrame(Frame):
 | 
			
		||||
   def __init__(self):
 | 
			
		||||
       Frame.__init__(self,None,-1, 'CanvasFrame',size=(550,350))
 | 
			
		||||
       self.SetBackgroundColour(NamedColor("WHITE"))
 | 
			
		||||
       self.figure = Figure()
 | 
			
		||||
       self.axes = self.figure.add_subplot(111)
 | 
			
		||||
       t = arange(0.0,3.0,0.01)
 | 
			
		||||
       s = sin(2*pi*t)
 | 
			
		||||
       self.axes.plot(t,s)
 | 
			
		||||
       self.canvas = FigureCanvas(self, -1, self.figure)
 | 
			
		||||
       self.sizer = BoxSizer(VERTICAL)
 | 
			
		||||
       self.sizer.Add(self.canvas, 1, LEFT | TOP | GROW)
 | 
			
		||||
       self.SetSizerAndFit(self.sizer)
 | 
			
		||||
       self.add_toolbar()
 | 
			
		||||
 | 
			
		||||
   def add_toolbar(self):
 | 
			
		||||
       self.toolbar = NavigationToolbar2Wx(self.canvas)
 | 
			
		||||
       self.toolbar.Realize()
 | 
			
		||||
       if Platform == '__WXMAC__':
 | 
			
		||||
           self.SetToolBar(self.toolbar)
 | 
			
		||||
       else:
 | 
			
		||||
           tw, th = self.toolbar.GetSizeTuple()
 | 
			
		||||
           fw, fh = self.canvas.GetSizeTuple()
 | 
			
		||||
           self.toolbar.SetSize(Size(fw, th))
 | 
			
		||||
           self.sizer.Add(self.toolbar, 0, LEFT | EXPAND)
 | 
			
		||||
       self.toolbar.update()
 | 
			
		||||
 | 
			
		||||
   def OnPaint(self, event):
 | 
			
		||||
       self.canvas.draw()
 | 
			
		||||
 | 
			
		||||
class App(App):
 | 
			
		||||
   def OnInit(self):
 | 
			
		||||
       'Create the main window and insert the custom frame'
 | 
			
		||||
       frame = CanvasFrame()
 | 
			
		||||
       frame.Show(True)
 | 
			
		||||
       return True
 | 
			
		||||
 | 
			
		||||
app = App(0)
 | 
			
		||||
app.MainLoop()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								installer/cx_Freeze/samples/relimport/pkg1/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								installer/cx_Freeze/samples/relimport/pkg1/__init__.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
print "importing pkg1"
 | 
			
		||||
from . import sub1
 | 
			
		||||
from . import pkg2
 | 
			
		||||
@ -0,0 +1,3 @@
 | 
			
		||||
print "importing pkg1.pkg2"
 | 
			
		||||
from . import sub3
 | 
			
		||||
from .. import sub4
 | 
			
		||||
							
								
								
									
										3
									
								
								installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub3.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub3.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
print "importing pkg1.pkg2.sub3"
 | 
			
		||||
from . import sub5
 | 
			
		||||
from .. import sub6
 | 
			
		||||
							
								
								
									
										1
									
								
								installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub5.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub5.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
print "importing pkg1.pkg2.sub5"
 | 
			
		||||
							
								
								
									
										2
									
								
								installer/cx_Freeze/samples/relimport/pkg1/sub1.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								installer/cx_Freeze/samples/relimport/pkg1/sub1.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
print "importing pkg1.sub1"
 | 
			
		||||
from . import sub2
 | 
			
		||||
							
								
								
									
										1
									
								
								installer/cx_Freeze/samples/relimport/pkg1/sub2.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								installer/cx_Freeze/samples/relimport/pkg1/sub2.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
print "importing pkg1.sub2"
 | 
			
		||||
							
								
								
									
										1
									
								
								installer/cx_Freeze/samples/relimport/pkg1/sub4.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								installer/cx_Freeze/samples/relimport/pkg1/sub4.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
print 'importing pkg1.sub4'
 | 
			
		||||
							
								
								
									
										1
									
								
								installer/cx_Freeze/samples/relimport/pkg1/sub6.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								installer/cx_Freeze/samples/relimport/pkg1/sub6.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
print "importing pkg1.sub6"
 | 
			
		||||
							
								
								
									
										1
									
								
								installer/cx_Freeze/samples/relimport/relimport.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								installer/cx_Freeze/samples/relimport/relimport.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
import pkg1
 | 
			
		||||
							
								
								
									
										16
									
								
								installer/cx_Freeze/samples/relimport/setup.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								installer/cx_Freeze/samples/relimport/setup.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
# relimport.py is a very simple script that tests importing using relative
 | 
			
		||||
# imports (available in Python 2.5 and up)
 | 
			
		||||
#
 | 
			
		||||
# Run the build process by running the command 'python setup.py build'
 | 
			
		||||
#
 | 
			
		||||
# If everything works well you should find a subdirectory in the build
 | 
			
		||||
# subdirectory that contains the files needed to run the script without Python
 | 
			
		||||
 | 
			
		||||
from cx_Freeze import setup, Executable
 | 
			
		||||
 | 
			
		||||
setup(
 | 
			
		||||
        name = "relimport",
 | 
			
		||||
        version = "0.1",
 | 
			
		||||
        description = "Sample cx_Freeze script for relative imports",
 | 
			
		||||
        executables = [Executable("relimport.py")])
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								installer/cx_Freeze/samples/simple/hello.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								installer/cx_Freeze/samples/simple/hello.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
print "Hello from cx_Freeze"
 | 
			
		||||
print
 | 
			
		||||
 | 
			
		||||
print "sys.executable", sys.executable
 | 
			
		||||
print "sys.prefix", sys.prefix
 | 
			
		||||
print
 | 
			
		||||
 | 
			
		||||
print "ARGUMENTS:"
 | 
			
		||||
for a in sys.argv:
 | 
			
		||||
    print a
 | 
			
		||||
print
 | 
			
		||||
 | 
			
		||||
print "PATH:"
 | 
			
		||||
for p in sys.path:
 | 
			
		||||
    print p
 | 
			
		||||
print
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								installer/cx_Freeze/samples/simple/setup.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								installer/cx_Freeze/samples/simple/setup.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
			
		||||
# A very simple setup script to create a single executable
 | 
			
		||||
#
 | 
			
		||||
# hello.py is a very simple "Hello, world" type script which also displays the
 | 
			
		||||
# environment in which the script runs
 | 
			
		||||
#
 | 
			
		||||
# Run the build process by running the command 'python setup.py build'
 | 
			
		||||
#
 | 
			
		||||
# If everything works well you should find a subdirectory in the build
 | 
			
		||||
# subdirectory that contains the files needed to run the script without Python
 | 
			
		||||
 | 
			
		||||
from cx_Freeze import setup, Executable
 | 
			
		||||
 | 
			
		||||
setup(
 | 
			
		||||
        name = "hello",
 | 
			
		||||
        version = "0.1",
 | 
			
		||||
        description = "Sample cx_Freeze script",
 | 
			
		||||
        executables = [Executable("hello.py")])
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										25
									
								
								installer/cx_Freeze/samples/wx/setup.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								installer/cx_Freeze/samples/wx/setup.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
# A simple setup script to create an executable running wxPython. This also
 | 
			
		||||
# demonstrates the method for creating a Windows executable that does not have
 | 
			
		||||
# an associated console.
 | 
			
		||||
#
 | 
			
		||||
# wxapp.py is a very simple "Hello, world" type wxPython application
 | 
			
		||||
#
 | 
			
		||||
# Run the build process by running the command 'python setup.py build'
 | 
			
		||||
#
 | 
			
		||||
# If everything works well you should find a subdirectory in the build
 | 
			
		||||
# subdirectory that contains the files needed to run the application
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
from cx_Freeze import setup, Executable
 | 
			
		||||
 | 
			
		||||
base = None
 | 
			
		||||
if sys.platform == "win32":
 | 
			
		||||
    base = "Win32GUI"
 | 
			
		||||
 | 
			
		||||
setup(
 | 
			
		||||
        name = "hello",
 | 
			
		||||
        version = "0.1",
 | 
			
		||||
        description = "Sample cx_Freeze wxPython script",
 | 
			
		||||
        executables = [Executable("wxapp.py", base = base)])
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										42
									
								
								installer/cx_Freeze/samples/wx/wxapp.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								installer/cx_Freeze/samples/wx/wxapp.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
import wx
 | 
			
		||||
 | 
			
		||||
class Frame(wx.Frame):
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        wx.Frame.__init__(self, parent = None, title = "Hello from cx_Freeze")
 | 
			
		||||
        panel = wx.Panel(self)
 | 
			
		||||
        closeMeButton = wx.Button(panel, -1, "Close Me")
 | 
			
		||||
        wx.EVT_BUTTON(self, closeMeButton.GetId(), self.OnCloseMe)
 | 
			
		||||
        wx.EVT_CLOSE(self, self.OnCloseWindow)
 | 
			
		||||
        pushMeButton = wx.Button(panel, -1, "Push Me")
 | 
			
		||||
        wx.EVT_BUTTON(self, pushMeButton.GetId(), self.OnPushMe)
 | 
			
		||||
        sizer = wx.BoxSizer(wx.HORIZONTAL)
 | 
			
		||||
        sizer.Add(closeMeButton, flag = wx.ALL, border = 20)
 | 
			
		||||
        sizer.Add(pushMeButton, flag = wx.ALL, border = 20)
 | 
			
		||||
        panel.SetSizer(sizer)
 | 
			
		||||
        topSizer = wx.BoxSizer(wx.VERTICAL)
 | 
			
		||||
        topSizer.Add(panel, flag = wx.ALL | wx.EXPAND)
 | 
			
		||||
        topSizer.Fit(self)
 | 
			
		||||
 | 
			
		||||
    def OnCloseMe(self, event):
 | 
			
		||||
        self.Close(True)
 | 
			
		||||
 | 
			
		||||
    def OnPushMe(self, event):
 | 
			
		||||
        1 / 0
 | 
			
		||||
 | 
			
		||||
    def OnCloseWindow(self, event):
 | 
			
		||||
        self.Destroy()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class App(wx.App):
 | 
			
		||||
 | 
			
		||||
    def OnInit(self):
 | 
			
		||||
        frame = Frame()
 | 
			
		||||
        frame.Show(True)
 | 
			
		||||
        self.SetTopWindow(frame)
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
app = App(1)
 | 
			
		||||
app.MainLoop()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										197
									
								
								installer/cx_Freeze/setup.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										197
									
								
								installer/cx_Freeze/setup.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,197 @@
 | 
			
		||||
"""
 | 
			
		||||
Distutils script for cx_Freeze.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import distutils.command.bdist_rpm
 | 
			
		||||
import distutils.command.build_ext
 | 
			
		||||
import distutils.command.build_scripts
 | 
			
		||||
import distutils.command.install
 | 
			
		||||
import distutils.command.install_data
 | 
			
		||||
import distutils.sysconfig
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
from distutils.core import setup
 | 
			
		||||
from distutils.extension import Extension
 | 
			
		||||
 | 
			
		||||
class bdist_rpm(distutils.command.bdist_rpm.bdist_rpm):
 | 
			
		||||
 | 
			
		||||
    # rpm automatically byte compiles all Python files in a package but we
 | 
			
		||||
    # don't want that to happen for initscripts and samples so we tell it to
 | 
			
		||||
    # ignore those files
 | 
			
		||||
    def _make_spec_file(self):
 | 
			
		||||
        specFile = distutils.command.bdist_rpm.bdist_rpm._make_spec_file(self)
 | 
			
		||||
        specFile.insert(0, "%define _unpackaged_files_terminate_build 0%{nil}")
 | 
			
		||||
        return specFile
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        distutils.command.bdist_rpm.bdist_rpm.run(self)
 | 
			
		||||
        specFile = os.path.join(self.rpm_base, "SPECS",
 | 
			
		||||
                "%s.spec" % self.distribution.get_name())
 | 
			
		||||
        queryFormat = "%{name}-%{version}-%{release}.%{arch}.rpm"
 | 
			
		||||
        command = "rpm -q --qf '%s' --specfile %s" % (queryFormat, specFile)
 | 
			
		||||
        origFileName = os.popen(command).read()
 | 
			
		||||
        parts = origFileName.split("-")
 | 
			
		||||
        parts.insert(2, "py%s%s" % sys.version_info[:2])
 | 
			
		||||
        newFileName = "-".join(parts)
 | 
			
		||||
        self.move_file(os.path.join("dist", origFileName),
 | 
			
		||||
                os.path.join("dist", newFileName))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class build_ext(distutils.command.build_ext.build_ext):
 | 
			
		||||
 | 
			
		||||
    def build_extension(self, ext):
 | 
			
		||||
        if ext.name.find("bases") < 0:
 | 
			
		||||
            distutils.command.build_ext.build_ext.build_extension(self, ext)
 | 
			
		||||
            return
 | 
			
		||||
        os.environ["LD_RUN_PATH"] = "${ORIGIN}:${ORIGIN}/../lib"
 | 
			
		||||
        objects = self.compiler.compile(ext.sources,
 | 
			
		||||
                output_dir = self.build_temp,
 | 
			
		||||
                include_dirs = ext.include_dirs,
 | 
			
		||||
                debug = self.debug,
 | 
			
		||||
                depends = ext.depends)
 | 
			
		||||
        fileName = os.path.splitext(self.get_ext_filename(ext.name))[0]
 | 
			
		||||
        fullName = os.path.join(self.build_lib, fileName)
 | 
			
		||||
        libraryDirs = ext.library_dirs or []
 | 
			
		||||
        libraries = self.get_libraries(ext)
 | 
			
		||||
        extraArgs = ext.extra_link_args or []
 | 
			
		||||
        if sys.platform != "win32":
 | 
			
		||||
            vars = distutils.sysconfig.get_config_vars()
 | 
			
		||||
            libraryDirs.append(vars["LIBPL"])
 | 
			
		||||
            libraries.append("python%s.%s" % sys.version_info[:2])
 | 
			
		||||
            if vars["LINKFORSHARED"]:
 | 
			
		||||
                extraArgs.extend(vars["LINKFORSHARED"].split())
 | 
			
		||||
            if vars["LIBS"]:
 | 
			
		||||
                extraArgs.extend(vars["LIBS"].split())
 | 
			
		||||
            if vars["LIBM"]:
 | 
			
		||||
                extraArgs.append(vars["LIBM"])
 | 
			
		||||
            if vars["BASEMODLIBS"]:
 | 
			
		||||
                extraArgs.extend(vars["BASEMODLIBS"].split())
 | 
			
		||||
            if vars["LOCALMODLIBS"]:
 | 
			
		||||
                extraArgs.extend(vars["LOCALMODLIBS"].split())
 | 
			
		||||
            extraArgs.append("-s")
 | 
			
		||||
        self.compiler.link_executable(objects, fullName,
 | 
			
		||||
                libraries = libraries,
 | 
			
		||||
                library_dirs = libraryDirs,
 | 
			
		||||
                runtime_library_dirs = ext.runtime_library_dirs,
 | 
			
		||||
                extra_postargs = extraArgs,
 | 
			
		||||
                debug = self.debug)
 | 
			
		||||
 | 
			
		||||
    def get_ext_filename(self, name):
 | 
			
		||||
        fileName = distutils.command.build_ext.build_ext.get_ext_filename(self,
 | 
			
		||||
                name)
 | 
			
		||||
        if name.find("bases") < 0:
 | 
			
		||||
            return fileName
 | 
			
		||||
        ext = self.compiler.exe_extension or ""
 | 
			
		||||
        return os.path.splitext(fileName)[0] + ext
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class build_scripts(distutils.command.build_scripts.build_scripts):
 | 
			
		||||
 | 
			
		||||
    def copy_scripts(self):
 | 
			
		||||
        distutils.command.build_scripts.build_scripts.copy_scripts(self)
 | 
			
		||||
        if sys.platform == "win32":
 | 
			
		||||
            for script in self.scripts:
 | 
			
		||||
                batFileName = os.path.join(self.build_dir, script + ".bat")
 | 
			
		||||
                fullScriptName = r"%s\Scripts\%s" % \
 | 
			
		||||
                        (os.path.dirname(sys.executable), script)
 | 
			
		||||
                command = "%s %s %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9" % \
 | 
			
		||||
                        (sys.executable, fullScriptName)
 | 
			
		||||
                file(batFileName, "w").write("@echo off\n\n%s" % command)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class install(distutils.command.install.install):
 | 
			
		||||
 | 
			
		||||
    def get_sub_commands(self):
 | 
			
		||||
        subCommands = distutils.command.install.install.get_sub_commands(self)
 | 
			
		||||
        subCommands.append("install_packagedata")
 | 
			
		||||
        return subCommands
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class install_packagedata(distutils.command.install_data.install_data):
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        installCommand = self.get_finalized_command("install")
 | 
			
		||||
        installDir = getattr(installCommand, "install_lib")
 | 
			
		||||
        sourceDirs = ["samples", "initscripts"]
 | 
			
		||||
        while sourceDirs:
 | 
			
		||||
            sourceDir = sourceDirs.pop(0)
 | 
			
		||||
            targetDir = os.path.join(installDir, "cx_Freeze", sourceDir)
 | 
			
		||||
            self.mkpath(targetDir)
 | 
			
		||||
            for name in os.listdir(sourceDir):
 | 
			
		||||
                if name == "build" or name.startswith("."):
 | 
			
		||||
                    continue
 | 
			
		||||
                fullSourceName = os.path.join(sourceDir, name)
 | 
			
		||||
                if os.path.isdir(fullSourceName):
 | 
			
		||||
                    sourceDirs.append(fullSourceName)
 | 
			
		||||
                else:
 | 
			
		||||
                    fullTargetName = os.path.join(targetDir, name)
 | 
			
		||||
                    self.copy_file(fullSourceName, fullTargetName)
 | 
			
		||||
                    self.outfiles.append(fullTargetName)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
commandClasses = dict(
 | 
			
		||||
        build_ext = build_ext,
 | 
			
		||||
        build_scripts = build_scripts,
 | 
			
		||||
        bdist_rpm = bdist_rpm,
 | 
			
		||||
        install = install,
 | 
			
		||||
        install_packagedata = install_packagedata)
 | 
			
		||||
 | 
			
		||||
if sys.platform == "win32":
 | 
			
		||||
    libraries = ["imagehlp"]
 | 
			
		||||
else:
 | 
			
		||||
    libraries = []
 | 
			
		||||
utilModule = Extension("cx_Freeze.util", ["source/util.c"],
 | 
			
		||||
        libraries = libraries)
 | 
			
		||||
depends = ["source/bases/Common.c"]
 | 
			
		||||
if sys.platform == "win32":
 | 
			
		||||
    if sys.version_info[:2] >= (2, 6):
 | 
			
		||||
        extraSources = ["source/bases/manifest.rc"]
 | 
			
		||||
    else:
 | 
			
		||||
        extraSources = ["source/bases/dummy.rc"]
 | 
			
		||||
else:
 | 
			
		||||
    extraSources = []
 | 
			
		||||
console = Extension("cx_Freeze.bases.Console",
 | 
			
		||||
        ["source/bases/Console.c"] + extraSources, depends = depends)
 | 
			
		||||
consoleKeepPath = Extension("cx_Freeze.bases.ConsoleKeepPath",
 | 
			
		||||
        ["source/bases/ConsoleKeepPath.c"] + extraSources, depends = depends)
 | 
			
		||||
extensions = [utilModule, console, consoleKeepPath]
 | 
			
		||||
if sys.platform == "win32":
 | 
			
		||||
    gui = Extension("cx_Freeze.bases.Win32GUI",
 | 
			
		||||
            ["source/bases/Win32GUI.c"] + extraSources,
 | 
			
		||||
            depends = depends, extra_link_args = ["-mwindows"])
 | 
			
		||||
    extensions.append(gui)
 | 
			
		||||
 | 
			
		||||
docFiles = "LICENSE.txt README.txt HISTORY.txt doc/cx_Freeze.html"
 | 
			
		||||
 | 
			
		||||
classifiers = [
 | 
			
		||||
        "Development Status :: 5 - Production/Stable",
 | 
			
		||||
        "Intended Audience :: Developers",
 | 
			
		||||
        "License :: OSI Approved :: Python Software Foundation License",
 | 
			
		||||
        "Natural Language :: English",
 | 
			
		||||
        "Operating System :: OS Independent",
 | 
			
		||||
        "Programming Language :: C",
 | 
			
		||||
        "Programming Language :: Python",
 | 
			
		||||
        "Topic :: Software Development :: Build Tools",
 | 
			
		||||
        "Topic :: Software Development :: Libraries :: Python Modules",
 | 
			
		||||
        "Topic :: System :: Software Distribution",
 | 
			
		||||
        "Topic :: Utilities"
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
setup(name = "cx_Freeze",
 | 
			
		||||
        description = "create standalone executables from Python scripts",
 | 
			
		||||
        long_description = "create standalone executables from Python scripts",
 | 
			
		||||
        version = "4.0.1",
 | 
			
		||||
        cmdclass = commandClasses,
 | 
			
		||||
        options = dict(bdist_rpm = dict(doc_files = docFiles),
 | 
			
		||||
                install = dict(optimize = 1)),
 | 
			
		||||
        ext_modules = extensions,
 | 
			
		||||
        packages = ['cx_Freeze'],
 | 
			
		||||
        maintainer="Anthony Tuininga",
 | 
			
		||||
        maintainer_email="anthony.tuininga@gmail.com",
 | 
			
		||||
        url = "http://cx-freeze.sourceforge.net",
 | 
			
		||||
        scripts = ["cxfreeze"],
 | 
			
		||||
        classifiers = classifiers,
 | 
			
		||||
        keywords = "freeze",
 | 
			
		||||
        license = "Python Software Foundation License")
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										262
									
								
								installer/cx_Freeze/source/bases/Common.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										262
									
								
								installer/cx_Freeze/source/bases/Common.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,262 @@
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Common.c
 | 
			
		||||
//   Routines which are common to running frozen executables.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <compile.h>
 | 
			
		||||
#include <eval.h>
 | 
			
		||||
#include <osdefs.h>
 | 
			
		||||
 | 
			
		||||
// global variables (used for simplicity)
 | 
			
		||||
static PyObject *g_FileName = NULL;
 | 
			
		||||
static PyObject *g_DirName = NULL;
 | 
			
		||||
static PyObject *g_ExclusiveZipFileName = NULL;
 | 
			
		||||
static PyObject *g_SharedZipFileName = NULL;
 | 
			
		||||
static PyObject *g_InitScriptZipFileName = NULL;
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// GetDirName()
 | 
			
		||||
//   Return the directory name of the given path.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int GetDirName(
 | 
			
		||||
    const char *path,                   // path to calculate dir name for
 | 
			
		||||
    PyObject **dirName)                 // directory name (OUT)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i = strlen(path); i > 0 && path[i] != SEP; --i);
 | 
			
		||||
    *dirName = PyString_FromStringAndSize(path, i);
 | 
			
		||||
    if (!*dirName)
 | 
			
		||||
        return FatalError("cannot create string for directory name");
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// SetExecutableName()
 | 
			
		||||
//   Set the script to execute and calculate the directory in which the
 | 
			
		||||
// executable is found as well as the exclusive (only for this executable) and
 | 
			
		||||
// shared zip file names.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int SetExecutableName(
 | 
			
		||||
    const char *fileName)               // script to execute
 | 
			
		||||
{
 | 
			
		||||
    char temp[MAXPATHLEN + 12], *ptr;
 | 
			
		||||
#ifndef WIN32
 | 
			
		||||
    char linkData[MAXPATHLEN + 1];
 | 
			
		||||
    struct stat statData;
 | 
			
		||||
    size_t linkSize, i;
 | 
			
		||||
    PyObject *dirName;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // store file name
 | 
			
		||||
    g_FileName = PyString_FromString(fileName);
 | 
			
		||||
    if (!g_FileName)
 | 
			
		||||
        return FatalError("cannot create string for file name");
 | 
			
		||||
 | 
			
		||||
#ifndef WIN32
 | 
			
		||||
    for (i = 0; i < 25; i++) {
 | 
			
		||||
        if (lstat(fileName, &statData) < 0) {
 | 
			
		||||
            PyErr_SetFromErrnoWithFilename(PyExc_OSError, (char*) fileName);
 | 
			
		||||
            return FatalError("unable to stat file");
 | 
			
		||||
        }
 | 
			
		||||
        if (!S_ISLNK(statData.st_mode))
 | 
			
		||||
            break;
 | 
			
		||||
        linkSize = readlink(fileName, linkData, sizeof(linkData));
 | 
			
		||||
        if (linkSize < 0) {
 | 
			
		||||
            PyErr_SetFromErrnoWithFilename(PyExc_OSError, (char*) fileName);
 | 
			
		||||
            return FatalError("unable to stat file");
 | 
			
		||||
        }
 | 
			
		||||
        if (linkData[0] == '/') {
 | 
			
		||||
            Py_DECREF(g_FileName);
 | 
			
		||||
            g_FileName = PyString_FromStringAndSize(linkData, linkSize);
 | 
			
		||||
        } else {
 | 
			
		||||
            if (GetDirName(PyString_AS_STRING(g_FileName), &dirName) < 0)
 | 
			
		||||
                return -1;
 | 
			
		||||
            if (PyString_GET_SIZE(dirName) + linkSize + 1 > MAXPATHLEN) {
 | 
			
		||||
                Py_DECREF(dirName);
 | 
			
		||||
                return FatalError("cannot dereference link, path too large");
 | 
			
		||||
            }
 | 
			
		||||
            strcpy(temp, PyString_AS_STRING(dirName));
 | 
			
		||||
            strcat(temp, "/");
 | 
			
		||||
            strcat(temp, linkData);
 | 
			
		||||
            Py_DECREF(g_FileName);
 | 
			
		||||
            g_FileName = PyString_FromString(temp);
 | 
			
		||||
        }
 | 
			
		||||
        if (!g_FileName)
 | 
			
		||||
            return FatalError("cannot create string for linked file name");
 | 
			
		||||
        fileName = PyString_AS_STRING(g_FileName);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // calculate and store directory name
 | 
			
		||||
    if (GetDirName(fileName, &g_DirName) < 0)
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    // calculate and store exclusive zip file name
 | 
			
		||||
    strcpy(temp, fileName);
 | 
			
		||||
    ptr = temp + strlen(temp) - 1;
 | 
			
		||||
    while (ptr > temp && *ptr != SEP && *ptr != '.')
 | 
			
		||||
        ptr--;
 | 
			
		||||
    if (*ptr == '.')
 | 
			
		||||
        *ptr = '\0';
 | 
			
		||||
    strcat(temp, ".zip");
 | 
			
		||||
    g_ExclusiveZipFileName = PyString_FromString(temp);
 | 
			
		||||
    if (!g_ExclusiveZipFileName)
 | 
			
		||||
        return FatalError("cannot create string for exclusive zip file name");
 | 
			
		||||
 | 
			
		||||
    // calculate and store shared zip file name
 | 
			
		||||
    strcpy(temp, PyString_AS_STRING(g_DirName));
 | 
			
		||||
    ptr = temp + strlen(temp);
 | 
			
		||||
    *ptr++ = SEP;
 | 
			
		||||
    strcpy(ptr, "library.zip");
 | 
			
		||||
    g_SharedZipFileName = PyString_FromString(temp);
 | 
			
		||||
    if (!g_SharedZipFileName)
 | 
			
		||||
        return FatalError("cannot create string for shared zip file name");
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// SetPathToSearch()
 | 
			
		||||
//   Set the path to search. This includes the file (for those situations where
 | 
			
		||||
// a zip file is attached to the executable itself), the directory where the
 | 
			
		||||
// executable is found (to search for extensions), the exclusive zip file
 | 
			
		||||
// name and the shared zip file name.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int SetPathToSearch(void)
 | 
			
		||||
{
 | 
			
		||||
    PyObject *pathList;
 | 
			
		||||
 | 
			
		||||
    pathList = PySys_GetObject("path");
 | 
			
		||||
    if (!pathList)
 | 
			
		||||
        return FatalError("cannot acquire sys.path");
 | 
			
		||||
    if (PyList_Insert(pathList, 0, g_FileName) < 0)
 | 
			
		||||
        return FatalError("cannot insert file name into sys.path");
 | 
			
		||||
    if (PyList_Insert(pathList, 1, g_DirName) < 0)
 | 
			
		||||
        return FatalError("cannot insert directory name into sys.path");
 | 
			
		||||
    if (PyList_Insert(pathList, 2, g_ExclusiveZipFileName) < 0)
 | 
			
		||||
        return FatalError("cannot insert exclusive zip name into sys.path");
 | 
			
		||||
    if (PyList_Insert(pathList, 3, g_SharedZipFileName) < 0)
 | 
			
		||||
        return FatalError("cannot insert shared zip name into sys.path");
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// GetImporterHelper()
 | 
			
		||||
//   Helper which is used to locate the importer for the initscript.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyObject *GetImporterHelper(
 | 
			
		||||
    PyObject *module,                   // zipimport module
 | 
			
		||||
    PyObject *fileName)                 // name of file to search
 | 
			
		||||
{
 | 
			
		||||
    PyObject *importer;
 | 
			
		||||
 | 
			
		||||
    importer = PyObject_CallMethod(module, "zipimporter", "O", fileName);
 | 
			
		||||
    if (importer)
 | 
			
		||||
        g_InitScriptZipFileName = fileName;
 | 
			
		||||
    else
 | 
			
		||||
        PyErr_Clear();
 | 
			
		||||
    return importer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// GetImporter()
 | 
			
		||||
//   Return the importer which will be used for importing the initialization
 | 
			
		||||
// script. The executable itself is searched first, followed by the exclusive
 | 
			
		||||
// zip file and finally by the shared zip file.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int GetImporter(
 | 
			
		||||
    PyObject **importer)                // importer (OUT)
 | 
			
		||||
{
 | 
			
		||||
    PyObject *module;
 | 
			
		||||
 | 
			
		||||
    module = PyImport_ImportModule("zipimport");
 | 
			
		||||
    if (!module)
 | 
			
		||||
        return FatalError("cannot import zipimport module");
 | 
			
		||||
    *importer = GetImporterHelper(module, g_FileName);
 | 
			
		||||
    if (!*importer) {
 | 
			
		||||
        *importer = GetImporterHelper(module, g_ExclusiveZipFileName);
 | 
			
		||||
        if (!*importer)
 | 
			
		||||
            *importer = GetImporterHelper(module, g_SharedZipFileName);
 | 
			
		||||
    }
 | 
			
		||||
    Py_DECREF(module);
 | 
			
		||||
    if (!*importer)
 | 
			
		||||
        return FatalError("cannot get zipimporter instance");
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// PopulateInitScriptDict()
 | 
			
		||||
//   Return the dictionary used by the initialization script.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int PopulateInitScriptDict(
 | 
			
		||||
    PyObject *dict)                     // dictionary to populate
 | 
			
		||||
{
 | 
			
		||||
    if (!dict)
 | 
			
		||||
        return FatalError("unable to create temporary dictionary");
 | 
			
		||||
    if (PyDict_SetItemString(dict, "__builtins__", PyEval_GetBuiltins()) < 0)
 | 
			
		||||
        return FatalError("unable to set __builtins__");
 | 
			
		||||
    if (PyDict_SetItemString(dict, "FILE_NAME", g_FileName) < 0)
 | 
			
		||||
        return FatalError("unable to set FILE_NAME");
 | 
			
		||||
    if (PyDict_SetItemString(dict, "DIR_NAME", g_DirName) < 0)
 | 
			
		||||
        return FatalError("unable to set DIR_NAME");
 | 
			
		||||
    if (PyDict_SetItemString(dict, "EXCLUSIVE_ZIP_FILE_NAME",
 | 
			
		||||
            g_ExclusiveZipFileName) < 0)
 | 
			
		||||
        return FatalError("unable to set EXCLUSIVE_ZIP_FILE_NAME");
 | 
			
		||||
    if (PyDict_SetItemString(dict, "SHARED_ZIP_FILE_NAME",
 | 
			
		||||
            g_SharedZipFileName) < 0)
 | 
			
		||||
        return FatalError("unable to set SHARED_ZIP_FILE_NAME");
 | 
			
		||||
    if (PyDict_SetItemString(dict, "INITSCRIPT_ZIP_FILE_NAME",
 | 
			
		||||
            g_InitScriptZipFileName) < 0)
 | 
			
		||||
        return FatalError("unable to set INITSCRIPT_ZIP_FILE_NAME");
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ExecuteScript()
 | 
			
		||||
//   Execute the script found within the file.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int ExecuteScript(
 | 
			
		||||
    const char *fileName)               // name of file containing Python code
 | 
			
		||||
{
 | 
			
		||||
    PyObject *importer, *dict, *code, *temp;
 | 
			
		||||
 | 
			
		||||
    if (SetExecutableName(fileName) < 0)
 | 
			
		||||
        return -1;
 | 
			
		||||
    if (SetPathToSearch() < 0)
 | 
			
		||||
        return -1;
 | 
			
		||||
    importer = NULL;
 | 
			
		||||
    if (GetImporter(&importer) < 0)
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    // create and populate dictionary for initscript module
 | 
			
		||||
    dict = PyDict_New();
 | 
			
		||||
    if (PopulateInitScriptDict(dict) < 0) {
 | 
			
		||||
        Py_XDECREF(dict);
 | 
			
		||||
        Py_DECREF(importer);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // locate and execute script
 | 
			
		||||
    code = PyObject_CallMethod(importer, "get_code", "s", "cx_Freeze__init__");
 | 
			
		||||
    Py_DECREF(importer);
 | 
			
		||||
    if (!code)
 | 
			
		||||
        return FatalError("unable to locate initialization module");
 | 
			
		||||
    temp = PyEval_EvalCode( (PyCodeObject*) code, dict, dict);
 | 
			
		||||
    Py_DECREF(code);
 | 
			
		||||
    Py_DECREF(dict);
 | 
			
		||||
    if (!temp)
 | 
			
		||||
        return FatalScriptError();
 | 
			
		||||
    Py_DECREF(temp);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										72
									
								
								installer/cx_Freeze/source/bases/Console.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								installer/cx_Freeze/source/bases/Console.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,72 @@
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Console.c
 | 
			
		||||
//   Main routine for frozen programs which run in a console.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <Python.h>
 | 
			
		||||
#ifdef __WIN32__
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// FatalError()
 | 
			
		||||
//   Prints a fatal error.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int FatalError(
 | 
			
		||||
    const char *message)                // message to print
 | 
			
		||||
{
 | 
			
		||||
    PyErr_Print();
 | 
			
		||||
    Py_FatalError(message);
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// FatalScriptError()
 | 
			
		||||
//   Prints a fatal error in the initialization script.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int FatalScriptError(void)
 | 
			
		||||
{
 | 
			
		||||
    PyErr_Print();
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "Common.c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// main()
 | 
			
		||||
//   Main routine for frozen programs.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    const char *fileName;
 | 
			
		||||
    char *encoding;
 | 
			
		||||
 | 
			
		||||
    // initialize Python
 | 
			
		||||
    Py_NoSiteFlag = 1;
 | 
			
		||||
    Py_FrozenFlag = 1;
 | 
			
		||||
    Py_IgnoreEnvironmentFlag = 1;
 | 
			
		||||
 | 
			
		||||
    encoding = getenv("PYTHONIOENCODING");
 | 
			
		||||
    if (encoding != NULL) { 
 | 
			
		||||
        Py_FileSystemDefaultEncoding = strndup(encoding, 100);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Py_SetPythonHome("");
 | 
			
		||||
    Py_SetProgramName(argv[0]);
 | 
			
		||||
    fileName = Py_GetProgramFullPath();
 | 
			
		||||
 | 
			
		||||
    Py_Initialize();
 | 
			
		||||
    PySys_SetArgv(argc, argv);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // do the work
 | 
			
		||||
    if (ExecuteScript(fileName) < 0)
 | 
			
		||||
        return 1;
 | 
			
		||||
 | 
			
		||||
    Py_Finalize();
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										60
									
								
								installer/cx_Freeze/source/bases/ConsoleKeepPath.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								installer/cx_Freeze/source/bases/ConsoleKeepPath.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,60 @@
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ConsoleKeepPath.c
 | 
			
		||||
//   Main routine for frozen programs which need a Python installation to do
 | 
			
		||||
// their work.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <Python.h>
 | 
			
		||||
#ifdef __WIN32__
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// FatalError()
 | 
			
		||||
//   Prints a fatal error.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int FatalError(
 | 
			
		||||
    const char *message)                // message to print
 | 
			
		||||
{
 | 
			
		||||
    PyErr_Print();
 | 
			
		||||
    Py_FatalError(message);
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// FatalScriptError()
 | 
			
		||||
//   Prints a fatal error in the initialization script.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int FatalScriptError(void)
 | 
			
		||||
{
 | 
			
		||||
    PyErr_Print();
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "Common.c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// main()
 | 
			
		||||
//   Main routine for frozen programs.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    const char *fileName;
 | 
			
		||||
 | 
			
		||||
    // initialize Python
 | 
			
		||||
    Py_SetProgramName(argv[0]);
 | 
			
		||||
    fileName = Py_GetProgramFullPath();
 | 
			
		||||
    Py_Initialize();
 | 
			
		||||
    PySys_SetArgv(argc, argv);
 | 
			
		||||
 | 
			
		||||
    // do the work
 | 
			
		||||
    if (ExecuteScript(fileName) < 0)
 | 
			
		||||
        return 1;
 | 
			
		||||
 | 
			
		||||
    Py_Finalize();
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										242
									
								
								installer/cx_Freeze/source/bases/Win32GUI.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								installer/cx_Freeze/source/bases/Win32GUI.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,242 @@
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Win32GUI.c
 | 
			
		||||
//   Main routine for frozen programs written for the Win32 GUI subsystem.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <Python.h>
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// FatalError()
 | 
			
		||||
//   Handle a fatal error.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int FatalError(
 | 
			
		||||
    char *a_Message)                    // message to display
 | 
			
		||||
{
 | 
			
		||||
    MessageBox(NULL, a_Message, "cx_Freeze Fatal Error", MB_ICONERROR);
 | 
			
		||||
    Py_Finalize();
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// StringifyObject()
 | 
			
		||||
//   Stringify a Python object.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static char *StringifyObject(
 | 
			
		||||
    PyObject *object,                   // object to stringify
 | 
			
		||||
    PyObject **stringRep)               // string representation
 | 
			
		||||
{
 | 
			
		||||
    if (object) {
 | 
			
		||||
        *stringRep = PyObject_Str(object);
 | 
			
		||||
        if (*stringRep)
 | 
			
		||||
            return PyString_AS_STRING(*stringRep);
 | 
			
		||||
        return "Unable to stringify";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // object is NULL
 | 
			
		||||
    *stringRep = NULL;
 | 
			
		||||
    return "None";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// FatalPythonErrorNoTraceback()
 | 
			
		||||
//   Handle a fatal Python error without traceback.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int FatalPythonErrorNoTraceback(
 | 
			
		||||
    PyObject *origType,                 // exception type
 | 
			
		||||
    PyObject *origValue,                // exception value
 | 
			
		||||
    char *message)                      // message to display
 | 
			
		||||
{
 | 
			
		||||
    PyObject *typeStrRep, *valueStrRep, *origTypeStrRep, *origValueStrRep;
 | 
			
		||||
    char *totalMessage, *typeStr, *valueStr, *origTypeStr, *origValueStr;
 | 
			
		||||
    PyObject *type, *value, *traceback;
 | 
			
		||||
    int totalMessageLength;
 | 
			
		||||
    char *messageFormat;
 | 
			
		||||
 | 
			
		||||
    // fetch error and string representations of the error
 | 
			
		||||
    PyErr_Fetch(&type, &value, &traceback);
 | 
			
		||||
    origTypeStr = StringifyObject(origType, &origTypeStrRep);
 | 
			
		||||
    origValueStr = StringifyObject(origValue, &origValueStrRep);
 | 
			
		||||
    typeStr = StringifyObject(type, &typeStrRep);
 | 
			
		||||
    valueStr = StringifyObject(value, &valueStrRep);
 | 
			
		||||
 | 
			
		||||
    // fill out the message to be displayed
 | 
			
		||||
    messageFormat = "Type: %s\nValue: %s\nOther Type: %s\nOtherValue: %s\n%s";
 | 
			
		||||
    totalMessageLength = strlen(origTypeStr) + strlen(origValueStr) +
 | 
			
		||||
            strlen(typeStr) + strlen(valueStr) + strlen(message) +
 | 
			
		||||
            strlen(messageFormat) + 1;
 | 
			
		||||
    totalMessage = malloc(totalMessageLength);
 | 
			
		||||
    if (!totalMessage)
 | 
			
		||||
        return FatalError("Out of memory!");
 | 
			
		||||
    sprintf(totalMessage, messageFormat, typeStr, valueStr, origTypeStr,
 | 
			
		||||
            origValueStr, message);
 | 
			
		||||
 | 
			
		||||
    // display the message
 | 
			
		||||
    MessageBox(NULL, totalMessage,
 | 
			
		||||
            "cx_Freeze: Python error in main script (traceback unavailable)",
 | 
			
		||||
            MB_ICONERROR);
 | 
			
		||||
    free(totalMessage);
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ArgumentValue()
 | 
			
		||||
//   Return a suitable argument value by replacing NULL with Py_None.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyObject *ArgumentValue(
 | 
			
		||||
    PyObject *object)                   // argument to massage
 | 
			
		||||
{
 | 
			
		||||
    if (object) {
 | 
			
		||||
        Py_INCREF(object);
 | 
			
		||||
        return object;
 | 
			
		||||
    }
 | 
			
		||||
    Py_INCREF(Py_None);
 | 
			
		||||
    return Py_None;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// HandleSystemExitException()
 | 
			
		||||
//   Handles a system exit exception differently. If an integer value is passed
 | 
			
		||||
// through then that becomes the exit value; otherwise the string value of the
 | 
			
		||||
// value passed through is displayed in a message box.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static void HandleSystemExitException()
 | 
			
		||||
{
 | 
			
		||||
    PyObject *type, *value, *traceback, *valueStr;
 | 
			
		||||
    int exitCode = 0;
 | 
			
		||||
    char *message;
 | 
			
		||||
 | 
			
		||||
    PyErr_Fetch(&type, &value, &traceback);
 | 
			
		||||
    if (PyInstance_Check(value)) {
 | 
			
		||||
        PyObject *code = PyObject_GetAttrString(value, "code");
 | 
			
		||||
        if (code) {
 | 
			
		||||
            Py_DECREF(value);
 | 
			
		||||
            value = code;
 | 
			
		||||
            if (value == Py_None)
 | 
			
		||||
                Py_Exit(0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (PyInt_Check(value))
 | 
			
		||||
        exitCode = PyInt_AsLong(value);
 | 
			
		||||
    else {
 | 
			
		||||
        message = StringifyObject(value, &valueStr);
 | 
			
		||||
        MessageBox(NULL, message, "cx_Freeze: Application Terminated",
 | 
			
		||||
                MB_ICONERROR);
 | 
			
		||||
        Py_XDECREF(valueStr);
 | 
			
		||||
        exitCode = 1;
 | 
			
		||||
    }
 | 
			
		||||
    Py_Exit(exitCode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// FatalScriptError()
 | 
			
		||||
//   Handle a fatal Python error with traceback.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int FatalScriptError()
 | 
			
		||||
{
 | 
			
		||||
    PyObject *type, *value, *traceback, *argsTuple, *module, *method, *result;
 | 
			
		||||
    int tracebackLength, i;
 | 
			
		||||
    char *tracebackStr;
 | 
			
		||||
 | 
			
		||||
    // if a system exception, handle it specially
 | 
			
		||||
    if (PyErr_ExceptionMatches(PyExc_SystemExit))
 | 
			
		||||
        HandleSystemExitException();
 | 
			
		||||
 | 
			
		||||
    // get the exception details
 | 
			
		||||
    PyErr_Fetch(&type, &value, &traceback);
 | 
			
		||||
 | 
			
		||||
    // import the traceback module
 | 
			
		||||
    module = PyImport_ImportModule("traceback");
 | 
			
		||||
    if (!module)
 | 
			
		||||
        return FatalPythonErrorNoTraceback(type, value,
 | 
			
		||||
                "Cannot import traceback module.");
 | 
			
		||||
 | 
			
		||||
    // get the format_exception method
 | 
			
		||||
    method = PyObject_GetAttrString(module, "format_exception");
 | 
			
		||||
    Py_DECREF(module);
 | 
			
		||||
    if (!method)
 | 
			
		||||
        return FatalPythonErrorNoTraceback(type, value,
 | 
			
		||||
              "Cannot get format_exception method.");
 | 
			
		||||
 | 
			
		||||
    // create a tuple for the arguments
 | 
			
		||||
    argsTuple = PyTuple_New(3);
 | 
			
		||||
    if (!argsTuple) {
 | 
			
		||||
        Py_DECREF(method);
 | 
			
		||||
        return FatalPythonErrorNoTraceback(type, value,
 | 
			
		||||
                "Cannot create arguments tuple for traceback.");
 | 
			
		||||
    }
 | 
			
		||||
    PyTuple_SET_ITEM(argsTuple, 0, ArgumentValue(type));
 | 
			
		||||
    PyTuple_SET_ITEM(argsTuple, 1, ArgumentValue(value));
 | 
			
		||||
    PyTuple_SET_ITEM(argsTuple, 2, ArgumentValue(traceback));
 | 
			
		||||
 | 
			
		||||
    // call the format_exception method
 | 
			
		||||
    result = PyObject_CallObject(method, argsTuple);
 | 
			
		||||
    Py_DECREF(method);
 | 
			
		||||
    Py_DECREF(argsTuple);
 | 
			
		||||
    if (!result)
 | 
			
		||||
        return FatalPythonErrorNoTraceback(type, value,
 | 
			
		||||
                "Failed calling format_exception method.");
 | 
			
		||||
 | 
			
		||||
    // determine length of string representation of formatted traceback
 | 
			
		||||
    tracebackLength = 1;
 | 
			
		||||
    for (i = 0; i < PyList_GET_SIZE(result); i++)
 | 
			
		||||
        tracebackLength += PyString_GET_SIZE(PyList_GET_ITEM(result, i));
 | 
			
		||||
 | 
			
		||||
    // create a string representation of the formatted traceback
 | 
			
		||||
    tracebackStr = malloc(tracebackLength);
 | 
			
		||||
    if (!tracebackStr) {
 | 
			
		||||
        Py_DECREF(result);
 | 
			
		||||
        return FatalError("Out of memory!");
 | 
			
		||||
    }
 | 
			
		||||
    tracebackStr[0] = '\0';
 | 
			
		||||
    for (i = 0; i < PyList_GET_SIZE(result); i++)
 | 
			
		||||
        strcat(tracebackStr, PyString_AS_STRING(PyList_GET_ITEM(result, i)));
 | 
			
		||||
    Py_DECREF(result);
 | 
			
		||||
 | 
			
		||||
    // bring up the error
 | 
			
		||||
    MessageBox(NULL, tracebackStr, "cx_Freeze: Python error in main script",
 | 
			
		||||
            MB_ICONERROR);
 | 
			
		||||
    Py_Finalize();
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "Common.c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// WinMain()
 | 
			
		||||
//   Main routine for the executable in Windows.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
int WINAPI WinMain(
 | 
			
		||||
    HINSTANCE instance,                 // handle to application
 | 
			
		||||
    HINSTANCE prevInstance,             // previous handle to application
 | 
			
		||||
    LPSTR commandLine,                  // command line
 | 
			
		||||
    int showFlag)                       // show flag
 | 
			
		||||
{
 | 
			
		||||
    const char *fileName;
 | 
			
		||||
 | 
			
		||||
    // initialize Python
 | 
			
		||||
    Py_NoSiteFlag = 1;
 | 
			
		||||
    Py_FrozenFlag = 1;
 | 
			
		||||
    Py_IgnoreEnvironmentFlag = 1;
 | 
			
		||||
    Py_SetPythonHome("");
 | 
			
		||||
    Py_SetProgramName(__argv[0]);
 | 
			
		||||
    fileName = Py_GetProgramFullPath();
 | 
			
		||||
    Py_Initialize();
 | 
			
		||||
    PySys_SetArgv(__argc, __argv);
 | 
			
		||||
 | 
			
		||||
    // do the work
 | 
			
		||||
    if (ExecuteScript(fileName) < 0)
 | 
			
		||||
        return 1;
 | 
			
		||||
 | 
			
		||||
    // terminate Python
 | 
			
		||||
    Py_Finalize();
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										5
									
								
								installer/cx_Freeze/source/bases/dummy.rc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								installer/cx_Freeze/source/bases/dummy.rc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
STRINGTABLE
 | 
			
		||||
{
 | 
			
		||||
    1,  "Just to ensure that buggy EndUpdateResource doesn't fall over."
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								installer/cx_Freeze/source/bases/manifest.rc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								installer/cx_Freeze/source/bases/manifest.rc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
#include "dummy.rc"
 | 
			
		||||
 | 
			
		||||
1 24 source/bases/manifest.txt
 | 
			
		||||
							
								
								
									
										418
									
								
								installer/cx_Freeze/source/util.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										418
									
								
								installer/cx_Freeze/source/util.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,418 @@
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// util.c
 | 
			
		||||
//   Shared library for use by cx_Freeze.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#include <Python.h>
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#include <imagehlp.h>
 | 
			
		||||
 | 
			
		||||
#pragma pack(2)
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    BYTE bWidth;                        // Width, in pixels, of the image
 | 
			
		||||
    BYTE bHeight;                       // Height, in pixels, of the image
 | 
			
		||||
    BYTE bColorCount;                   // Number of colors in image
 | 
			
		||||
    BYTE bReserved;                     // Reserved ( must be 0)
 | 
			
		||||
    WORD wPlanes;                       // Color Planes
 | 
			
		||||
    WORD wBitCount;                     // Bits per pixel
 | 
			
		||||
    DWORD dwBytesInRes;                 // How many bytes in this resource?
 | 
			
		||||
    DWORD dwImageOffset;                // Where in the file is this image?
 | 
			
		||||
} ICONDIRENTRY;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    WORD idReserved;                    // Reserved (must be 0)
 | 
			
		||||
    WORD idType;                        // Resource Type (1 for icons)
 | 
			
		||||
    WORD idCount;                       // How many images?
 | 
			
		||||
    ICONDIRENTRY idEntries[0];          // An entry for each image
 | 
			
		||||
} ICONDIR;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    BYTE bWidth;                        // Width, in pixels, of the image
 | 
			
		||||
    BYTE bHeight;                       // Height, in pixels, of the image
 | 
			
		||||
    BYTE bColorCount;                   // Number of colors in image
 | 
			
		||||
    BYTE bReserved;                     // Reserved ( must be 0)
 | 
			
		||||
    WORD wPlanes;                       // Color Planes
 | 
			
		||||
    WORD wBitCount;                     // Bits per pixel
 | 
			
		||||
    DWORD dwBytesInRes;                 // How many bytes in this resource?
 | 
			
		||||
    WORD nID;                           // resource ID
 | 
			
		||||
} GRPICONDIRENTRY;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    WORD idReserved;                    // Reserved (must be 0)
 | 
			
		||||
    WORD idType;                        // Resource Type (1 for icons)
 | 
			
		||||
    WORD idCount;                       // How many images?
 | 
			
		||||
    GRPICONDIRENTRY idEntries[0];       // An entry for each image
 | 
			
		||||
} GRPICONDIR;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Globals
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
static PyObject *g_BindErrorException = NULL;
 | 
			
		||||
static PyObject *g_ImageNames = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// BindStatusRoutine()
 | 
			
		||||
//   Called by BindImageEx() at various points. This is used to determine the
 | 
			
		||||
// dependency tree which is later examined by cx_Freeze.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static BOOL __stdcall BindStatusRoutine(
 | 
			
		||||
    IMAGEHLP_STATUS_REASON reason,      // reason called
 | 
			
		||||
    PSTR imageName,                     // name of image being examined
 | 
			
		||||
    PSTR dllName,                       // name of DLL
 | 
			
		||||
    ULONG virtualAddress,               // computed virtual address
 | 
			
		||||
    ULONG parameter)                    // parameter (value depends on reason)
 | 
			
		||||
{
 | 
			
		||||
    char fileName[MAX_PATH + 1];
 | 
			
		||||
 | 
			
		||||
    switch (reason) {
 | 
			
		||||
        case BindImportModule:
 | 
			
		||||
            if (!SearchPath(NULL, dllName, NULL, sizeof(fileName), fileName,
 | 
			
		||||
                    NULL))
 | 
			
		||||
                return FALSE;
 | 
			
		||||
            Py_INCREF(Py_None);
 | 
			
		||||
            if (PyDict_SetItemString(g_ImageNames, fileName, Py_None) < 0)
 | 
			
		||||
                return FALSE;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// GetFileData()
 | 
			
		||||
//   Return the data for the given file.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static int GetFileData(
 | 
			
		||||
    const char *fileName,               // name of file to read
 | 
			
		||||
    char **data)                        // pointer to data (OUT)
 | 
			
		||||
{
 | 
			
		||||
    DWORD numberOfBytesRead, dataSize;
 | 
			
		||||
    HANDLE file;
 | 
			
		||||
 | 
			
		||||
    file = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL,
 | 
			
		||||
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 | 
			
		||||
    if (file == INVALID_HANDLE_VALUE)
 | 
			
		||||
        return -1;
 | 
			
		||||
    dataSize = GetFileSize(file, NULL);
 | 
			
		||||
    if (dataSize == INVALID_FILE_SIZE) {
 | 
			
		||||
        CloseHandle(file);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    *data = PyMem_Malloc(dataSize);
 | 
			
		||||
    if (!*data) {
 | 
			
		||||
        CloseHandle(file);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    if (!ReadFile(file, *data, dataSize, &numberOfBytesRead, NULL)) {
 | 
			
		||||
        CloseHandle(file);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    CloseHandle(file);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// CreateGroupIconResource()
 | 
			
		||||
//   Return the group icon resource given the icon file data.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static GRPICONDIR *CreateGroupIconResource(
 | 
			
		||||
    ICONDIR *iconDir,                   // icon information
 | 
			
		||||
    DWORD *resourceSize)                // size of resource (OUT)
 | 
			
		||||
{
 | 
			
		||||
    GRPICONDIR *groupIconDir;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    *resourceSize = sizeof(GRPICONDIR) +
 | 
			
		||||
            sizeof(GRPICONDIRENTRY) * iconDir->idCount;
 | 
			
		||||
    groupIconDir = PyMem_Malloc(*resourceSize);
 | 
			
		||||
    if (!groupIconDir)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    groupIconDir->idReserved = iconDir->idReserved;
 | 
			
		||||
    groupIconDir->idType = iconDir->idType;
 | 
			
		||||
    groupIconDir->idCount = iconDir->idCount;
 | 
			
		||||
    for (i = 0; i < iconDir->idCount; i++) {
 | 
			
		||||
        groupIconDir->idEntries[i].bWidth = iconDir->idEntries[i].bWidth;
 | 
			
		||||
        groupIconDir->idEntries[i].bHeight = iconDir->idEntries[i].bHeight;
 | 
			
		||||
        groupIconDir->idEntries[i].bColorCount =
 | 
			
		||||
                iconDir->idEntries[i].bColorCount;
 | 
			
		||||
        groupIconDir->idEntries[i].bReserved = iconDir->idEntries[i].bReserved;
 | 
			
		||||
        groupIconDir->idEntries[i].wPlanes = iconDir->idEntries[i].wPlanes;
 | 
			
		||||
        groupIconDir->idEntries[i].wBitCount = iconDir->idEntries[i].wBitCount;
 | 
			
		||||
        groupIconDir->idEntries[i].dwBytesInRes =
 | 
			
		||||
                iconDir->idEntries[i].dwBytesInRes;
 | 
			
		||||
        groupIconDir->idEntries[i].nID = i + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return groupIconDir;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ExtAddIcon()
 | 
			
		||||
//   Add the icon as a resource to the specified file.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyObject *ExtAddIcon(
 | 
			
		||||
    PyObject *self,                     // passthrough argument
 | 
			
		||||
    PyObject *args)                     // arguments
 | 
			
		||||
{
 | 
			
		||||
    char *executableName, *iconName, *data, *iconData;
 | 
			
		||||
    GRPICONDIR *groupIconDir;
 | 
			
		||||
    DWORD resourceSize;
 | 
			
		||||
    ICONDIR *iconDir;
 | 
			
		||||
    BOOL succeeded;
 | 
			
		||||
    HANDLE handle;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "ss", &executableName, &iconName))
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    // begin updating the executable
 | 
			
		||||
    handle = BeginUpdateResource(executableName, FALSE);
 | 
			
		||||
    if (!handle) {
 | 
			
		||||
        PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
 | 
			
		||||
                GetLastError(), executableName);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // first attempt to get the data from the icon file
 | 
			
		||||
    data = NULL;
 | 
			
		||||
    succeeded = TRUE;
 | 
			
		||||
    groupIconDir = NULL;
 | 
			
		||||
    if (GetFileData(iconName, &data) < 0)
 | 
			
		||||
        succeeded = FALSE;
 | 
			
		||||
    iconDir = (ICONDIR*) data;
 | 
			
		||||
 | 
			
		||||
    // next, attempt to add a group icon resource
 | 
			
		||||
    if (succeeded) {
 | 
			
		||||
        groupIconDir = CreateGroupIconResource(iconDir, &resourceSize);
 | 
			
		||||
        if (groupIconDir)
 | 
			
		||||
            succeeded = UpdateResource(handle, RT_GROUP_ICON,
 | 
			
		||||
                    MAKEINTRESOURCE(1),
 | 
			
		||||
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
 | 
			
		||||
                    groupIconDir, resourceSize);
 | 
			
		||||
        else succeeded = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // next, add each icon as a resource
 | 
			
		||||
    if (succeeded) {
 | 
			
		||||
        for (i = 0; i < iconDir->idCount; i++) {
 | 
			
		||||
            iconData = &data[iconDir->idEntries[i].dwImageOffset];
 | 
			
		||||
            resourceSize = iconDir->idEntries[i].dwBytesInRes;
 | 
			
		||||
            succeeded = UpdateResource(handle, RT_ICON, MAKEINTRESOURCE(i + 1),
 | 
			
		||||
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), iconData,
 | 
			
		||||
                    resourceSize);
 | 
			
		||||
            if (!succeeded)
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // finish writing the resource (or discarding the changes upon an error)
 | 
			
		||||
    if (!EndUpdateResource(handle, !succeeded)) {
 | 
			
		||||
        if (succeeded) {
 | 
			
		||||
            succeeded = FALSE;
 | 
			
		||||
            PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
 | 
			
		||||
                    GetLastError(), executableName);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // clean up
 | 
			
		||||
    if (groupIconDir)
 | 
			
		||||
        PyMem_Free(groupIconDir);
 | 
			
		||||
    if (data)
 | 
			
		||||
        PyMem_Free(data);
 | 
			
		||||
    if (!succeeded)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    Py_INCREF(Py_None);
 | 
			
		||||
    return Py_None;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ExtBeginUpdateResource()
 | 
			
		||||
//   Wrapper for BeginUpdateResource().
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyObject *ExtBeginUpdateResource(
 | 
			
		||||
    PyObject *self,                     // passthrough argument
 | 
			
		||||
    PyObject *args)                     // arguments
 | 
			
		||||
{
 | 
			
		||||
    BOOL deleteExistingResources;
 | 
			
		||||
    char *fileName;
 | 
			
		||||
    HANDLE handle;
 | 
			
		||||
 | 
			
		||||
    deleteExistingResources = TRUE;
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "s|i", &fileName, &deleteExistingResources))
 | 
			
		||||
        return NULL;
 | 
			
		||||
    handle = BeginUpdateResource(fileName, deleteExistingResources);
 | 
			
		||||
    if (!handle) {
 | 
			
		||||
        PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
 | 
			
		||||
                GetLastError(), fileName);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    return PyInt_FromLong((long) handle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ExtUpdateResource()
 | 
			
		||||
//   Wrapper for UpdateResource().
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyObject *ExtUpdateResource(
 | 
			
		||||
    PyObject *self,                     // passthrough argument
 | 
			
		||||
    PyObject *args)                     // arguments
 | 
			
		||||
{
 | 
			
		||||
    int resourceType, resourceId, resourceDataSize;
 | 
			
		||||
    char *resourceData;
 | 
			
		||||
    HANDLE handle;
 | 
			
		||||
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "iiis#", &handle, &resourceType, &resourceId,
 | 
			
		||||
            &resourceData, &resourceDataSize))
 | 
			
		||||
        return NULL;
 | 
			
		||||
    if (!UpdateResource(handle, MAKEINTRESOURCE(resourceType),
 | 
			
		||||
            MAKEINTRESOURCE(resourceId),
 | 
			
		||||
            MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), resourceData,
 | 
			
		||||
            resourceDataSize)) {
 | 
			
		||||
        PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Py_INCREF(Py_None);
 | 
			
		||||
    return Py_None;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ExtEndUpdateResource()
 | 
			
		||||
//   Wrapper for EndUpdateResource().
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyObject *ExtEndUpdateResource(
 | 
			
		||||
    PyObject *self,                     // passthrough argument
 | 
			
		||||
    PyObject *args)                     // arguments
 | 
			
		||||
{
 | 
			
		||||
    BOOL discardChanges;
 | 
			
		||||
    HANDLE handle;
 | 
			
		||||
 | 
			
		||||
    discardChanges = FALSE;
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "i|i", &handle, &discardChanges))
 | 
			
		||||
        return NULL;
 | 
			
		||||
    if (!EndUpdateResource(handle, discardChanges)) {
 | 
			
		||||
        PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Py_INCREF(Py_None);
 | 
			
		||||
    return Py_None;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ExtGetDependentFiles()
 | 
			
		||||
//   Return a list of files that this file depends on.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyObject *ExtGetDependentFiles(
 | 
			
		||||
    PyObject *self,                     // passthrough argument
 | 
			
		||||
    PyObject *args)                     // arguments
 | 
			
		||||
{
 | 
			
		||||
    PyObject *results;
 | 
			
		||||
    char *imageName;
 | 
			
		||||
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "s", &imageName))
 | 
			
		||||
        return NULL;
 | 
			
		||||
    g_ImageNames = PyDict_New();
 | 
			
		||||
    if (!g_ImageNames)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    if (!BindImageEx(BIND_NO_BOUND_IMPORTS | BIND_NO_UPDATE | BIND_ALL_IMAGES,
 | 
			
		||||
                imageName, NULL, NULL, BindStatusRoutine)) {
 | 
			
		||||
        Py_DECREF(g_ImageNames);
 | 
			
		||||
        PyErr_SetExcFromWindowsErrWithFilename(g_BindErrorException,
 | 
			
		||||
                GetLastError(), imageName);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    results = PyDict_Keys(g_ImageNames);
 | 
			
		||||
    Py_DECREF(g_ImageNames);
 | 
			
		||||
    return results;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ExtGetSystemDir()
 | 
			
		||||
//   Return the Windows directory (C:\Windows for example).
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyObject *ExtGetSystemDir(
 | 
			
		||||
    PyObject *self,                     // passthrough argument
 | 
			
		||||
    PyObject *args)                     // arguments (ignored)
 | 
			
		||||
{
 | 
			
		||||
    char dir[MAX_PATH + 1];
 | 
			
		||||
 | 
			
		||||
    if (GetSystemDirectory(dir, sizeof(dir)))
 | 
			
		||||
        return PyString_FromString(dir);
 | 
			
		||||
    PyErr_SetExcFromWindowsErr(PyExc_RuntimeError, GetLastError());
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// ExtSetOptimizeFlag()
 | 
			
		||||
//   Set the optimize flag as needed.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyObject *ExtSetOptimizeFlag(
 | 
			
		||||
    PyObject *self,                     // passthrough argument
 | 
			
		||||
    PyObject *args)                     // arguments
 | 
			
		||||
{
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "i", &Py_OptimizeFlag))
 | 
			
		||||
        return NULL;
 | 
			
		||||
    Py_INCREF(Py_None);
 | 
			
		||||
    return Py_None;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Methods
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
static PyMethodDef g_ModuleMethods[] = {
 | 
			
		||||
    { "SetOptimizeFlag", ExtSetOptimizeFlag, METH_VARARGS },
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
    { "BeginUpdateResource", ExtBeginUpdateResource, METH_VARARGS },
 | 
			
		||||
    { "UpdateResource", ExtUpdateResource, METH_VARARGS },
 | 
			
		||||
    { "EndUpdateResource", ExtEndUpdateResource, METH_VARARGS },
 | 
			
		||||
    { "AddIcon", ExtAddIcon, METH_VARARGS },
 | 
			
		||||
    { "GetDependentFiles", ExtGetDependentFiles, METH_VARARGS },
 | 
			
		||||
    { "GetSystemDir", ExtGetSystemDir, METH_NOARGS },
 | 
			
		||||
#endif
 | 
			
		||||
    { NULL }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// initutil()
 | 
			
		||||
//   Initialization routine for the shared libary.
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
void initutil(void)
 | 
			
		||||
{
 | 
			
		||||
    PyObject *module;
 | 
			
		||||
 | 
			
		||||
    module = Py_InitModule("cx_Freeze.util", g_ModuleMethods);
 | 
			
		||||
    if (!module)
 | 
			
		||||
        return;
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
    g_BindErrorException = PyErr_NewException("cx_Freeze.util.BindError",
 | 
			
		||||
            NULL, NULL);
 | 
			
		||||
    if (!g_BindErrorException)
 | 
			
		||||
        return;
 | 
			
		||||
    if (PyModule_AddObject(module, "BindError", g_BindErrorException) < 0)
 | 
			
		||||
        return;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
#!/usr/bin/env  python
 | 
			
		||||
from __future__ import with_statement
 | 
			
		||||
__license__   = 'GPL v3'
 | 
			
		||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
 | 
			
		||||
__docformat__ = 'restructuredtext en'
 | 
			
		||||
@ -6,162 +7,212 @@ __docformat__ = 'restructuredtext en'
 | 
			
		||||
'''
 | 
			
		||||
Create linux binary.
 | 
			
		||||
'''
 | 
			
		||||
import glob, sys, subprocess, tarfile, os, re, py_compile, shutil
 | 
			
		||||
HOME           = '/home/kovid'
 | 
			
		||||
PYINSTALLER    = os.path.expanduser('~/build/pyinstaller')
 | 
			
		||||
CALIBREPREFIX  = '___'
 | 
			
		||||
PDFTOHTML      = '/usr/bin/pdftohtml'
 | 
			
		||||
LIBUNRAR       = '/usr/lib/libunrar.so'
 | 
			
		||||
QTDIR          = '/usr/lib/qt4'
 | 
			
		||||
QTDLLS         = ('QtCore', 'QtGui', 'QtNetwork', 'QtSvg', 'QtXml', 'QtWebKit')
 | 
			
		||||
EXTRAS         = ('/usr/lib/python2.5/site-packages/PIL', os.path.expanduser('~/ipython/IPython'))
 | 
			
		||||
SQLITE         = '/usr/lib/libsqlite3.so.0'
 | 
			
		||||
DBUS           = '/usr/lib/libdbus-1.so.3'
 | 
			
		||||
LIBMNG         = '/usr/lib/libmng.so.1'
 | 
			
		||||
LIBZ           = '/lib/libz.so.1'
 | 
			
		||||
LIBBZ2         = '/lib/libbz2.so.1'
 | 
			
		||||
LIBUSB         = '/usr/lib/libusb.so'
 | 
			
		||||
LIBPOPPLER     = '/usr/lib/libpoppler.so.3'
 | 
			
		||||
LIBXML2        = '/usr/lib/libxml2.so.2'
 | 
			
		||||
LIBXSLT        = '/usr/lib/libxslt.so.1'
 | 
			
		||||
LIBEXSLT       = '/usr/lib/libexslt.so.0'
 | 
			
		||||
 | 
			
		||||
def freeze():
 | 
			
		||||
    import glob, sys, subprocess, tarfile, os, re, textwrap, shutil, cStringIO, bz2, codecs
 | 
			
		||||
    from contextlib import closing
 | 
			
		||||
    from cx_Freeze import Executable, setup
 | 
			
		||||
    from calibre.constants import __version__, __appname__
 | 
			
		||||
    from calibre.linux import entry_points
 | 
			
		||||
    from calibre import walk
 | 
			
		||||
    from calibre.web.feeds.recipes import recipe_modules
 | 
			
		||||
    import calibre
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
CALIBRESRC     = os.path.join(CALIBREPREFIX, 'src')
 | 
			
		||||
CALIBREPLUGINS = os.path.join(CALIBRESRC, 'calibre', 'plugins')
 | 
			
		||||
    QTDIR          = '/usr/lib/qt4'
 | 
			
		||||
    QTDLLS         = ('QtCore', 'QtGui', 'QtNetwork', 'QtSvg', 'QtXml', 'QtWebKit')
 | 
			
		||||
    
 | 
			
		||||
sys.path.insert(0, CALIBRESRC)
 | 
			
		||||
from calibre import __version__
 | 
			
		||||
from calibre.parallel import PARALLEL_FUNCS
 | 
			
		||||
from calibre.web.feeds.recipes import recipes
 | 
			
		||||
hiddenimports = list(map(lambda x: x[0], PARALLEL_FUNCS.values()))
 | 
			
		||||
hiddenimports += ['PyQt4.QtWebKit']
 | 
			
		||||
hiddenimports += ['lxml._elementpath', 'keyword', 'codeop', 'commands', 'shlex', 'pydoc']
 | 
			
		||||
hiddenimports += map(lambda x: x.__module__, recipes)
 | 
			
		||||
open(os.path.join(PYINSTALLER, 'hooks', 'hook-calibre.parallel.py'), 'wb').write('hiddenimports = %s'%repr(hiddenimports))
 | 
			
		||||
    binary_excludes = ['libGLcore*', 'libGL*', 'libnvidia*']
 | 
			
		||||
    
 | 
			
		||||
def run_pyinstaller(args=sys.argv):
 | 
			
		||||
    subprocess.check_call(('/usr/bin/sudo', 'chown', '-R', 'kovid:users', glob.glob('/usr/lib/python*/site-packages/')[-1]))
 | 
			
		||||
    subprocess.check_call('rm -rf %(py)s/dist/* %(py)s/build/*'%dict(py=PYINSTALLER), shell=True)
 | 
			
		||||
    cp = HOME+'/build/'+os.path.basename(os.getcwd())
 | 
			
		||||
    spec = open(os.path.join(PYINSTALLER, 'calibre', 'calibre.spec'), 'wb')
 | 
			
		||||
    raw = re.sub(r'CALIBREPREFIX\s+=\s+\'___\'', 'CALIBREPREFIX = '+repr(cp),
 | 
			
		||||
                 open(__file__).read())
 | 
			
		||||
    spec.write(raw)
 | 
			
		||||
    spec.close()
 | 
			
		||||
    os.chdir(PYINSTALLER)
 | 
			
		||||
    shutil.rmtree('calibre/dist')
 | 
			
		||||
    os.mkdir('calibre/dist')
 | 
			
		||||
    subprocess.check_call('python -OO Build.py calibre/calibre.spec', shell=True)
 | 
			
		||||
    binary_includes = [
 | 
			
		||||
                       '/usr/bin/pdftohtml',
 | 
			
		||||
                       '/usr/lib/libunrar.so',
 | 
			
		||||
                       '/usr/lib/libsqlite3.so.0',
 | 
			
		||||
                       '/usr/lib/libsqlite3.so.0',
 | 
			
		||||
                       '/usr/lib/libmng.so.1',
 | 
			
		||||
                       '/lib/libz.so.1',
 | 
			
		||||
                       '/lib/libbz2.so.1',
 | 
			
		||||
                       '/lib/libbz2.so.1',
 | 
			
		||||
                       '/usr/lib/libpoppler.so.4',
 | 
			
		||||
                       '/usr/lib/libxml2.so.2',
 | 
			
		||||
                       '/usr/lib/libxslt.so.1',
 | 
			
		||||
                       '/usr/lib/libxslt.so.1'
 | 
			
		||||
                       ]
 | 
			
		||||
    
 | 
			
		||||
    binary_includes += [os.path.join(QTDIR, 'lib%s.so.4'%x) for x in QTDLLS]
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    d = os.path.dirname
 | 
			
		||||
    CALIBRESRC = d(d(d(os.path.abspath(calibre.__file__))))
 | 
			
		||||
    CALIBREPLUGINS = os.path.join(CALIBRESRC, 'src', 'calibre', 'plugins')
 | 
			
		||||
    FREEZE_DIR = os.path.join(CALIBRESRC, 'build', 'cx_freeze')
 | 
			
		||||
    DIST_DIR   = os.path.join(CALIBRESRC, 'dist')
 | 
			
		||||
    
 | 
			
		||||
    os.chdir(CALIBRESRC)
 | 
			
		||||
    
 | 
			
		||||
    print 'Freezing calibre located at', CALIBRESRC
 | 
			
		||||
    
 | 
			
		||||
    sys.path.insert(0, os.path.join(CALIBRESRC, 'src'))
 | 
			
		||||
    
 | 
			
		||||
    entry_points = entry_points['console_scripts'] + entry_points['gui_scripts']
 | 
			
		||||
    entry_points = ['calibre_postinstall=calibre.linux:binary_install', 
 | 
			
		||||
                    'calibre-parallel=calibre.parallel:main'] + entry_points
 | 
			
		||||
    executables = {}
 | 
			
		||||
    for ep in entry_points:
 | 
			
		||||
        executables[ep.split('=')[0].strip()] = (ep.split('=')[1].split(':')[0].strip(),
 | 
			
		||||
                                                 ep.split(':')[-1].strip())
 | 
			
		||||
    
 | 
			
		||||
    if os.path.exists(FREEZE_DIR):
 | 
			
		||||
        shutil.rmtree(FREEZE_DIR)
 | 
			
		||||
    os.makedirs(FREEZE_DIR)
 | 
			
		||||
    
 | 
			
		||||
    if not os.path.exists(DIST_DIR):
 | 
			
		||||
        os.makedirs(DIST_DIR)
 | 
			
		||||
    
 | 
			
		||||
    includes = [x[0] for x in executables.values()]
 | 
			
		||||
    
 | 
			
		||||
    excludes = ['matplotlib', "Tkconstants", "Tkinter", "tcl", "_imagingtk", 
 | 
			
		||||
                "ImageTk", "FixTk", 'wx', 'PyQt4.QtAssistant', 'PyQt4.QtOpenGL.so', 
 | 
			
		||||
                'PyQt4.QtScript.so', 'PyQt4.QtSql.so', 'PyQt4.QtTest.so', 'qt',
 | 
			
		||||
                'glib', 'gobject']
 | 
			
		||||
    
 | 
			
		||||
    packages = ['calibre', 'encodings', 'cherrypy', 'cssutils', 'xdg']
 | 
			
		||||
    
 | 
			
		||||
    includes += ['calibre.web.feeds.recipes.'+r for r in recipe_modules]
 | 
			
		||||
    
 | 
			
		||||
    LOADER = '/tmp/loader.py'
 | 
			
		||||
    open(LOADER, 'wb').write('# This script is never actually used.\nimport sys')
 | 
			
		||||
    
 | 
			
		||||
    INIT_SCRIPT = '/tmp/init.py'
 | 
			
		||||
    open(INIT_SCRIPT, 'wb').write(textwrap.dedent('''
 | 
			
		||||
    ## Load calibre module specified in the environment variable CALIBRE_CX_EXE
 | 
			
		||||
    ## Also restrict sys.path to the executables' directory and add the
 | 
			
		||||
    ## executables directory to LD_LIBRARY_PATH 
 | 
			
		||||
    import encodings
 | 
			
		||||
    import os
 | 
			
		||||
    import sys
 | 
			
		||||
    import warnings
 | 
			
		||||
    import zipimport
 | 
			
		||||
    import locale
 | 
			
		||||
    import codecs
 | 
			
		||||
    
 | 
			
		||||
    enc = locale.getdefaultlocale()[1]
 | 
			
		||||
    if not enc:
 | 
			
		||||
        enc = locale.nl_langinfo(locale.CODESET)
 | 
			
		||||
    enc = codecs.lookup(enc if enc else 'UTF-8').name
 | 
			
		||||
    sys.setdefaultencoding(enc)
 | 
			
		||||
    
 | 
			
		||||
    paths = os.environ.get('LD_LIBRARY_PATH', '').split(os.pathsep)
 | 
			
		||||
    if DIR_NAME not in paths or not sys.getfilesystemencoding():
 | 
			
		||||
        paths.insert(0, DIR_NAME)
 | 
			
		||||
        os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(paths)
 | 
			
		||||
        os.environ['PYTHONIOENCODING'] = enc
 | 
			
		||||
        os.execv(sys.executable, sys.argv)
 | 
			
		||||
    
 | 
			
		||||
    sys.path = sys.path[:3]
 | 
			
		||||
    sys.frozen = True
 | 
			
		||||
    sys.frozen_path = DIR_NAME
 | 
			
		||||
    
 | 
			
		||||
    executables = %(executables)s
 | 
			
		||||
    
 | 
			
		||||
    exe = os.environ.get('CALIBRE_CX_EXE', False)
 | 
			
		||||
    ret = 1
 | 
			
		||||
    if not exe:
 | 
			
		||||
        print >>sys.stderr, 'Invalid invocation of calibre loader. CALIBRE_CX_EXE not set'
 | 
			
		||||
    elif exe not in executables:
 | 
			
		||||
        print >>sys.stderr, 'Invalid invocation of calibre loader. CALIBRE_CX_EXE=%%s is unknown'%%exe
 | 
			
		||||
    else:
 | 
			
		||||
        sys.argv[0] = exe
 | 
			
		||||
        module, func = executables[exe]
 | 
			
		||||
        module = __import__(module, fromlist=[1])
 | 
			
		||||
        func = getattr(module, func)
 | 
			
		||||
        ret = func()
 | 
			
		||||
    
 | 
			
		||||
    module = sys.modules.get("threading")
 | 
			
		||||
    if module is not None:
 | 
			
		||||
        module._shutdown()
 | 
			
		||||
    sys.exit(ret)
 | 
			
		||||
    ''')%dict(executables=repr(executables)))
 | 
			
		||||
    sys.argv = ['freeze', 'build_exe']
 | 
			
		||||
    setup(
 | 
			
		||||
          name        = __appname__,
 | 
			
		||||
          version     = __version__,
 | 
			
		||||
          executables = [Executable(script=LOADER, targetName='loader', compress=False)],
 | 
			
		||||
          options     = { 'build_exe' :
 | 
			
		||||
                         {
 | 
			
		||||
                          'build_exe'       : os.path.join(CALIBRESRC, 'build/cx_freeze'),
 | 
			
		||||
                          'optimize'        : 2,
 | 
			
		||||
                          'excludes'        : excludes,
 | 
			
		||||
                          'includes'        : includes,
 | 
			
		||||
                          'packages'        : packages,
 | 
			
		||||
                          'init_script'     : INIT_SCRIPT,
 | 
			
		||||
                          'copy_dependent_files' : True,
 | 
			
		||||
                          'create_shared_zip'    : False,
 | 
			
		||||
                          } 
 | 
			
		||||
                         }
 | 
			
		||||
          )
 | 
			
		||||
    
 | 
			
		||||
    def copy_binary(src, dest_dir):
 | 
			
		||||
        dest = os.path.join(dest_dir, os.path.basename(src))
 | 
			
		||||
        if not os.path.exists(dest_dir):
 | 
			
		||||
            os.makedirs(dest_dir)
 | 
			
		||||
        shutil.copyfile(src, dest)
 | 
			
		||||
        shutil.copymode(src, dest)
 | 
			
		||||
    
 | 
			
		||||
    for f in binary_includes:
 | 
			
		||||
        copy_binary(f, FREEZE_DIR)
 | 
			
		||||
    
 | 
			
		||||
    for pat in binary_excludes:
 | 
			
		||||
        matches = glob.glob(os.path.join(FREEZE_DIR, pat))
 | 
			
		||||
        for f in matches:
 | 
			
		||||
            os.remove(f)
 | 
			
		||||
            
 | 
			
		||||
    print 'Adding calibre plugins...'
 | 
			
		||||
    os.makedirs(os.path.join(FREEZE_DIR, 'plugins'))    
 | 
			
		||||
    for f in glob.glob(os.path.join(CALIBREPLUGINS, '*.so')):
 | 
			
		||||
        copy_binary(f, os.path.join(FREEZE_DIR, 'plugins'))
 | 
			
		||||
        
 | 
			
		||||
    print 'Adding Qt plugins...'
 | 
			
		||||
    plugdir = os.path.join(QTDIR, 'plugins')
 | 
			
		||||
    for dirpath, dirnames, filenames in os.walk(plugdir):
 | 
			
		||||
        for f in filenames:
 | 
			
		||||
            if not f.endswith('.so') or 'designer' in dirpath or 'codecs' in dirpath or 'sqldrivers' in dirpath: 
 | 
			
		||||
                continue
 | 
			
		||||
            f = os.path.join(dirpath, f)
 | 
			
		||||
            dest_dir = dirpath.replace(plugdir, os.path.join(FREEZE_DIR, 'qtlugins'))
 | 
			
		||||
            copy_binary(f, dest_dir)
 | 
			
		||||
 | 
			
		||||
    print 'Creating launchers'
 | 
			
		||||
    for exe in executables:
 | 
			
		||||
        path = os.path.join(FREEZE_DIR, exe) 
 | 
			
		||||
        open(path, 'wb').write(textwrap.dedent('''\
 | 
			
		||||
        #!/bin/sh
 | 
			
		||||
        export CALIBRE_CX_EXE=%s
 | 
			
		||||
        path=`readlink -e $0`
 | 
			
		||||
        base=`dirname $path`
 | 
			
		||||
        loader=$base/loader
 | 
			
		||||
        export LD_LIBRARY_PATH=$base:$LD_LIBRARY_PATH
 | 
			
		||||
        $loader "$@"
 | 
			
		||||
        ''')%exe)
 | 
			
		||||
        os.chmod(path, 0755)
 | 
			
		||||
    
 | 
			
		||||
    exes = list(executables.keys())
 | 
			
		||||
    exes.remove('calibre_postinstall')
 | 
			
		||||
    exes.remove('calibre-parallel')
 | 
			
		||||
    open(os.path.join(FREEZE_DIR, 'manifest'), 'wb').write('\n'.join(exes))
 | 
			
		||||
            
 | 
			
		||||
    print 'Creating archive...'
 | 
			
		||||
    dist = open(os.path.join(DIST_DIR, 'calibre-%s-i686.tar.bz2'%__version__), 'wb')
 | 
			
		||||
    with closing(tarfile.open(fileobj=dist, mode='w:bz2', 
 | 
			
		||||
                              format=tarfile.PAX_FORMAT)) as tf:
 | 
			
		||||
        for f in walk(FREEZE_DIR):
 | 
			
		||||
            name = f.replace(FREEZE_DIR, '')[1:]
 | 
			
		||||
            if name:
 | 
			
		||||
                tf.add(f, name)
 | 
			
		||||
    dist.flush()
 | 
			
		||||
    dist.seek(0, 2)
 | 
			
		||||
    print 'Archive %s created: %.2f MB'%(dist.name, dist.tell()/(1024.**2))
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__' and 'freeze.py' in __file__:
 | 
			
		||||
    sys.exit(run_pyinstaller())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
loader = os.path.join(os.path.expanduser('~/temp'), 'calibre_installer_loader.py')
 | 
			
		||||
if not os.path.exists(loader):
 | 
			
		||||
    open(loader, 'wb').write('''
 | 
			
		||||
import sys, os
 | 
			
		||||
sys.frozen_path = os.getcwd()
 | 
			
		||||
os.chdir(os.environ.get("ORIGWD", "."))
 | 
			
		||||
sys.path.insert(0, os.path.join(sys.frozen_path, "library.pyz"))
 | 
			
		||||
sys.path.insert(0, sys.frozen_path)
 | 
			
		||||
from PyQt4.QtCore import QCoreApplication
 | 
			
		||||
QCoreApplication.setLibraryPaths([sys.frozen_path, os.path.join(sys.frozen_path, "qtplugins")])
 | 
			
		||||
''')
 | 
			
		||||
excludes = ['gtk._gtk', 'gtk.glade', 'qt', 'matplotlib.nxutils', 'matplotlib._cntr',
 | 
			
		||||
            'matplotlib.ttconv', 'matplotlib._image', 'matplotlib.ft2font',
 | 
			
		||||
            'matplotlib._transforms', 'matplotlib._agg', 'matplotlib.backends._backend_agg',
 | 
			
		||||
            'matplotlib.axes', 'matplotlib', 'matplotlib.pyparsing',
 | 
			
		||||
            'TKinter', 'atk', 'gobject._gobject', 'pango', 'PIL', 'Image', 'IPython']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sys.path.insert(0, CALIBRESRC)
 | 
			
		||||
from calibre.linux import entry_points
 | 
			
		||||
 | 
			
		||||
executables, scripts = ['calibre_postinstall', 'calibre-parallel'], \
 | 
			
		||||
                       [os.path.join(CALIBRESRC, 'calibre', 'linux.py'), os.path.join(CALIBRESRC, 'calibre', 'parallel.py')]
 | 
			
		||||
 | 
			
		||||
for entry in entry_points['console_scripts'] + entry_points['gui_scripts']:
 | 
			
		||||
    fields = entry.split('=')
 | 
			
		||||
    executables.append(fields[0].strip())
 | 
			
		||||
    scripts.append(os.path.join(CALIBRESRC, *map(lambda x: x.strip(), fields[1].split(':')[0].split('.')))+'.py')
 | 
			
		||||
 | 
			
		||||
analyses = [Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), loader, script],
 | 
			
		||||
             pathex=[PYINSTALLER, CALIBRESRC], excludes=excludes) for script in scripts]
 | 
			
		||||
 | 
			
		||||
pyz = TOC()
 | 
			
		||||
binaries = TOC()
 | 
			
		||||
 | 
			
		||||
for a in analyses:
 | 
			
		||||
    pyz = a.pure + pyz
 | 
			
		||||
    binaries = a.binaries + binaries
 | 
			
		||||
pyz = PYZ(pyz, name='library.pyz')
 | 
			
		||||
 | 
			
		||||
built_executables = []
 | 
			
		||||
for script, exe, a in zip(scripts, executables, analyses):
 | 
			
		||||
    built_executables.append(EXE(PYZ(TOC()),
 | 
			
		||||
    a.scripts+[('O','','OPTION'),],
 | 
			
		||||
    exclude_binaries=1,
 | 
			
		||||
    name=os.path.join('buildcalibre', exe),
 | 
			
		||||
    debug=False,
 | 
			
		||||
    strip=True,
 | 
			
		||||
    upx=False,
 | 
			
		||||
    excludes=excludes,
 | 
			
		||||
    console=1))
 | 
			
		||||
 | 
			
		||||
print 'Adding plugins...'
 | 
			
		||||
for f in glob.glob(os.path.join(CALIBREPLUGINS, '*.so')):
 | 
			
		||||
    binaries += [('plugins/'+os.path.basename(f), f, 'BINARY')]
 | 
			
		||||
for f in glob.glob(os.path.join(CALIBREPLUGINS, '*.so.*')):
 | 
			
		||||
    binaries += [(os.path.basename(f), f, 'BINARY')]
 | 
			
		||||
 | 
			
		||||
print 'Adding external programs...'
 | 
			
		||||
binaries += [('pdftohtml', PDFTOHTML, 'BINARY'),
 | 
			
		||||
             ('libunrar.so', LIBUNRAR, 'BINARY')]
 | 
			
		||||
 | 
			
		||||
print 'Adding external libraries...'
 | 
			
		||||
binaries += [ (os.path.basename(x), x, 'BINARY') for x in (SQLITE, DBUS,
 | 
			
		||||
            LIBMNG, LIBZ, LIBBZ2, LIBUSB, LIBPOPPLER, LIBXML2, LIBXSLT, LIBEXSLT)]
 | 
			
		||||
             
 | 
			
		||||
 | 
			
		||||
qt = []
 | 
			
		||||
for dll in QTDLLS:
 | 
			
		||||
    path = os.path.join(QTDIR, 'lib'+dll+'.so.4')
 | 
			
		||||
    qt.append((os.path.basename(path), path, 'BINARY'))
 | 
			
		||||
binaries += qt
 | 
			
		||||
 | 
			
		||||
plugins = []
 | 
			
		||||
plugdir = os.path.join(QTDIR, 'plugins')
 | 
			
		||||
for dirpath, dirnames, filenames in os.walk(plugdir):
 | 
			
		||||
    for f in filenames:
 | 
			
		||||
        if not f.endswith('.so') or 'designer' in dirpath or 'codcs' in dirpath or 'sqldrivers' in dirpath : continue
 | 
			
		||||
        f = os.path.join(dirpath, f)
 | 
			
		||||
        plugins.append(('qtplugins/'+f.replace(plugdir, ''), f, 'BINARY'))
 | 
			
		||||
binaries += plugins
 | 
			
		||||
 | 
			
		||||
manifest = '/tmp/manifest'
 | 
			
		||||
open(manifest, 'wb').write('\n'.join(executables))
 | 
			
		||||
version = '/tmp/version'
 | 
			
		||||
open(version, 'wb').write(__version__)
 | 
			
		||||
coll = COLLECT(binaries, pyz, 
 | 
			
		||||
               [('manifest', manifest, 'DATA'), ('version', version, 'DATA')],
 | 
			
		||||
               *built_executables,
 | 
			
		||||
               **dict(strip=True,
 | 
			
		||||
               upx=False,
 | 
			
		||||
               excludes=excludes,
 | 
			
		||||
               name='dist'))
 | 
			
		||||
 | 
			
		||||
os.chdir(os.path.join(HOMEPATH, 'calibre', 'dist'))
 | 
			
		||||
for folder in EXTRAS:
 | 
			
		||||
    subprocess.check_call('cp -rf %s .'%folder, shell=True)
 | 
			
		||||
 | 
			
		||||
print 'Building tarball...'
 | 
			
		||||
tbz2 = 'calibre-%s-i686.tar.bz2'%__version__
 | 
			
		||||
tf = tarfile.open(os.path.join('/tmp', tbz2), 'w:bz2')
 | 
			
		||||
 | 
			
		||||
for f in os.listdir('.'):
 | 
			
		||||
    tf.add(f)
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    freeze()
 | 
			
		||||
 | 
			
		||||
@ -177,7 +177,7 @@ _check_symlinks_prescript()
 | 
			
		||||
    
 | 
			
		||||
    def fix_python_dependencies(self, files):
 | 
			
		||||
        for f in files:
 | 
			
		||||
            subprocess.check_call(['/usr/bin/install_name_tool', '-change', '/Library/Frameworks/Python.framework/Versions/2.5/Python', '@executable_path/../Frameworks/Python.framework/Versions/2.5/Python', f])
 | 
			
		||||
            subprocess.check_call(['/usr/bin/install_name_tool', '-change', '/Library/Frameworks/Python.framework/Versions/2.6/Python', '@executable_path/../Frameworks/Python.framework/Versions/2.6/Python', f])
 | 
			
		||||
            
 | 
			
		||||
    def fix_misc_dependencies(self, files):
 | 
			
		||||
        for path in files:
 | 
			
		||||
@ -247,10 +247,13 @@ _check_symlinks_prescript()
 | 
			
		||||
        print 'Adding pdftohtml'
 | 
			
		||||
        os.link(os.path.expanduser('~/pdftohtml'), os.path.join(frameworks_dir, 'pdftohtml'))
 | 
			
		||||
        print 'Adding plugins'
 | 
			
		||||
        module_dir = os.path.join(resource_dir, 'lib', 'python2.5', 'lib-dynload')
 | 
			
		||||
        module_dir = os.path.join(resource_dir, 'lib', 'python2.6', 'lib-dynload')
 | 
			
		||||
        print 'Adding fontconfig'
 | 
			
		||||
        for f in glob.glob(os.path.expanduser('~/fontconfig-bundled/*')):
 | 
			
		||||
            os.link(f, os.path.join(frameworks_dir, os.path.basename(f)))
 | 
			
		||||
            dest = os.path.join(frameworks_dir, os.path.basename(f))
 | 
			
		||||
            if os.path.exists(dest):
 | 
			
		||||
                os.remove(dest)
 | 
			
		||||
            os.link(f, dest)
 | 
			
		||||
        dst = os.path.join(resource_dir, 'fonts')
 | 
			
		||||
        if os.path.exists(dst):
 | 
			
		||||
            shutil.rmtree(dst)
 | 
			
		||||
@ -258,7 +261,7 @@ _check_symlinks_prescript()
 | 
			
		||||
        
 | 
			
		||||
        print
 | 
			
		||||
        print 'Adding IPython'
 | 
			
		||||
        dst = os.path.join(resource_dir, 'lib', 'python2.5', 'IPython')
 | 
			
		||||
        dst = os.path.join(resource_dir, 'lib', 'python2.6', 'IPython')
 | 
			
		||||
        if os.path.exists(dst): shutil.rmtree(dst)
 | 
			
		||||
        shutil.copytree(os.path.expanduser('~/build/ipython/IPython'), dst)
 | 
			
		||||
        
 | 
			
		||||
@ -280,6 +283,7 @@ _check_symlinks_prescript()
 | 
			
		||||
        f = open(launcher_path, 'r')
 | 
			
		||||
        src = f.read()
 | 
			
		||||
        f.close()
 | 
			
		||||
        src = src.replace('import Image', 'from PIL import Image')
 | 
			
		||||
        src = re.sub('(_run\s*\(.*?.py.*?\))', cs+'%s'%(
 | 
			
		||||
'''
 | 
			
		||||
sys.frameworks_dir = os.path.join(os.path.dirname(os.environ['RESOURCEPATH']), 'Frameworks')
 | 
			
		||||
@ -290,7 +294,7 @@ sys.frameworks_dir = os.path.join(os.path.dirname(os.environ['RESOURCEPATH']), '
 | 
			
		||||
        f.close()
 | 
			
		||||
        print 
 | 
			
		||||
        print 'Adding main scripts to site-packages'
 | 
			
		||||
        f = zipfile.ZipFile(os.path.join(self.dist_dir, APPNAME+'.app', 'Contents', 'Resources', 'lib', 'python2.5', 'site-packages.zip'), 'a', zipfile.ZIP_DEFLATED)
 | 
			
		||||
        f = zipfile.ZipFile(os.path.join(self.dist_dir, APPNAME+'.app', 'Contents', 'Resources', 'lib', 'python2.6', 'site-packages.zip'), 'a', zipfile.ZIP_DEFLATED)
 | 
			
		||||
        for script in scripts['gui']+scripts['console']:
 | 
			
		||||
            f.write(script, script.partition('/')[-1])
 | 
			
		||||
        f.close()
 | 
			
		||||
@ -322,7 +326,8 @@ def main():
 | 
			
		||||
                                       'genshi', 'calibre.web.feeds.recipes.*',
 | 
			
		||||
                                       'calibre.ebooks.lrf.any.*', 'calibre.ebooks.lrf.feeds.*',
 | 
			
		||||
                                       'keyword', 'codeop', 'pydoc', 'readline',
 | 
			
		||||
                                       'BeautifulSoup'],
 | 
			
		||||
                                       'BeautifulSoup'
 | 
			
		||||
                                       ],
 | 
			
		||||
                         'packages' : ['PIL', 'Authorization', 'lxml'],
 | 
			
		||||
                         'excludes' : ['IPython'],
 | 
			
		||||
                         'plist'    : { 'CFBundleGetInfoString' : '''calibre, an E-book management application.'''
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								setup.py
									
									
									
									
									
								
							@ -401,7 +401,8 @@ if __name__ == '__main__':
 | 
			
		||||
                ))
 | 
			
		||||
    if isosx:
 | 
			
		||||
        ext_modules.append(Extension('calibre.plugins.usbobserver',
 | 
			
		||||
                sources=['src/calibre/devices/usbobserver/usbobserver.c'])
 | 
			
		||||
                sources=['src/calibre/devices/usbobserver/usbobserver.c'],
 | 
			
		||||
                extra_link_args=['-framework', 'IOKit'])
 | 
			
		||||
                           )
 | 
			
		||||
    
 | 
			
		||||
    setup(
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,11 @@ mimetypes.add_type('application/epub+zip', '.epub')
 | 
			
		||||
mimetypes.add_type('text/x-sony-bbeb+xml', '.lrs')
 | 
			
		||||
mimetypes.add_type('application/x-sony-bbeb', '.lrf')
 | 
			
		||||
 | 
			
		||||
def to_unicode(raw, encoding='utf-8', errors='strict'):
 | 
			
		||||
    if isinstance(raw, unicode):
 | 
			
		||||
        return raw
 | 
			
		||||
    return raw.decode(encoding, errors)
 | 
			
		||||
 | 
			
		||||
def unicode_path(path, abs=False):
 | 
			
		||||
    if not isinstance(path, unicode):
 | 
			
		||||
        path = path.decode(sys.getfilesystemencoding())
 | 
			
		||||
@ -317,7 +322,12 @@ class LoggingInterface:
 | 
			
		||||
    def ___log(self, func, msg, args, kwargs):
 | 
			
		||||
        args = [msg] + list(args)
 | 
			
		||||
        for i in range(len(args)):
 | 
			
		||||
            if isinstance(args[i], unicode):
 | 
			
		||||
            if not isinstance(args[i], basestring):
 | 
			
		||||
                continue
 | 
			
		||||
            if sys.version_info[:2] > (2, 5):
 | 
			
		||||
                if not isinstance(args[i], unicode):
 | 
			
		||||
                    args[i] = args[i].decode(preferred_encoding, 'replace')
 | 
			
		||||
            elif isinstance(args[i], unicode):
 | 
			
		||||
                args[i] = args[i].encode(preferred_encoding, 'replace')
 | 
			
		||||
        func(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@ __license__   = 'GPL v3'
 | 
			
		||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
 | 
			
		||||
__docformat__ = 'restructuredtext en'
 | 
			
		||||
__appname__   = 'calibre'
 | 
			
		||||
__version__   = '0.4.112'
 | 
			
		||||
__version__   = '0.4.113'
 | 
			
		||||
__author__    = "Kovid Goyal <kovid@kovidgoyal.net>"
 | 
			
		||||
'''
 | 
			
		||||
Various run time constants.
 | 
			
		||||
 | 
			
		||||
@ -48,8 +48,7 @@ from calibre.ebooks.epub import initialize_container, PROFILES
 | 
			
		||||
from calibre.ebooks.epub.split import split
 | 
			
		||||
from calibre.ebooks.epub.fonts import Rationalizer
 | 
			
		||||
from calibre.constants import preferred_encoding
 | 
			
		||||
from calibre import walk
 | 
			
		||||
from calibre import CurrentDir
 | 
			
		||||
from calibre import walk, CurrentDir, to_unicode
 | 
			
		||||
 | 
			
		||||
content = functools.partial(os.path.join, u'content')
 | 
			
		||||
 | 
			
		||||
@ -79,7 +78,7 @@ def check(opf_path, pretty_print):
 | 
			
		||||
            base = os.path.dirname(path)
 | 
			
		||||
            root = html.fromstring(open(content(path), 'rb').read())
 | 
			
		||||
            for element, attribute, link, pos in list(root.iterlinks()):
 | 
			
		||||
                link = link.decode('utf-8')
 | 
			
		||||
                link = to_unicode(link)
 | 
			
		||||
                plink = Link(link, base)
 | 
			
		||||
                bad = False
 | 
			
		||||
                if plink.path is not None and not os.path.exists(plink.path):
 | 
			
		||||
@ -204,7 +203,7 @@ TITLEPAGE = '''\
 | 
			
		||||
    </head>
 | 
			
		||||
    <body>
 | 
			
		||||
        <div>
 | 
			
		||||
            <img src="%s" alt="cover" />
 | 
			
		||||
            <img src="%s" alt="cover" style="height: 100%%" />
 | 
			
		||||
        </div>
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
@ -168,7 +168,8 @@ class EbookIterator(object):
 | 
			
		||||
        if bookmarks is None:
 | 
			
		||||
            bookmarks = self.bookmarks
 | 
			
		||||
        dat = self.serialize_bookmarks(bookmarks)
 | 
			
		||||
        if os.path.splitext(self.pathtoebook)[1].lower() == '.epub':
 | 
			
		||||
        if os.path.splitext(self.pathtoebook)[1].lower() == '.epub' and \
 | 
			
		||||
            os.access(self.pathtoebook, os.R_OK):
 | 
			
		||||
            zf = open(self.pathtoebook, 'r+b')
 | 
			
		||||
            zipf = ZipFile(zf, mode='a')
 | 
			
		||||
            for name in zipf.namelist():
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en'
 | 
			
		||||
Split the flows in an epub file to conform to size limitations.
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
import os, math, logging, functools, collections, re, copy
 | 
			
		||||
import os, math, logging, functools, collections, re, copy, sys
 | 
			
		||||
 | 
			
		||||
from lxml.etree import XPath as _XPath
 | 
			
		||||
from lxml import etree, html
 | 
			
		||||
@ -34,30 +34,62 @@ class SplitError(ValueError):
 | 
			
		||||
 | 
			
		||||
class Splitter(LoggingInterface):
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, path, opts, stylesheet_map, always_remove=False):
 | 
			
		||||
    def __init__(self, path, opts, stylesheet_map, opf):
 | 
			
		||||
        LoggingInterface.__init__(self, logging.getLogger('htmlsplit'))
 | 
			
		||||
        self.setup_cli_handler(opts.verbose)
 | 
			
		||||
        self.path = path
 | 
			
		||||
        self.always_remove = always_remove
 | 
			
		||||
        self.always_remove = not opts.preserve_tag_structure or \
 | 
			
		||||
                    os.stat(content(path)).st_size > 5*opts.profile.flow_size
 | 
			
		||||
        self.base = (os.path.splitext(path)[0].replace('%', '%%') + '_split_%d.html')
 | 
			
		||||
        self.opts = opts
 | 
			
		||||
        self.orig_size = os.stat(content(path)).st_size
 | 
			
		||||
        self.log_info('\tSplitting %s (%d KB)', path, self.orig_size/1024.)
 | 
			
		||||
        root = html.fromstring(open(content(path)).read())
 | 
			
		||||
            
 | 
			
		||||
        self.page_breaks = []
 | 
			
		||||
        self.find_page_breaks(stylesheet_map[self.path], root)
 | 
			
		||||
            
 | 
			
		||||
        self.trees = []
 | 
			
		||||
        self.page_breaks, self.trees = [], []
 | 
			
		||||
        self.split_size = 0
 | 
			
		||||
        self.split(root.getroottree())
 | 
			
		||||
        self.commit()
 | 
			
		||||
        self.log_info('\t\tSplit into %d parts.', len(self.trees))
 | 
			
		||||
        if self.opts.verbose:
 | 
			
		||||
            for f in self.files:
 | 
			
		||||
                self.log_info('\t\t\t%s - %d KB', f, os.stat(content(f)).st_size/1024.)
 | 
			
		||||
        
 | 
			
		||||
        # Split on page breaks
 | 
			
		||||
        self.log_info('\tSplitting on page breaks...')
 | 
			
		||||
        if self.path in stylesheet_map:
 | 
			
		||||
            self.find_page_breaks(stylesheet_map[self.path], root)
 | 
			
		||||
        self.split_on_page_breaks(root.getroottree())
 | 
			
		||||
        trees = list(self.trees)
 | 
			
		||||
        
 | 
			
		||||
        # Split any remaining over-sized trees
 | 
			
		||||
        if self.opts.profile.flow_size < sys.maxint:
 | 
			
		||||
            lt_found = False
 | 
			
		||||
            self.log_info('\tLooking for large trees...')
 | 
			
		||||
            for i, tree in enumerate(list(trees)):
 | 
			
		||||
                self.trees = []
 | 
			
		||||
                size = len(tostring(tree.getroot())) 
 | 
			
		||||
                if size > self.opts.profile.flow_size:
 | 
			
		||||
                    lt_found = True
 | 
			
		||||
                    try:
 | 
			
		||||
                        self.split_to_size(tree)
 | 
			
		||||
                    except (SplitError, RuntimeError): # Splitting fails
 | 
			
		||||
                        if not self.always_remove:
 | 
			
		||||
                            self.always_remove = True
 | 
			
		||||
                            self.split_to_size(tree)
 | 
			
		||||
                        else:
 | 
			
		||||
                            raise
 | 
			
		||||
                    trees[i:i+1] = list(self.trees)
 | 
			
		||||
            if not lt_found:
 | 
			
		||||
                self.log_info('\tNo large trees found')
 | 
			
		||||
        
 | 
			
		||||
        self.trees = trees
 | 
			
		||||
        self.was_split = len(self.trees) > 1
 | 
			
		||||
        if self.was_split:
 | 
			
		||||
            self.commit()
 | 
			
		||||
            self.log_info('\t\tSplit into %d parts.', len(self.trees))
 | 
			
		||||
            if self.opts.verbose:
 | 
			
		||||
                for f in self.files:
 | 
			
		||||
                    self.log_info('\t\t\t%s - %d KB', f, os.stat(content(f)).st_size/1024.)
 | 
			
		||||
            self.fix_opf(opf)
 | 
			
		||||
            
 | 
			
		||||
        self.trees = None
 | 
			
		||||
        
 | 
			
		||||
    
 | 
			
		||||
    def split_text(self, text, root, size):
 | 
			
		||||
        self.log_debug('\t\t\tSplitting text of length: %d'%len(text))
 | 
			
		||||
        rest = text.replace('\r', '')
 | 
			
		||||
@ -76,12 +108,7 @@ class Splitter(LoggingInterface):
 | 
			
		||||
        return ans
 | 
			
		||||
            
 | 
			
		||||
    
 | 
			
		||||
    def split(self, tree):
 | 
			
		||||
        '''
 | 
			
		||||
        Split ``tree`` into a *before* and *after* tree, preserving tag structure,
 | 
			
		||||
        but not duplicating any text. All tags that have had their text and tail
 | 
			
		||||
        removed have the attribute ``calibre_split`` set to 1.
 | 
			
		||||
        '''
 | 
			
		||||
    def split_to_size(self, tree):
 | 
			
		||||
        self.log_debug('\t\tSplitting...')
 | 
			
		||||
        root = tree.getroot()
 | 
			
		||||
        # Split large <pre> tags
 | 
			
		||||
@ -108,10 +135,50 @@ class Splitter(LoggingInterface):
 | 
			
		||||
            if not self.always_remove:
 | 
			
		||||
                self.log_warn(_('\t\tToo much markup. Re-splitting without structure preservation. This may cause incorrect rendering.'))
 | 
			
		||||
            raise SplitError(self.path, root)
 | 
			
		||||
        tree2 = copy.deepcopy(tree)
 | 
			
		||||
        root2 = tree2.getroot()
 | 
			
		||||
        body, body2 = root.body, root2.body
 | 
			
		||||
        path = tree.getpath(split_point)
 | 
			
		||||
        
 | 
			
		||||
        for t in self.do_split(tree, split_point, before):
 | 
			
		||||
            r = t.getroot()
 | 
			
		||||
            if self.is_page_empty(r):
 | 
			
		||||
                continue
 | 
			
		||||
            size = len(tostring(r))
 | 
			
		||||
            if size <= self.opts.profile.flow_size:
 | 
			
		||||
                self.trees.append(t)
 | 
			
		||||
                #print tostring(t.getroot(), pretty_print=True)
 | 
			
		||||
                self.log_debug('\t\t\tCommitted sub-tree #%d (%d KB)', len(self.trees), size/1024.)
 | 
			
		||||
                self.split_size += size
 | 
			
		||||
            else:
 | 
			
		||||
                self.split_to_size(t)
 | 
			
		||||
    
 | 
			
		||||
    def is_page_empty(self, root):
 | 
			
		||||
        body = root.find('body')
 | 
			
		||||
        if body is None:
 | 
			
		||||
            return False
 | 
			
		||||
        txt = re.sub(r'\s+', '', html.tostring(body, method='text', encoding=unicode))
 | 
			
		||||
        if len(txt) > 4:
 | 
			
		||||
            #if len(txt) < 100:
 | 
			
		||||
            #    print 1111111, html.tostring(body, method='html', encoding=unicode)
 | 
			
		||||
            return False
 | 
			
		||||
        for img in root.xpath('//img'):
 | 
			
		||||
            if img.get('style', '') != 'display:none':
 | 
			
		||||
                return False
 | 
			
		||||
        return True
 | 
			
		||||
                
 | 
			
		||||
    def do_split(self, tree, split_point, before):
 | 
			
		||||
        '''
 | 
			
		||||
        Split ``tree`` into a *before* and *after* tree at ``split_point``, 
 | 
			
		||||
        preserving tag structure, but not duplicating any text. 
 | 
			
		||||
        All tags that have had their text and tail
 | 
			
		||||
        removed have the attribute ``calibre_split`` set to 1.
 | 
			
		||||
        
 | 
			
		||||
        :param before: If True tree is split before split_point, otherwise after split_point
 | 
			
		||||
        :return: before_tree, after_tree
 | 
			
		||||
        '''
 | 
			
		||||
        path         = tree.getpath(split_point)
 | 
			
		||||
        tree, tree2  = copy.deepcopy(tree), copy.deepcopy(tree)
 | 
			
		||||
        root         = tree.getroot()
 | 
			
		||||
        root2        = tree2.getroot()
 | 
			
		||||
        body, body2  = root.body, root2.body
 | 
			
		||||
        split_point  = root.xpath(path)[0]
 | 
			
		||||
        split_point2 = root2.xpath(path)[0]
 | 
			
		||||
        
 | 
			
		||||
        def nix_element(elem, top=True):
 | 
			
		||||
@ -129,7 +196,7 @@ class Splitter(LoggingInterface):
 | 
			
		||||
                elem.tail = u''
 | 
			
		||||
                elem.set(SPLIT_ATTR, '1')
 | 
			
		||||
                if elem.tag.lower() in ['ul', 'ol', 'dl', 'table', 'hr', 'img']:
 | 
			
		||||
                    elem.set('style', 'display:none;')
 | 
			
		||||
                    elem.set('style', 'display:none')
 | 
			
		||||
        
 | 
			
		||||
        def fix_split_point(sp):
 | 
			
		||||
            sp.set('style', sp.get('style', '')+'page-break-before:avoid;page-break-after:avoid') 
 | 
			
		||||
@ -163,20 +230,35 @@ class Splitter(LoggingInterface):
 | 
			
		||||
            if not hit_split_point:
 | 
			
		||||
                nix_element(elem, top=False)
 | 
			
		||||
        
 | 
			
		||||
        for t, r in [(tree, root), (tree2, root2)]:
 | 
			
		||||
            size = len(tostring(r)) 
 | 
			
		||||
            if size <= self.opts.profile.flow_size:
 | 
			
		||||
                self.trees.append(t)
 | 
			
		||||
                #print tostring(t.getroot(), pretty_print=True)
 | 
			
		||||
                self.log_debug('\t\t\tCommitted sub-tree #%d (%d KB)', len(self.trees), size/1024.)
 | 
			
		||||
                self.split_size += size
 | 
			
		||||
            else:
 | 
			
		||||
                self.split(t)
 | 
			
		||||
        return tree, tree2
 | 
			
		||||
                
 | 
			
		||||
    
 | 
			
		||||
    def split_on_page_breaks(self, orig_tree):
 | 
			
		||||
        ordered_ids = []
 | 
			
		||||
        for elem in orig_tree.xpath('//*[@id]'):
 | 
			
		||||
            id = elem.get('id')
 | 
			
		||||
            if id in self.page_break_ids:
 | 
			
		||||
                ordered_ids.append(self.page_breaks[self.page_break_ids.index(id)])
 | 
			
		||||
                
 | 
			
		||||
        self.trees = []
 | 
			
		||||
        tree = orig_tree
 | 
			
		||||
        for pattern, before in ordered_ids:
 | 
			
		||||
            self.log_info('\t\tSplitting on page-break')
 | 
			
		||||
            elem = pattern(tree)
 | 
			
		||||
            if elem:
 | 
			
		||||
                before, after = self.do_split(tree, elem[0], before)
 | 
			
		||||
                self.trees.append(before)
 | 
			
		||||
                tree = after
 | 
			
		||||
        self.trees.append(tree)
 | 
			
		||||
        self.trees = [t for t in self.trees if not self.is_page_empty(t.getroot())]
 | 
			
		||||
                
 | 
			
		||||
            
 | 
			
		||||
                
 | 
			
		||||
    def find_page_breaks(self, stylesheets, root):
 | 
			
		||||
        '''
 | 
			
		||||
        Find all elements that have either page-break-before or page-break-after set.
 | 
			
		||||
        Populates `self.page_breaks` with id based XPath selectors (for elements that don't 
 | 
			
		||||
        have ids, an id is created).
 | 
			
		||||
        '''
 | 
			
		||||
        page_break_selectors = set([])
 | 
			
		||||
        for rule in rules(stylesheets):
 | 
			
		||||
@ -204,16 +286,18 @@ class Splitter(LoggingInterface):
 | 
			
		||||
            
 | 
			
		||||
        page_breaks = list(page_breaks)
 | 
			
		||||
        page_breaks.sort(cmp=lambda x,y : cmp(x.pb_order, y.pb_order))
 | 
			
		||||
        self.page_break_ids = []
 | 
			
		||||
        for i, x in enumerate(page_breaks):
 | 
			
		||||
            x.set('id', x.get('id', 'calibre_pb_%d'%i))
 | 
			
		||||
            self.page_breaks.append((XPath('//*[@id="%s"]'%x.get('id')), x.pb_before))
 | 
			
		||||
            id = x.get('id')
 | 
			
		||||
            self.page_breaks.append((XPath('//*[@id="%s"]'%id), x.pb_before))
 | 
			
		||||
            self.page_break_ids.append(id)                        
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
    def find_split_point(self, root):
 | 
			
		||||
        '''
 | 
			
		||||
        Find the tag at which to split the tree rooted at `root`. 
 | 
			
		||||
        Search order is:
 | 
			
		||||
            * page breaks
 | 
			
		||||
            * Heading tags
 | 
			
		||||
            * <div> tags
 | 
			
		||||
            * <p> tags
 | 
			
		||||
@ -229,19 +313,6 @@ class Splitter(LoggingInterface):
 | 
			
		||||
                    elems[i].set(SPLIT_POINT_ATTR, '1')
 | 
			
		||||
                    return elems[i]
 | 
			
		||||
    
 | 
			
		||||
        page_breaks = []
 | 
			
		||||
        for x in self.page_breaks:
 | 
			
		||||
            pb = x[0](root)
 | 
			
		||||
            if pb:
 | 
			
		||||
                page_breaks.append(pb[0])
 | 
			
		||||
        
 | 
			
		||||
        elem = pick_elem(page_breaks)
 | 
			
		||||
        if elem is not None:
 | 
			
		||||
            i = page_breaks.index(elem)
 | 
			
		||||
            return elem, self.page_breaks[i][1]
 | 
			
		||||
        
 | 
			
		||||
            
 | 
			
		||||
                            
 | 
			
		||||
        for path in (
 | 
			
		||||
                     '//*[re:match(name(), "h[1-6]", "i")]', 
 | 
			
		||||
                     '/html/body/div',
 | 
			
		||||
@ -315,6 +386,9 @@ class Splitter(LoggingInterface):
 | 
			
		||||
                frag = None
 | 
			
		||||
                if len(href) > 1:
 | 
			
		||||
                    frag = href[1]
 | 
			
		||||
                if frag not in self.anchor_map:
 | 
			
		||||
                    self.log_warning('\t\tUnable to re-map OPF link', href)
 | 
			
		||||
                    continue
 | 
			
		||||
                new_file = self.anchor_map[frag]
 | 
			
		||||
                ref.set('href', 'content/'+new_file+('' if frag is None else ('#'+frag)))
 | 
			
		||||
 | 
			
		||||
@ -341,7 +415,11 @@ def fix_content_links(html_files, changes, opts):
 | 
			
		||||
                anchor = href[1] if len(href) > 1 else None
 | 
			
		||||
                href = href[0]
 | 
			
		||||
                if href in split_files:
 | 
			
		||||
                    newf = anchor_maps[split_files.index(href)][anchor]
 | 
			
		||||
                    try:
 | 
			
		||||
                        newf = anchor_maps[split_files.index(href)][anchor]
 | 
			
		||||
                    except:
 | 
			
		||||
                        print '\t\tUnable to remap HTML link:', href, anchor
 | 
			
		||||
                        continue
 | 
			
		||||
                    frag = ('#'+anchor) if anchor else ''
 | 
			
		||||
                    a.set('href', newf+frag)
 | 
			
		||||
                    changed = True
 | 
			
		||||
@ -354,52 +432,54 @@ def fix_ncx(path, changes):
 | 
			
		||||
    anchor_maps = [f.anchor_map for f in changes]
 | 
			
		||||
    tree = etree.parse(path)
 | 
			
		||||
    changed = False
 | 
			
		||||
    for content in tree.getroot().xpath('//x:content[@src]', namespaces={'x':"http://www.daisy.org/z3986/2005/ncx/"}):
 | 
			
		||||
    for content in tree.getroot().xpath('//x:content[@src]', 
 | 
			
		||||
                    namespaces={'x':"http://www.daisy.org/z3986/2005/ncx/"}):
 | 
			
		||||
        href = content.get('src')
 | 
			
		||||
        if not href.startswith('#'):
 | 
			
		||||
            href = href.split('#')
 | 
			
		||||
            anchor = href[1] if len(href) > 1 else None
 | 
			
		||||
            href = href[0].split('/')[-1]
 | 
			
		||||
            if href in split_files:
 | 
			
		||||
                newf = anchor_maps[split_files.index(href)][anchor]
 | 
			
		||||
                try:
 | 
			
		||||
                    newf = anchor_maps[split_files.index(href)][anchor]
 | 
			
		||||
                except:
 | 
			
		||||
                    print 'Unable to remap NCX link:', href, anchor
 | 
			
		||||
                frag = ('#'+anchor) if anchor else ''
 | 
			
		||||
                content.set('src', 'content/'+newf+frag)
 | 
			
		||||
                changed = True
 | 
			
		||||
    if changed:
 | 
			
		||||
        open(path, 'wb').write(etree.tostring(tree.getroot(), encoding='UTF-8', xml_declaration=True))
 | 
			
		||||
 | 
			
		||||
def find_html_files(opf):
 | 
			
		||||
    '''
 | 
			
		||||
    Find all HTML files referenced by `opf`.
 | 
			
		||||
    '''
 | 
			
		||||
    html_files = []
 | 
			
		||||
    for item in opf.itermanifest():
 | 
			
		||||
        if 'html' in item.get('media-type', '').lower():
 | 
			
		||||
            f = item.get('href').split('/')[-1]
 | 
			
		||||
            f2 = f.replace('&', '%26')
 | 
			
		||||
            if not os.path.exists(content(f)) and os.path.exists(content(f2)):
 | 
			
		||||
                f = f2
 | 
			
		||||
                item.set('href', item.get('href').replace('&', '%26'))
 | 
			
		||||
            if os.path.exists(content(f)):
 | 
			
		||||
                html_files.append(f)
 | 
			
		||||
    return html_files
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
def split(pathtoopf, opts, stylesheet_map):
 | 
			
		||||
    pathtoopf = os.path.abspath(pathtoopf)
 | 
			
		||||
    opf = OPF(open(pathtoopf, 'rb'), os.path.dirname(pathtoopf))
 | 
			
		||||
    
 | 
			
		||||
    with CurrentDir(os.path.dirname(pathtoopf)):
 | 
			
		||||
        opf = OPF(open(pathtoopf, 'rb'), os.path.dirname(pathtoopf))
 | 
			
		||||
        html_files = []
 | 
			
		||||
        for item in opf.itermanifest():
 | 
			
		||||
            if 'html' in item.get('media-type', '').lower():
 | 
			
		||||
                f = item.get('href').split('/')[-1]
 | 
			
		||||
                f2 = f.replace('&', '%26')
 | 
			
		||||
                if not os.path.exists(content(f)) and os.path.exists(content(f2)):
 | 
			
		||||
                    f = f2
 | 
			
		||||
                    item.set('href', item.get('href').replace('&', '%26'))
 | 
			
		||||
                html_files.append(f)
 | 
			
		||||
        changes = []
 | 
			
		||||
        always_remove = not opts.preserve_tag_structure
 | 
			
		||||
        for f in html_files:
 | 
			
		||||
            if os.stat(content(f)).st_size > opts.profile.flow_size:
 | 
			
		||||
                try:
 | 
			
		||||
                    changes.append(Splitter(f, opts, stylesheet_map,
 | 
			
		||||
                        always_remove=(always_remove or \
 | 
			
		||||
                        os.stat(content(f)).st_size > 5*opts.profile.flow_size)))
 | 
			
		||||
                except (SplitError, RuntimeError):
 | 
			
		||||
                    if not always_remove:
 | 
			
		||||
                        changes.append(Splitter(f, opts, stylesheet_map, always_remove=True))
 | 
			
		||||
                    else:
 | 
			
		||||
                        raise
 | 
			
		||||
                changes[-1].fix_opf(opf)
 | 
			
		||||
        html_files = find_html_files(opf)
 | 
			
		||||
        changes = [Splitter(f, opts, stylesheet_map, opf) for f in html_files]
 | 
			
		||||
        changes = [c for c in changes if c.was_split]
 | 
			
		||||
        
 | 
			
		||||
        open(pathtoopf, 'wb').write(opf.render())
 | 
			
		||||
        fix_content_links(html_files, changes, opts)
 | 
			
		||||
        
 | 
			
		||||
        for item in opf.itermanifest():
 | 
			
		||||
            if item.get('media-type', '') == 'application/x-dtbncx+xml':
 | 
			
		||||
                fix_ncx(item.get('href'), changes)
 | 
			
		||||
                break 
 | 
			
		||||
 | 
			
		||||
        open(pathtoopf, 'wb').write(opf.render())
 | 
			
		||||
 | 
			
		||||
@ -1948,7 +1948,8 @@ def try_opf(path, options, logger):
 | 
			
		||||
        return
 | 
			
		||||
    
 | 
			
		||||
    dirpath = os.path.dirname(os.path.abspath(opf))
 | 
			
		||||
    opf = OPFReader(open(opf, 'rb'), dirpath)
 | 
			
		||||
    from calibre.ebooks.metadata.opf2 import OPF as OPF2
 | 
			
		||||
    opf = OPF2(open(opf, 'rb'), dirpath)
 | 
			
		||||
    try:
 | 
			
		||||
        title = opf.title        
 | 
			
		||||
        if title and not getattr(options, 'title', None):
 | 
			
		||||
@ -1962,10 +1963,6 @@ def try_opf(path, options, logger):
 | 
			
		||||
            publisher = opf.publisher
 | 
			
		||||
            if publisher:
 | 
			
		||||
                options.publisher = publisher
 | 
			
		||||
        if not getattr(options, 'category', None):
 | 
			
		||||
            category = opf.category
 | 
			
		||||
            if category:
 | 
			
		||||
                options.category = category
 | 
			
		||||
        if not getattr(options, 'cover', None) or options.use_metadata_cover:
 | 
			
		||||
            orig_cover = getattr(options, 'cover', None)
 | 
			
		||||
            options.cover = None
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										89
									
								
								src/calibre/ebooks/metadata/lrx.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/calibre/ebooks/metadata/lrx.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,89 @@
 | 
			
		||||
#!/usr/bin/env  python
 | 
			
		||||
__license__   = 'GPL v3'
 | 
			
		||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
 | 
			
		||||
__docformat__ = 'restructuredtext en'
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
Read metadata from LRX files
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
import sys, struct
 | 
			
		||||
from zlib import decompress
 | 
			
		||||
from lxml import etree
 | 
			
		||||
 | 
			
		||||
from calibre.ebooks.metadata import MetaInformation, string_to_authors
 | 
			
		||||
 | 
			
		||||
def _read(f, at, amount):
 | 
			
		||||
    f.seek(at)
 | 
			
		||||
    return f.read(amount)
 | 
			
		||||
 | 
			
		||||
def word_be(buf):
 | 
			
		||||
    return struct.unpack('>L', buf)[0]
 | 
			
		||||
 | 
			
		||||
def word_le(buf):
 | 
			
		||||
    return struct.unpack('<L', buf)[0]
 | 
			
		||||
 | 
			
		||||
def short_le(buf):
 | 
			
		||||
    return struct.unpack('<H', buf)[0]
 | 
			
		||||
 | 
			
		||||
def short_be(buf):
 | 
			
		||||
    return struct.unpack('>H', buf)[0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_metadata(f):
 | 
			
		||||
    read = lambda at, amount: _read(f, at, amount)
 | 
			
		||||
    f.seek(0)
 | 
			
		||||
    buf = f.read(12) 
 | 
			
		||||
    if buf[4:] == 'ftypLRX2':
 | 
			
		||||
        offset = 0
 | 
			
		||||
        while True:
 | 
			
		||||
            offset += word_be(buf[:4])
 | 
			
		||||
            try:
 | 
			
		||||
                buf = read(offset, 8)
 | 
			
		||||
            except:
 | 
			
		||||
                raise ValueError('Not a valid LRX file')
 | 
			
		||||
            if buf[4:] == 'bbeb':
 | 
			
		||||
                break
 | 
			
		||||
        offset += 8
 | 
			
		||||
        buf = read(offset, 16)
 | 
			
		||||
        if buf[:8].decode('utf-16-le') != 'LRF\x00':
 | 
			
		||||
            raise ValueError('Not a valid LRX file')
 | 
			
		||||
        lrf_version = word_le(buf[8:12])
 | 
			
		||||
        offset += 0x4c
 | 
			
		||||
        compressed_size = short_le(read(offset, 2))
 | 
			
		||||
        offset += 2
 | 
			
		||||
        if lrf_version >= 800:
 | 
			
		||||
            offset += 6
 | 
			
		||||
        compressed_size -= 4
 | 
			
		||||
        uncompressed_size = word_le(read(offset, 4))
 | 
			
		||||
        info = decompress(f.read(compressed_size))
 | 
			
		||||
        if len(info) != uncompressed_size:
 | 
			
		||||
            raise ValueError('LRX file has malformed metadata section')
 | 
			
		||||
        root = etree.fromstring(info)
 | 
			
		||||
        bi = root.find('BookInfo')
 | 
			
		||||
        title = bi.find('Title')
 | 
			
		||||
        title_sort = title.get('reading', None)
 | 
			
		||||
        title = title.text
 | 
			
		||||
        author = bi.find('Author')
 | 
			
		||||
        author_sort = author.get('reading', None)
 | 
			
		||||
        mi = MetaInformation(title, string_to_authors(author.text))
 | 
			
		||||
        mi.title_sort, mi.author_sort = title_sort, author_sort
 | 
			
		||||
        author = author.text
 | 
			
		||||
        publisher = bi.find('Publisher')
 | 
			
		||||
        mi.publisher = getattr(publisher, 'text', None)
 | 
			
		||||
        mi.tags = [x.text for x in  bi.findall('Category')]
 | 
			
		||||
        mi.language = root.find('DocInfo').find('Language').text
 | 
			
		||||
        return mi
 | 
			
		||||
        
 | 
			
		||||
    elif buf[4:8] == 'LRX':
 | 
			
		||||
        raise ValueError('Librie LRX format not supported')
 | 
			
		||||
    else:
 | 
			
		||||
        raise ValueError('Not a LRX file')
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
def main(args=sys.argv):
 | 
			
		||||
    print get_metadata(open(args[1], 'rb'))
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    sys.exit(main())
 | 
			
		||||
@ -16,6 +16,7 @@ from calibre.ebooks.metadata.epub import get_metadata as epub_metadata
 | 
			
		||||
from calibre.ebooks.metadata.html import get_metadata as html_metadata
 | 
			
		||||
from calibre.ebooks.mobi.reader   import get_metadata as mobi_metadata
 | 
			
		||||
from calibre.ebooks.metadata.odt  import get_metadata as odt_metadata
 | 
			
		||||
from calibre.ebooks.metadata.lrx  import get_metadata as lrx_metadata 
 | 
			
		||||
from calibre.ebooks.metadata.opf2 import OPF
 | 
			
		||||
from calibre.ebooks.metadata.rtf  import set_metadata as set_rtf_metadata
 | 
			
		||||
from calibre.ebooks.lrf.meta      import set_metadata as set_lrf_metadata
 | 
			
		||||
@ -29,12 +30,12 @@ except OSError:
 | 
			
		||||
from calibre.libunzip import extract_member as zip_extract_first
 | 
			
		||||
 | 
			
		||||
from calibre.ebooks.metadata import MetaInformation
 | 
			
		||||
from calibre.ptempfile import TemporaryDirectory
 | 
			
		||||
 | 
			
		||||
_METADATA_PRIORITIES = [
 | 
			
		||||
                       'html', 'htm', 'xhtml', 'xhtm',
 | 
			
		||||
                       'rtf', 'fb2', 'pdf', 'prc', 'odt',
 | 
			
		||||
                       'epub', 'lit', 'lrf', 'mobi', 'rb', 'imp'
 | 
			
		||||
                       'epub', 'lit', 'lrx', 'lrf', 'mobi', 
 | 
			
		||||
                       'rb', 'imp'
 | 
			
		||||
                      ]
 | 
			
		||||
 | 
			
		||||
# The priorities for loading metadata from different file types
 | 
			
		||||
 | 
			
		||||
@ -70,7 +70,7 @@ class Manifest(ResourceCollection):
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def from_opf_manifest_element(manifest, dir):
 | 
			
		||||
        m = Manifest()
 | 
			
		||||
        for item in manifest.findAll('item'):
 | 
			
		||||
        for item in manifest.findAll(re.compile('item')):
 | 
			
		||||
            try:
 | 
			
		||||
                m.append(ManifestItem.from_opf_manifest_item(item, dir))
 | 
			
		||||
                id = item.get('id', '')
 | 
			
		||||
@ -130,7 +130,7 @@ class Spine(ResourceCollection):
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def from_opf_spine_element(spine, manifest):
 | 
			
		||||
        s = Spine(manifest)
 | 
			
		||||
        for itemref in spine.findAll('itemref'):
 | 
			
		||||
        for itemref in spine.findAll(re.compile('itemref')):
 | 
			
		||||
            if itemref.has_key('idref'):
 | 
			
		||||
                r = Spine.Item(s.manifest.id_for_path,
 | 
			
		||||
                               s.manifest.path_for_id(itemref['idref']), is_path=True)
 | 
			
		||||
@ -242,14 +242,27 @@ class OPF(MetaInformation):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        raise NotImplementedError('Abstract base class')
 | 
			
		||||
    
 | 
			
		||||
    @apply
 | 
			
		||||
    def package():
 | 
			
		||||
        def fget(self):
 | 
			
		||||
            return self.soup.find(re.compile('package'))
 | 
			
		||||
        return property(fget=fget)
 | 
			
		||||
    
 | 
			
		||||
    @apply
 | 
			
		||||
    def metadata():
 | 
			
		||||
        def fget(self):
 | 
			
		||||
            return self.package.find(re.compile('metadata'))
 | 
			
		||||
        return property(fget=fget)
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    def get_title(self):
 | 
			
		||||
        title = self.soup.package.metadata.find('dc:title')
 | 
			
		||||
        title = self.metadata.find('dc:title')
 | 
			
		||||
        if title and title.string:
 | 
			
		||||
            return self.ENTITY_PATTERN.sub(entity_to_unicode, title.string).strip()
 | 
			
		||||
        return self.default_title.strip()
 | 
			
		||||
    
 | 
			
		||||
    def get_authors(self):
 | 
			
		||||
        creators = self.soup.package.metadata.findAll('dc:creator')
 | 
			
		||||
        creators = self.metadata.findAll('dc:creator')
 | 
			
		||||
        for elem in creators:
 | 
			
		||||
            role = elem.get('role')
 | 
			
		||||
            if not role:
 | 
			
		||||
@ -266,7 +279,7 @@ class OPF(MetaInformation):
 | 
			
		||||
        return []
 | 
			
		||||
    
 | 
			
		||||
    def get_author_sort(self):
 | 
			
		||||
        creators = self.soup.package.metadata.findAll('dc:creator')
 | 
			
		||||
        creators = self.metadata.findAll('dc:creator')
 | 
			
		||||
        for elem in creators:
 | 
			
		||||
            role = elem.get('role')
 | 
			
		||||
            if not role:
 | 
			
		||||
@ -277,7 +290,7 @@ class OPF(MetaInformation):
 | 
			
		||||
        return None
 | 
			
		||||
    
 | 
			
		||||
    def get_title_sort(self):
 | 
			
		||||
        title = self.soup.package.find('dc:title')
 | 
			
		||||
        title = self.package.find('dc:title')
 | 
			
		||||
        if title:
 | 
			
		||||
            if title.has_key('file-as'):
 | 
			
		||||
                return title['file-as'].strip()
 | 
			
		||||
@ -290,7 +303,7 @@ class OPF(MetaInformation):
 | 
			
		||||
        return None
 | 
			
		||||
    
 | 
			
		||||
    def get_uid(self):
 | 
			
		||||
        package = self.soup.find('package')
 | 
			
		||||
        package = self.package
 | 
			
		||||
        if package.has_key('unique-identifier'):
 | 
			
		||||
            return package['unique-identifier']
 | 
			
		||||
        
 | 
			
		||||
@ -307,7 +320,7 @@ class OPF(MetaInformation):
 | 
			
		||||
        return None
 | 
			
		||||
    
 | 
			
		||||
    def get_isbn(self):
 | 
			
		||||
        for item in self.soup.package.metadata.findAll('dc:identifier'):
 | 
			
		||||
        for item in self.metadata.findAll('dc:identifier'):
 | 
			
		||||
            scheme = item.get('scheme')
 | 
			
		||||
            if not scheme:
 | 
			
		||||
                scheme = item.get('opf:scheme')
 | 
			
		||||
@ -316,13 +329,13 @@ class OPF(MetaInformation):
 | 
			
		||||
        return None
 | 
			
		||||
    
 | 
			
		||||
    def get_language(self):
 | 
			
		||||
        item = self.soup.package.metadata.find('dc:language')
 | 
			
		||||
        item = self.metadata.find('dc:language')
 | 
			
		||||
        if not item:
 | 
			
		||||
            return _('Unknown')
 | 
			
		||||
        return ''.join(item.findAll(text=True)).strip()
 | 
			
		||||
    
 | 
			
		||||
    def get_application_id(self):
 | 
			
		||||
        for item in self.soup.package.metadata.findAll('dc:identifier'):
 | 
			
		||||
        for item in self.metadata.findAll('dc:identifier'):
 | 
			
		||||
            scheme = item.get('scheme', None)
 | 
			
		||||
            if scheme is None:
 | 
			
		||||
                scheme = item.get('opf:scheme', None)
 | 
			
		||||
@ -342,7 +355,7 @@ class OPF(MetaInformation):
 | 
			
		||||
    
 | 
			
		||||
    def possible_cover_prefixes(self):
 | 
			
		||||
        isbn, ans = [], []
 | 
			
		||||
        for item in self.soup.package.metadata.findAll('dc:identifier'):
 | 
			
		||||
        for item in self.metadata.findAll('dc:identifier'):
 | 
			
		||||
            scheme = item.get('scheme')
 | 
			
		||||
            if not scheme:
 | 
			
		||||
                scheme = item.get('opf:scheme')
 | 
			
		||||
@ -352,13 +365,13 @@ class OPF(MetaInformation):
 | 
			
		||||
        return ans
 | 
			
		||||
    
 | 
			
		||||
    def get_series(self):
 | 
			
		||||
        s = self.soup.package.metadata.find('series')
 | 
			
		||||
        s = self.metadata.find('series')
 | 
			
		||||
        if s is not None:
 | 
			
		||||
            return str(s.string).strip()
 | 
			
		||||
        return None
 | 
			
		||||
    
 | 
			
		||||
    def get_series_index(self):
 | 
			
		||||
        s = self.soup.package.metadata.find('series-index')
 | 
			
		||||
        s = self.metadata.find('series-index')
 | 
			
		||||
        if s and s.string:
 | 
			
		||||
            try:
 | 
			
		||||
                return int(str(s.string).strip())
 | 
			
		||||
@ -367,7 +380,7 @@ class OPF(MetaInformation):
 | 
			
		||||
        return None
 | 
			
		||||
    
 | 
			
		||||
    def get_rating(self):
 | 
			
		||||
        s = self.soup.package.metadata.find('rating')
 | 
			
		||||
        s = self.metadata.find('rating')
 | 
			
		||||
        if s and s.string:
 | 
			
		||||
            try:
 | 
			
		||||
                return int(str(s.string).strip())
 | 
			
		||||
@ -400,17 +413,17 @@ class OPFReader(OPF):
 | 
			
		||||
        if manage:
 | 
			
		||||
            stream.close()
 | 
			
		||||
        self.manifest = Manifest()
 | 
			
		||||
        m = self.soup.find('manifest')
 | 
			
		||||
        m = self.soup.find(re.compile('manifest'))
 | 
			
		||||
        if m is not None:
 | 
			
		||||
            self.manifest = Manifest.from_opf_manifest_element(m, dir)
 | 
			
		||||
        self.spine = None
 | 
			
		||||
        spine = self.soup.find('spine')
 | 
			
		||||
        spine = self.soup.find(re.compile('spine'))
 | 
			
		||||
        if spine is not None:
 | 
			
		||||
            self.spine = Spine.from_opf_spine_element(spine, self.manifest)
 | 
			
		||||
        
 | 
			
		||||
        self.toc = TOC(base_path=dir)
 | 
			
		||||
        self.toc.read_from_opf(self)
 | 
			
		||||
        guide = self.soup.find('guide')
 | 
			
		||||
        guide = self.soup.find(re.compile('guide'))
 | 
			
		||||
        if guide is not None:
 | 
			
		||||
            self.guide = Guide.from_opf_guide(guide, dir)
 | 
			
		||||
        self.base_dir = dir 
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,6 @@ class Resource(object):
 | 
			
		||||
    :member:`path`
 | 
			
		||||
    :member:`mime_type`
 | 
			
		||||
    :method:`href`
 | 
			
		||||
    
 | 
			
		||||
    '''
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, href_or_path, basedir=os.getcwd(), is_path=True):
 | 
			
		||||
 | 
			
		||||
@ -351,7 +351,7 @@ class SGMLParser(markupbase.ParserBase):
 | 
			
		||||
            if tag not in self.stack:
 | 
			
		||||
                try:
 | 
			
		||||
                    method = getattr(self, 'end_' + tag)
 | 
			
		||||
                except AttributeError:
 | 
			
		||||
                except (AttributeError, ValueError):
 | 
			
		||||
                    self.unknown_endtag(tag)
 | 
			
		||||
                else:
 | 
			
		||||
                    self.report_unbalanced(tag)
 | 
			
		||||
 | 
			
		||||
@ -9,9 +9,10 @@ from PyQt4.QtGui import QDialog
 | 
			
		||||
from calibre.gui2 import qstring_to_unicode
 | 
			
		||||
from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog
 | 
			
		||||
from calibre.gui2.dialogs.tag_editor import TagEditor
 | 
			
		||||
from calibre.ebooks.metadata import string_to_authors
 | 
			
		||||
from calibre.ebooks.metadata import string_to_authors, authors_to_sort_string
 | 
			
		||||
 | 
			
		||||
class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, window, rows, db):
 | 
			
		||||
        QDialog.__init__(self, window)
 | 
			
		||||
        Ui_MetadataBulkDialog.__init__(self)
 | 
			
		||||
@ -54,8 +55,15 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
 | 
			
		||||
            if au:
 | 
			
		||||
                au = string_to_authors(au)
 | 
			
		||||
                self.db.set_authors(id, au, notify=False)
 | 
			
		||||
            if self.auto_author_sort.isChecked():
 | 
			
		||||
                aut = self.db.authors(id, index_is_id=True)
 | 
			
		||||
                aut = aut if aut else ''
 | 
			
		||||
                aut = [a.strip().replace('|', ',') for a in aut.strip().split(',')]
 | 
			
		||||
                x = authors_to_sort_string(aut)
 | 
			
		||||
                if x:
 | 
			
		||||
                    self.db.set_author_sort(id, x, notify=False)
 | 
			
		||||
            aus = qstring_to_unicode(self.author_sort.text())
 | 
			
		||||
            if aus:
 | 
			
		||||
            if aus and self.author_sort.isEnabled():
 | 
			
		||||
                self.db.set_author_sort(id, aus, notify=False)
 | 
			
		||||
            if self.write_rating:
 | 
			
		||||
                self.db.set_rating(id, 2*self.rating.value(), notify=False)
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,7 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="1" column="0" >
 | 
			
		||||
          <item row="2" column="0" >
 | 
			
		||||
           <widget class="QLabel" name="label_8" >
 | 
			
		||||
            <property name="text" >
 | 
			
		||||
             <string>Author S&ort: </string>
 | 
			
		||||
@ -69,14 +69,14 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="1" column="1" colspan="2" >
 | 
			
		||||
          <item row="2" column="1" colspan="2" >
 | 
			
		||||
           <widget class="QLineEdit" name="author_sort" >
 | 
			
		||||
            <property name="toolTip" >
 | 
			
		||||
             <string>Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles.</string>
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="2" column="0" >
 | 
			
		||||
          <item row="3" column="0" >
 | 
			
		||||
           <widget class="QLabel" name="label_6" >
 | 
			
		||||
            <property name="text" >
 | 
			
		||||
             <string>&Rating:</string>
 | 
			
		||||
@ -89,7 +89,7 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="2" column="1" colspan="2" >
 | 
			
		||||
          <item row="3" column="1" colspan="2" >
 | 
			
		||||
           <widget class="QSpinBox" name="rating" >
 | 
			
		||||
            <property name="toolTip" >
 | 
			
		||||
             <string>Rating of this book. 0-5 stars</string>
 | 
			
		||||
@ -108,7 +108,7 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="3" column="0" >
 | 
			
		||||
          <item row="4" column="0" >
 | 
			
		||||
           <widget class="QLabel" name="label_3" >
 | 
			
		||||
            <property name="text" >
 | 
			
		||||
             <string>&Publisher: </string>
 | 
			
		||||
@ -121,14 +121,14 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="3" column="1" colspan="2" >
 | 
			
		||||
          <item row="4" column="1" colspan="2" >
 | 
			
		||||
           <widget class="QLineEdit" name="publisher" >
 | 
			
		||||
            <property name="toolTip" >
 | 
			
		||||
             <string>Change the publisher of this book</string>
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="4" column="0" >
 | 
			
		||||
          <item row="5" column="0" >
 | 
			
		||||
           <widget class="QLabel" name="label_4" >
 | 
			
		||||
            <property name="text" >
 | 
			
		||||
             <string>Add Ta&gs: </string>
 | 
			
		||||
@ -141,14 +141,14 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="4" column="1" >
 | 
			
		||||
          <item row="5" column="1" >
 | 
			
		||||
           <widget class="QLineEdit" name="tags" >
 | 
			
		||||
            <property name="toolTip" >
 | 
			
		||||
             <string>Tags categorize the book. This is particularly useful while searching. <br><br>They can be any words or phrases, separated by commas.</string>
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="4" column="2" >
 | 
			
		||||
          <item row="5" column="2" >
 | 
			
		||||
           <widget class="QToolButton" name="tag_editor_button" >
 | 
			
		||||
            <property name="toolTip" >
 | 
			
		||||
             <string>Open Tag Editor</string>
 | 
			
		||||
@ -162,7 +162,7 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="5" column="0" >
 | 
			
		||||
          <item row="6" column="0" >
 | 
			
		||||
           <widget class="QLabel" name="label" >
 | 
			
		||||
            <property name="text" >
 | 
			
		||||
             <string>&Remove tags:</string>
 | 
			
		||||
@ -172,14 +172,14 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="5" column="1" colspan="2" >
 | 
			
		||||
          <item row="6" column="1" colspan="2" >
 | 
			
		||||
           <widget class="QLineEdit" name="remove_tags" >
 | 
			
		||||
            <property name="toolTip" >
 | 
			
		||||
             <string>Comma separated list of tags to remove from the books. </string>
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="6" column="0" >
 | 
			
		||||
          <item row="7" column="0" >
 | 
			
		||||
           <widget class="QLabel" name="label_7" >
 | 
			
		||||
            <property name="text" >
 | 
			
		||||
             <string>&Series:</string>
 | 
			
		||||
@ -195,7 +195,7 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="6" column="1" >
 | 
			
		||||
          <item row="7" column="1" >
 | 
			
		||||
           <widget class="QComboBox" name="series" >
 | 
			
		||||
            <property name="toolTip" >
 | 
			
		||||
             <string>List of known series. You can add new series.</string>
 | 
			
		||||
@ -214,10 +214,10 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="7" column="1" >
 | 
			
		||||
          <item row="8" column="1" >
 | 
			
		||||
           <widget class="QComboBox" name="remove_format" />
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="7" column="0" >
 | 
			
		||||
          <item row="8" column="0" >
 | 
			
		||||
           <widget class="QLabel" name="label_5" >
 | 
			
		||||
            <property name="text" >
 | 
			
		||||
             <string>Remove &format:</string>
 | 
			
		||||
@ -227,6 +227,13 @@
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
          <item row="1" column="1" >
 | 
			
		||||
           <widget class="QCheckBox" name="auto_author_sort" >
 | 
			
		||||
            <property name="text" >
 | 
			
		||||
             <string>A&utomatically set author sort</string>
 | 
			
		||||
            </property>
 | 
			
		||||
           </widget>
 | 
			
		||||
          </item>
 | 
			
		||||
         </layout>
 | 
			
		||||
        </widget>
 | 
			
		||||
       </item>
 | 
			
		||||
@ -257,8 +264,8 @@
 | 
			
		||||
   <slot>accept()</slot>
 | 
			
		||||
   <hints>
 | 
			
		||||
    <hint type="sourcelabel" >
 | 
			
		||||
     <x>248</x>
 | 
			
		||||
     <y>254</y>
 | 
			
		||||
     <x>252</x>
 | 
			
		||||
     <y>382</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
    <hint type="destinationlabel" >
 | 
			
		||||
     <x>157</x>
 | 
			
		||||
@ -273,8 +280,8 @@
 | 
			
		||||
   <slot>reject()</slot>
 | 
			
		||||
   <hints>
 | 
			
		||||
    <hint type="sourcelabel" >
 | 
			
		||||
     <x>316</x>
 | 
			
		||||
     <y>260</y>
 | 
			
		||||
     <x>320</x>
 | 
			
		||||
     <y>382</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
    <hint type="destinationlabel" >
 | 
			
		||||
     <x>286</x>
 | 
			
		||||
@ -282,5 +289,21 @@
 | 
			
		||||
    </hint>
 | 
			
		||||
   </hints>
 | 
			
		||||
  </connection>
 | 
			
		||||
  <connection>
 | 
			
		||||
   <sender>auto_author_sort</sender>
 | 
			
		||||
   <signal>toggled(bool)</signal>
 | 
			
		||||
   <receiver>author_sort</receiver>
 | 
			
		||||
   <slot>setDisabled(bool)</slot>
 | 
			
		||||
   <hints>
 | 
			
		||||
    <hint type="sourcelabel" >
 | 
			
		||||
     <x>240</x>
 | 
			
		||||
     <y>95</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
    <hint type="destinationlabel" >
 | 
			
		||||
     <x>240</x>
 | 
			
		||||
     <y>113</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
   </hints>
 | 
			
		||||
  </connection>
 | 
			
		||||
 </connections>
 | 
			
		||||
</ui>
 | 
			
		||||
 | 
			
		||||
@ -129,6 +129,7 @@ class MetadataSingleDialog(QDialog, Ui_MetadataSingleDialog):
 | 
			
		||||
        QDialog.__init__(self, window)
 | 
			
		||||
        Ui_MetadataSingleDialog.__init__(self)        
 | 
			
		||||
        self.setupUi(self)
 | 
			
		||||
        self.bc_box.layout().setAlignment(self.cover, Qt.AlignCenter|Qt.AlignHCenter)
 | 
			
		||||
        self.splitter.setStretchFactor(100, 1)
 | 
			
		||||
        self.db = db
 | 
			
		||||
        self.accepted_callback = accepted_callback
 | 
			
		||||
 | 
			
		||||
@ -439,7 +439,7 @@
 | 
			
		||||
        </widget>
 | 
			
		||||
       </item>
 | 
			
		||||
       <item>
 | 
			
		||||
        <widget class="QGroupBox" name="groupBox_4" >
 | 
			
		||||
        <widget class="QGroupBox" name="bc_box" >
 | 
			
		||||
         <property name="sizePolicy" >
 | 
			
		||||
          <sizepolicy vsizetype="Expanding" hsizetype="Preferred" >
 | 
			
		||||
           <horstretch>0</horstretch>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/calibre/gui2/images/news/telegraph_uk.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/calibre/gui2/images/news/telegraph_uk.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 863 B  | 
@ -163,11 +163,18 @@ class BooksModel(QAbstractTableModel):
 | 
			
		||||
        self.reset()
 | 
			
		||||
 | 
			
		||||
    def add_books(self, paths, formats, metadata, uris=[], add_duplicates=False):
 | 
			
		||||
        return self.db.add_books(paths, formats, metadata, uris,
 | 
			
		||||
        ret = self.db.add_books(paths, formats, metadata, uris,
 | 
			
		||||
                                 add_duplicates=add_duplicates)
 | 
			
		||||
        self.count_changed()
 | 
			
		||||
        return ret
 | 
			
		||||
        
 | 
			
		||||
    def add_news(self, path, recipe):
 | 
			
		||||
        return self.db.add_news(path, recipe)
 | 
			
		||||
        ret = self.db.add_news(path, recipe)
 | 
			
		||||
        self.count_changed()
 | 
			
		||||
        return ret
 | 
			
		||||
    
 | 
			
		||||
    def count_changed(self, *args):
 | 
			
		||||
        self.emit(SIGNAL('count_changed(int)'), self.db.count())
 | 
			
		||||
 | 
			
		||||
    def row_indices(self, index):
 | 
			
		||||
        ''' Return list indices of all cells in index.row()'''
 | 
			
		||||
@ -189,9 +196,11 @@ class BooksModel(QAbstractTableModel):
 | 
			
		||||
            self.beginRemoveRows(QModelIndex(), row, row)
 | 
			
		||||
            self.db.delete_book(id)
 | 
			
		||||
            self.endRemoveRows()
 | 
			
		||||
        self.count_changed()
 | 
			
		||||
        self.clear_caches()
 | 
			
		||||
        self.reset()
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
    def delete_books_by_id(self, ids):
 | 
			
		||||
        for id in ids:
 | 
			
		||||
            try:
 | 
			
		||||
@ -203,12 +212,14 @@ class BooksModel(QAbstractTableModel):
 | 
			
		||||
            self.db.delete_book(id)
 | 
			
		||||
            if row > -1:
 | 
			
		||||
                self.endRemoveRows()
 | 
			
		||||
        self.count_changed()
 | 
			
		||||
        self.clear_caches()
 | 
			
		||||
 | 
			
		||||
    def books_added(self, num):
 | 
			
		||||
        if num > 0:
 | 
			
		||||
            self.beginInsertRows(QModelIndex(), 0, num-1)
 | 
			
		||||
            self.endInsertRows()
 | 
			
		||||
        self.count_changed()
 | 
			
		||||
 | 
			
		||||
    def search(self, text, refinement, reset=True):
 | 
			
		||||
        self.db.search(text)
 | 
			
		||||
 | 
			
		||||
@ -297,6 +297,8 @@ class Main(MainWindow, Ui_MainWindow):
 | 
			
		||||
        self.connect(self.status_bar.tag_view_button, SIGNAL('toggled(bool)'), self.toggle_tags_view)
 | 
			
		||||
        self.connect(self.search, SIGNAL('search(PyQt_PyObject, PyQt_PyObject)'),
 | 
			
		||||
                     self.tags_view.model().reinit)
 | 
			
		||||
        self.connect(self.library_view.model(), SIGNAL('count_changed(int)'), self.location_view.count_changed)
 | 
			
		||||
        self.library_view.model().count_changed()
 | 
			
		||||
        ########################### Cover Flow ################################
 | 
			
		||||
        self.cover_flow = None
 | 
			
		||||
        if CoverFlow is not None:
 | 
			
		||||
@ -344,12 +346,12 @@ class Main(MainWindow, Ui_MainWindow):
 | 
			
		||||
            self.library_view.setCurrentIndex(self.library_view.currentIndex())
 | 
			
		||||
            self.cover_flow.setVisible(True)
 | 
			
		||||
            self.cover_flow.setFocus(Qt.OtherFocusReason)
 | 
			
		||||
            self.status_bar.book_info.book_data.setMaximumHeight(100)
 | 
			
		||||
            self.status_bar.setMaximumHeight(120)
 | 
			
		||||
            #self.status_bar.book_info.book_data.setMaximumHeight(100)
 | 
			
		||||
            #self.status_bar.setMaximumHeight(120)
 | 
			
		||||
            self.library_view.scrollTo(self.library_view.currentIndex())
 | 
			
		||||
        else:
 | 
			
		||||
            self.cover_flow.setVisible(False)
 | 
			
		||||
            self.status_bar.book_info.book_data.setMaximumHeight(1000)
 | 
			
		||||
            #self.status_bar.book_info.book_data.setMaximumHeight(1000)
 | 
			
		||||
        self.setMaximumHeight(available_height())
 | 
			
		||||
 | 
			
		||||
    def toggle_tags_view(self, show):
 | 
			
		||||
 | 
			
		||||
@ -2,16 +2,18 @@ __license__   = 'GPL v3'
 | 
			
		||||
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
 | 
			
		||||
import re, collections
 | 
			
		||||
 | 
			
		||||
from PyQt4.QtGui import QStatusBar, QMovie, QLabel, QFrame, QHBoxLayout, QPixmap, \
 | 
			
		||||
                        QVBoxLayout, QSizePolicy, QToolButton, QIcon
 | 
			
		||||
from PyQt4.QtGui import QStatusBar, QMovie, QLabel, QWidget, QHBoxLayout, QPixmap, \
 | 
			
		||||
                        QVBoxLayout, QSizePolicy, QToolButton, QIcon, QScrollArea, QFrame
 | 
			
		||||
from PyQt4.QtCore import Qt, QSize, SIGNAL, QCoreApplication
 | 
			
		||||
from calibre import fit_image, preferred_encoding
 | 
			
		||||
from calibre.gui2 import qstring_to_unicode
 | 
			
		||||
 | 
			
		||||
class BookInfoDisplay(QFrame):
 | 
			
		||||
class BookInfoDisplay(QWidget):
 | 
			
		||||
    class BookCoverDisplay(QLabel):
 | 
			
		||||
        WIDTH = 80
 | 
			
		||||
        HEIGHT = 100
 | 
			
		||||
        
 | 
			
		||||
        WIDTH = 81
 | 
			
		||||
        HEIGHT = 108
 | 
			
		||||
        
 | 
			
		||||
        def __init__(self, coverpath=':/images/book.svg'):
 | 
			
		||||
            QLabel.__init__(self)
 | 
			
		||||
            self.default_pixmap = QPixmap(coverpath).scaled(self.__class__.WIDTH,
 | 
			
		||||
@ -19,6 +21,7 @@ class BookInfoDisplay(QFrame):
 | 
			
		||||
                                                            Qt.IgnoreAspectRatio,
 | 
			
		||||
                                                            Qt.SmoothTransformation)
 | 
			
		||||
            self.setScaledContents(True)
 | 
			
		||||
            self.setMaximumHeight(self.HEIGHT)
 | 
			
		||||
            self.setPixmap(self.default_pixmap)
 | 
			
		||||
            
 | 
			
		||||
        
 | 
			
		||||
@ -39,11 +42,9 @@ class BookInfoDisplay(QFrame):
 | 
			
		||||
    class BookDataDisplay(QLabel):
 | 
			
		||||
        def __init__(self):
 | 
			
		||||
            QLabel.__init__(self)
 | 
			
		||||
            #self.setTextInteractionFlags(Qt.TextSelectableByMouse)
 | 
			
		||||
            self.setText('')
 | 
			
		||||
            self.setWordWrap(True)
 | 
			
		||||
            self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum))
 | 
			
		||||
            self.setMaximumHeight(100)
 | 
			
		||||
            self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
 | 
			
		||||
            
 | 
			
		||||
        def mouseReleaseEvent(self, ev):
 | 
			
		||||
            self.emit(SIGNAL('mr(int)'), 1)
 | 
			
		||||
@ -56,18 +57,20 @@ class BookInfoDisplay(QFrame):
 | 
			
		||||
    WEIGHTS[_('Tags')] = 4
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, clear_message):
 | 
			
		||||
        QFrame.__init__(self)
 | 
			
		||||
        QWidget.__init__(self)
 | 
			
		||||
        self.setCursor(Qt.PointingHandCursor)
 | 
			
		||||
        self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
 | 
			
		||||
        self._layout = QHBoxLayout()
 | 
			
		||||
        self.setLayout(self._layout)
 | 
			
		||||
        self.clear_message = clear_message
 | 
			
		||||
        self.layout = QHBoxLayout()
 | 
			
		||||
        self.setLayout(self.layout)
 | 
			
		||||
        self.cover_display = BookInfoDisplay.BookCoverDisplay()
 | 
			
		||||
        self.layout.addWidget(self.cover_display)
 | 
			
		||||
        self._layout.addWidget(self.cover_display)
 | 
			
		||||
        self.book_data = BookInfoDisplay.BookDataDisplay()
 | 
			
		||||
        self.connect(self.book_data, SIGNAL('mr(int)'), self.mouseReleaseEvent)
 | 
			
		||||
        self.layout.addWidget(self.book_data)
 | 
			
		||||
        self._layout.addWidget(self.book_data)
 | 
			
		||||
        self.data = {}
 | 
			
		||||
        self.setVisible(False)
 | 
			
		||||
        self._layout.setAlignment(self.cover_display, Qt.AlignTop|Qt.AlignLeft)
 | 
			
		||||
        
 | 
			
		||||
    def mouseReleaseEvent(self, ev):
 | 
			
		||||
        self.emit(SIGNAL('show_book_info()'))
 | 
			
		||||
@ -85,7 +88,6 @@ class BookInfoDisplay(QFrame):
 | 
			
		||||
        keys.sort(cmp=lambda x, y: cmp(self.WEIGHTS[x], self.WEIGHTS[y]))
 | 
			
		||||
        for key in keys:
 | 
			
		||||
            txt = data[key]
 | 
			
		||||
            #txt = '<br />\n'.join(textwrap.wrap(txt, 120))
 | 
			
		||||
            if isinstance(key, str):
 | 
			
		||||
                key = key.decode(preferred_encoding, 'replace')
 | 
			
		||||
            if isinstance(txt, str):
 | 
			
		||||
@ -94,6 +96,8 @@ class BookInfoDisplay(QFrame):
 | 
			
		||||
        self.book_data.setText(u'<table>'+rows+u'</table>')
 | 
			
		||||
        
 | 
			
		||||
        self.clear_message()
 | 
			
		||||
        self.book_data.updateGeometry()
 | 
			
		||||
        self.updateGeometry()
 | 
			
		||||
        self.setVisible(True)
 | 
			
		||||
 | 
			
		||||
class MovieButton(QFrame):
 | 
			
		||||
@ -164,6 +168,7 @@ class TagViewButton(QToolButton):
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
class StatusBar(QStatusBar):
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, jobs_dialog, systray=None):
 | 
			
		||||
        QStatusBar.__init__(self)
 | 
			
		||||
        self.systray = systray
 | 
			
		||||
@ -174,9 +179,15 @@ class StatusBar(QStatusBar):
 | 
			
		||||
        self.addPermanentWidget(self.tag_view_button)
 | 
			
		||||
        self.addPermanentWidget(self.movie_button)
 | 
			
		||||
        self.book_info = BookInfoDisplay(self.clearMessage)
 | 
			
		||||
        self.scroll_area = QScrollArea()
 | 
			
		||||
        self.scroll_area.setWidget(self.book_info)
 | 
			
		||||
        self.scroll_area.setMaximumHeight(120)
 | 
			
		||||
        self.scroll_area.setWidgetResizable(True)
 | 
			
		||||
        self.connect(self.book_info, SIGNAL('show_book_info()'), self.show_book_info)
 | 
			
		||||
        self.addWidget(self.book_info)
 | 
			
		||||
        self.addWidget(self.scroll_area, 100)
 | 
			
		||||
        self.setMinimumHeight(120)
 | 
			
		||||
        self.setMaximumHeight(120)
 | 
			
		||||
        
 | 
			
		||||
    
 | 
			
		||||
    def reset_info(self):
 | 
			
		||||
        self.book_info.show_data({})
 | 
			
		||||
 | 
			
		||||
@ -512,10 +512,18 @@ class DocumentView(QWebView):
 | 
			
		||||
        
 | 
			
		||||
    def wheelEvent(self, event):
 | 
			
		||||
        if event.delta() < -14:
 | 
			
		||||
            self.next_page()
 | 
			
		||||
            if self.document.at_bottom:
 | 
			
		||||
                if self.manager is not None:
 | 
			
		||||
                    self.manager.next_document()
 | 
			
		||||
                    event.accept()
 | 
			
		||||
                    return
 | 
			
		||||
        elif event.delta() > 14:
 | 
			
		||||
            self.previous_page()
 | 
			
		||||
        event.accept()
 | 
			
		||||
            if self.document.at_top:
 | 
			
		||||
                if self.manager is not None:
 | 
			
		||||
                    self.manager.previous_document()
 | 
			
		||||
                    event.accept()
 | 
			
		||||
                    return
 | 
			
		||||
        return QWebView.wheelEvent(self, event)
 | 
			
		||||
    
 | 
			
		||||
    def keyPressEvent(self, event):
 | 
			
		||||
        key = event.key()
 | 
			
		||||
 | 
			
		||||
@ -136,10 +136,11 @@ class LocationModel(QAbstractListModel):
 | 
			
		||||
        self.icons = [QVariant(QIcon(':/library')),
 | 
			
		||||
                      QVariant(QIcon(':/images/reader.svg')),
 | 
			
		||||
                      QVariant(QIcon(':/images/sd.svg'))]
 | 
			
		||||
        self.text = [_('Library'),
 | 
			
		||||
        self.text = [_('Library\n%d\nbooks'),
 | 
			
		||||
                     _('Reader\n%s\navailable'),
 | 
			
		||||
                     _('Card\n%s\navailable')]
 | 
			
		||||
        self.free = [-1, -1]
 | 
			
		||||
        self.count = 0
 | 
			
		||||
        self.highlight_row = 0
 | 
			
		||||
        self.tooltips = [
 | 
			
		||||
                         _('Click to see the list of books available on your computer'),
 | 
			
		||||
@ -155,7 +156,7 @@ class LocationModel(QAbstractListModel):
 | 
			
		||||
        data = NONE
 | 
			
		||||
        if role == Qt.DisplayRole:
 | 
			
		||||
            text = self.text[row]%(human_readable(self.free[row-1])) if row > 0 \
 | 
			
		||||
                            else self.text[row]
 | 
			
		||||
                            else self.text[row]%self.count
 | 
			
		||||
            data = QVariant(text)
 | 
			
		||||
        elif role == Qt.DecorationRole:                
 | 
			
		||||
            data = self.icons[row]
 | 
			
		||||
@ -192,6 +193,10 @@ class LocationView(QListView):
 | 
			
		||||
        QObject.connect(self.selectionModel(), SIGNAL('currentChanged(QModelIndex, QModelIndex)'), self.current_changed)
 | 
			
		||||
        self.setCursor(Qt.PointingHandCursor)      
 | 
			
		||||
    
 | 
			
		||||
    def count_changed(self, new_count):
 | 
			
		||||
        self.model().count = new_count
 | 
			
		||||
        self.model().reset()
 | 
			
		||||
    
 | 
			
		||||
    def current_changed(self, current, previous):
 | 
			
		||||
        i = current.row()
 | 
			
		||||
        location = 'library' if i == 0 else 'main' if i == 1 else 'card'
 | 
			
		||||
 | 
			
		||||
@ -255,6 +255,9 @@ class ResultCache(SearchQueryParser):
 | 
			
		||||
            if id in self._map: self._map.remove(id)
 | 
			
		||||
            if id in self._map_filtered: self._map_filtered.remove(id)
 | 
			
		||||
    
 | 
			
		||||
    def count(self):
 | 
			
		||||
        return len(self._map)
 | 
			
		||||
    
 | 
			
		||||
    def refresh(self, db, field=None, ascending=True):
 | 
			
		||||
        temp = db.conn.get('SELECT * FROM meta')
 | 
			
		||||
        self._data = list(itertools.repeat(None, temp[-1][0]+2)) if temp else []
 | 
			
		||||
@ -375,6 +378,7 @@ class LibraryDatabase2(LibraryDatabase):
 | 
			
		||||
        self.refresh_ids = functools.partial(self.data.refresh_ids, self.conn)
 | 
			
		||||
        self.row     = self.data.row
 | 
			
		||||
        self.has_id  = self.data.has_id
 | 
			
		||||
        self.count   = self.data.count
 | 
			
		||||
        
 | 
			
		||||
        self.refresh()
 | 
			
		||||
        
 | 
			
		||||
@ -1191,9 +1195,6 @@ class LibraryDatabase2(LibraryDatabase):
 | 
			
		||||
        for i in iter(self):
 | 
			
		||||
            yield i['id']
 | 
			
		||||
            
 | 
			
		||||
    def count(self):
 | 
			
		||||
        return len(self.data._map)
 | 
			
		||||
    
 | 
			
		||||
    def get_data_as_dict(self, prefix=None, authors_as_string=False):
 | 
			
		||||
        '''
 | 
			
		||||
        Return all metadata stored in the database as a dict. Includes paths to
 | 
			
		||||
 | 
			
		||||
@ -465,6 +465,17 @@ def post_install():
 | 
			
		||||
            if os.stat(f).st_uid == 0:
 | 
			
		||||
                os.unlink(f)
 | 
			
		||||
 | 
			
		||||
def binary_install():
 | 
			
		||||
    manifest = os.path.join(sys.frozen_path, 'manifest')
 | 
			
		||||
    exes = [x.strip() for x in open(manifest).readlines()]
 | 
			
		||||
    print 'Creating symlinks...'
 | 
			
		||||
    for exe in exes:
 | 
			
		||||
        dest = os.path.join('/usr', 'bin', exe)
 | 
			
		||||
        if os.path.exists(dest):
 | 
			
		||||
            os.remove(dest)
 | 
			
		||||
        os.symlink(os.path.join(sys.frozen_path, exe), dest)
 | 
			
		||||
    post_install()
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
VIEWER = '''\
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
@ -580,7 +591,7 @@ def setup_desktop_integration(fatal_errors):
 | 
			
		||||
        print >>sys.stderr, 'Could not setup desktop integration. Error:'
 | 
			
		||||
        print err
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
main = post_install
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    post_install()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,327 +0,0 @@
 | 
			
		||||
#!/usr/bin/env  python
 | 
			
		||||
__license__   = 'GPL v3'
 | 
			
		||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
 | 
			
		||||
__docformat__ = 'restructuredtext en'
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
Download and install the linux binary.
 | 
			
		||||
'''
 | 
			
		||||
import sys, os, shutil, tarfile, subprocess, tempfile, urllib2, re, stat
 | 
			
		||||
 | 
			
		||||
MOBILEREAD='https://dev.mobileread.com/dist/kovid/calibre/'
 | 
			
		||||
 | 
			
		||||
class TerminalController:
 | 
			
		||||
    """
 | 
			
		||||
    A class that can be used to portably generate formatted output to
 | 
			
		||||
    a terminal.  
 | 
			
		||||
    
 | 
			
		||||
    `TerminalController` defines a set of instance variables whose
 | 
			
		||||
    values are initialized to the control sequence necessary to
 | 
			
		||||
    perform a given action.  These can be simply included in normal
 | 
			
		||||
    output to the terminal:
 | 
			
		||||
    
 | 
			
		||||
    >>> term = TerminalController()
 | 
			
		||||
    >>> print 'This is '+term.GREEN+'green'+term.NORMAL
 | 
			
		||||
    
 | 
			
		||||
    Alternatively, the `render()` method can used, which replaces
 | 
			
		||||
    '${action}' with the string required to perform 'action':
 | 
			
		||||
    
 | 
			
		||||
    >>> term = TerminalController()
 | 
			
		||||
    >>> print term.render('This is ${GREEN}green${NORMAL}')
 | 
			
		||||
    
 | 
			
		||||
    If the terminal doesn't support a given action, then the value of
 | 
			
		||||
    the corresponding instance variable will be set to ''.  As a
 | 
			
		||||
    result, the above code will still work on terminals that do not
 | 
			
		||||
    support color, except that their output will not be colored.
 | 
			
		||||
    Also, this means that you can test whether the terminal supports a
 | 
			
		||||
    given action by simply testing the truth value of the
 | 
			
		||||
    corresponding instance variable:
 | 
			
		||||
    
 | 
			
		||||
    >>> term = TerminalController()
 | 
			
		||||
    >>> if term.CLEAR_SCREEN:
 | 
			
		||||
    ...     print 'This terminal supports clearning the screen.'
 | 
			
		||||
    
 | 
			
		||||
    Finally, if the width and height of the terminal are known, then
 | 
			
		||||
    they will be stored in the `COLS` and `LINES` attributes.
 | 
			
		||||
    """
 | 
			
		||||
    # Cursor movement:
 | 
			
		||||
    BOL = ''             #: Move the cursor to the beginning of the line
 | 
			
		||||
    UP = ''              #: Move the cursor up one line
 | 
			
		||||
    DOWN = ''            #: Move the cursor down one line
 | 
			
		||||
    LEFT = ''            #: Move the cursor left one char
 | 
			
		||||
    RIGHT = ''           #: Move the cursor right one char
 | 
			
		||||
    
 | 
			
		||||
    # Deletion:
 | 
			
		||||
    CLEAR_SCREEN = ''    #: Clear the screen and move to home position
 | 
			
		||||
    CLEAR_EOL = ''       #: Clear to the end of the line.
 | 
			
		||||
    CLEAR_BOL = ''       #: Clear to the beginning of the line.
 | 
			
		||||
    CLEAR_EOS = ''       #: Clear to the end of the screen
 | 
			
		||||
    
 | 
			
		||||
    # Output modes:
 | 
			
		||||
    BOLD = ''            #: Turn on bold mode
 | 
			
		||||
    BLINK = ''           #: Turn on blink mode
 | 
			
		||||
    DIM = ''             #: Turn on half-bright mode
 | 
			
		||||
    REVERSE = ''         #: Turn on reverse-video mode
 | 
			
		||||
    NORMAL = ''          #: Turn off all modes
 | 
			
		||||
    
 | 
			
		||||
    # Cursor display:
 | 
			
		||||
    HIDE_CURSOR = ''     #: Make the cursor invisible
 | 
			
		||||
    SHOW_CURSOR = ''     #: Make the cursor visible
 | 
			
		||||
    
 | 
			
		||||
    # Terminal size:
 | 
			
		||||
    COLS = None          #: Width of the terminal (None for unknown)
 | 
			
		||||
    LINES = None         #: Height of the terminal (None for unknown)
 | 
			
		||||
    
 | 
			
		||||
    # Foreground colors:
 | 
			
		||||
    BLACK = BLUE = GREEN = CYAN = RED = MAGENTA = YELLOW = WHITE = ''
 | 
			
		||||
    
 | 
			
		||||
    # Background colors:
 | 
			
		||||
    BG_BLACK = BG_BLUE = BG_GREEN = BG_CYAN = ''
 | 
			
		||||
    BG_RED = BG_MAGENTA = BG_YELLOW = BG_WHITE = ''
 | 
			
		||||
    
 | 
			
		||||
    _STRING_CAPABILITIES = """
 | 
			
		||||
    BOL=cr UP=cuu1 DOWN=cud1 LEFT=cub1 RIGHT=cuf1
 | 
			
		||||
    CLEAR_SCREEN=clear CLEAR_EOL=el CLEAR_BOL=el1 CLEAR_EOS=ed BOLD=bold
 | 
			
		||||
    BLINK=blink DIM=dim REVERSE=rev UNDERLINE=smul NORMAL=sgr0
 | 
			
		||||
    HIDE_CURSOR=cinvis SHOW_CURSOR=cnorm""".split()
 | 
			
		||||
    _COLORS = """BLACK BLUE GREEN CYAN RED MAGENTA YELLOW WHITE""".split()
 | 
			
		||||
    _ANSICOLORS = "BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE".split()
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, term_stream=sys.stdout):
 | 
			
		||||
        """
 | 
			
		||||
        Create a `TerminalController` and initialize its attributes
 | 
			
		||||
        with appropriate values for the current terminal.
 | 
			
		||||
        `term_stream` is the stream that will be used for terminal
 | 
			
		||||
        output; if this stream is not a tty, then the terminal is
 | 
			
		||||
        assumed to be a dumb terminal (i.e., have no capabilities).
 | 
			
		||||
        """
 | 
			
		||||
        # Curses isn't available on all platforms
 | 
			
		||||
        try: import curses
 | 
			
		||||
        except: return
 | 
			
		||||
        
 | 
			
		||||
        # If the stream isn't a tty, then assume it has no capabilities.
 | 
			
		||||
        if not hasattr(term_stream, 'isatty') or not term_stream.isatty(): return
 | 
			
		||||
        
 | 
			
		||||
        # Check the terminal type.  If we fail, then assume that the
 | 
			
		||||
        # terminal has no capabilities.
 | 
			
		||||
        try: curses.setupterm()
 | 
			
		||||
        except: return
 | 
			
		||||
        
 | 
			
		||||
        # Look up numeric capabilities.
 | 
			
		||||
        self.COLS = curses.tigetnum('cols')
 | 
			
		||||
        self.LINES = curses.tigetnum('lines')
 | 
			
		||||
        
 | 
			
		||||
        # Look up string capabilities.
 | 
			
		||||
        for capability in self._STRING_CAPABILITIES:
 | 
			
		||||
            (attrib, cap_name) = capability.split('=')
 | 
			
		||||
            setattr(self, attrib, self._tigetstr(cap_name) or '')
 | 
			
		||||
        
 | 
			
		||||
        # Colors
 | 
			
		||||
        set_fg = self._tigetstr('setf')
 | 
			
		||||
        if set_fg:
 | 
			
		||||
            for i,color in zip(range(len(self._COLORS)), self._COLORS):
 | 
			
		||||
                setattr(self, color, curses.tparm(set_fg, i) or '')
 | 
			
		||||
        set_fg_ansi = self._tigetstr('setaf')
 | 
			
		||||
        if set_fg_ansi:
 | 
			
		||||
            for i,color in zip(range(len(self._ANSICOLORS)), self._ANSICOLORS):
 | 
			
		||||
                setattr(self, color, curses.tparm(set_fg_ansi, i) or '')
 | 
			
		||||
        set_bg = self._tigetstr('setb')
 | 
			
		||||
        if set_bg:
 | 
			
		||||
            for i,color in zip(range(len(self._COLORS)), self._COLORS):
 | 
			
		||||
                setattr(self, 'BG_'+color, curses.tparm(set_bg, i) or '')
 | 
			
		||||
        set_bg_ansi = self._tigetstr('setab')
 | 
			
		||||
        if set_bg_ansi:
 | 
			
		||||
            for i,color in zip(range(len(self._ANSICOLORS)), self._ANSICOLORS):
 | 
			
		||||
                setattr(self, 'BG_'+color, curses.tparm(set_bg_ansi, i) or '')
 | 
			
		||||
    
 | 
			
		||||
    def _tigetstr(self, cap_name):
 | 
			
		||||
        # String capabilities can include "delays" of the form "$<2>".
 | 
			
		||||
        # For any modern terminal, we should be able to just ignore
 | 
			
		||||
        # these, so strip them out.
 | 
			
		||||
        import curses
 | 
			
		||||
        cap = curses.tigetstr(cap_name) or ''
 | 
			
		||||
        return re.sub(r'\$<\d+>[/*]?', '', cap)
 | 
			
		||||
    
 | 
			
		||||
    def render(self, template):
 | 
			
		||||
        """
 | 
			
		||||
        Replace each $-substitutions in the given template string with
 | 
			
		||||
        the corresponding terminal control string (if it's defined) or
 | 
			
		||||
        '' (if it's not).
 | 
			
		||||
        """
 | 
			
		||||
        return re.sub(r'\$\$|\${\w+}', self._render_sub, template)
 | 
			
		||||
    
 | 
			
		||||
    def _render_sub(self, match):
 | 
			
		||||
        s = match.group()
 | 
			
		||||
        if s == '$$': return s
 | 
			
		||||
        else: return getattr(self, s[2:-1])
 | 
			
		||||
 | 
			
		||||
#######################################################################
 | 
			
		||||
# Example use case: progress bar
 | 
			
		||||
#######################################################################
 | 
			
		||||
 | 
			
		||||
class ProgressBar:
 | 
			
		||||
    """
 | 
			
		||||
    A 3-line progress bar, which looks like::
 | 
			
		||||
    
 | 
			
		||||
    Header
 | 
			
		||||
    20% [===========----------------------------------]
 | 
			
		||||
    progress message
 | 
			
		||||
    
 | 
			
		||||
    The progress bar is colored, if the terminal supports color
 | 
			
		||||
    output; and adjusts to the width of the terminal.
 | 
			
		||||
    """
 | 
			
		||||
    BAR = '%3d%% ${GREEN}[${BOLD}%s%s${NORMAL}${GREEN}]${NORMAL}\n'
 | 
			
		||||
    HEADER = '${BOLD}${CYAN}%s${NORMAL}\n\n'
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, term, header):
 | 
			
		||||
        self.term = term
 | 
			
		||||
        if not (self.term.CLEAR_EOL and self.term.UP and self.term.BOL):
 | 
			
		||||
            raise ValueError("Terminal isn't capable enough -- you "
 | 
			
		||||
            "should use a simpler progress dispaly.")
 | 
			
		||||
        self.width = self.term.COLS or 75
 | 
			
		||||
        self.bar = term.render(self.BAR)
 | 
			
		||||
        self.header = self.term.render(self.HEADER % header.center(self.width))
 | 
			
		||||
        self.cleared = 1 #: true if we haven't drawn the bar yet.
 | 
			
		||||
        
 | 
			
		||||
    def update(self, percent, message=''):
 | 
			
		||||
        if isinstance(message, unicode):
 | 
			
		||||
            message = message.encode('utf-8', 'ignore')
 | 
			
		||||
        if self.cleared:
 | 
			
		||||
            sys.stdout.write(self.header)
 | 
			
		||||
            self.cleared = 0
 | 
			
		||||
        n = int((self.width-10)*percent)
 | 
			
		||||
        msg = message.center(self.width)
 | 
			
		||||
        sys.stdout.write(
 | 
			
		||||
        self.term.BOL + self.term.UP + self.term.CLEAR_EOL +
 | 
			
		||||
        (self.bar % (100*percent, '='*n, '-'*(self.width-10-n))) +
 | 
			
		||||
        self.term.CLEAR_EOL + msg)
 | 
			
		||||
        sys.stdout.flush()
 | 
			
		||||
    
 | 
			
		||||
    def clear(self):
 | 
			
		||||
        if not self.cleared:
 | 
			
		||||
            sys.stdout.write(self.term.BOL + self.term.CLEAR_EOL +
 | 
			
		||||
            self.term.UP + self.term.CLEAR_EOL +
 | 
			
		||||
            self.term.UP + self.term.CLEAR_EOL)
 | 
			
		||||
            self.cleared = 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LAUNCHER='''\
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
frozen_path=%s
 | 
			
		||||
export ORIGWD=`pwd`
 | 
			
		||||
export LD_LIBRARY_PATH=$frozen_path:$LD_LIBRARY_PATH
 | 
			
		||||
cd $frozen_path
 | 
			
		||||
./%s "$@"
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
def extract_tarball(tar, destdir):
 | 
			
		||||
    print 'Extracting application files...'
 | 
			
		||||
    if hasattr(tar, 'read'):
 | 
			
		||||
        try:
 | 
			
		||||
            tarfile.open(fileobj=tar, mode='r').extractall(destdir)
 | 
			
		||||
        except: # tarfile.py on Fedora 9 is buggy
 | 
			
		||||
            subprocess.check_call(['tar', 'xjf', tar.name, '-C', destdir])
 | 
			
		||||
    else:
 | 
			
		||||
        tarfile.open(tar, 'r').extractall(destdir)
 | 
			
		||||
 | 
			
		||||
def create_launchers(destdir, bindir='/usr/bin'):
 | 
			
		||||
    manifest = []
 | 
			
		||||
    for launcher in open(os.path.join(destdir, 'manifest')).readlines():
 | 
			
		||||
        if 'postinstall' in launcher:
 | 
			
		||||
            continue
 | 
			
		||||
        launcher = launcher.strip()
 | 
			
		||||
        lp = os.path.join(bindir, launcher)
 | 
			
		||||
        print 'Creating', lp
 | 
			
		||||
        open(lp, 'wb').write(LAUNCHER%(destdir, launcher))
 | 
			
		||||
        os.chmod(lp, stat.S_IXUSR|stat.S_IXOTH|stat.S_IXGRP|stat.S_IREAD|stat.S_IWRITE|stat.S_IRGRP|stat.S_IROTH)
 | 
			
		||||
        manifest.append(lp)
 | 
			
		||||
    return manifest
 | 
			
		||||
        
 | 
			
		||||
def do_postinstall(destdir):
 | 
			
		||||
    cwd = os.getcwd()
 | 
			
		||||
    t = tempfile.NamedTemporaryFile()
 | 
			
		||||
    try:
 | 
			
		||||
        os.chdir(destdir)
 | 
			
		||||
        os.environ['LD_LIBRARY_PATH'] = destdir+':'+os.environ.get('LD_LIBRARY_PATH', '')
 | 
			
		||||
        os.environ['PYTHONPATH'] = destdir
 | 
			
		||||
        os.environ['PYTHONSTARTUP'] = ''
 | 
			
		||||
        subprocess.call((os.path.join(destdir, 'calibre_postinstall'), '--save-manifest-to', t.name))
 | 
			
		||||
    finally:
 | 
			
		||||
        os.chdir(cwd)
 | 
			
		||||
    t.seek(0)
 | 
			
		||||
    return list(t.readlines())
 | 
			
		||||
 | 
			
		||||
def download_tarball():
 | 
			
		||||
    try:
 | 
			
		||||
        pb  = ProgressBar(TerminalController(sys.stdout), 'Downloading calibre...')
 | 
			
		||||
    except ValueError:
 | 
			
		||||
        print 'Downloading calibre...'
 | 
			
		||||
        pb = None
 | 
			
		||||
    local = 'calibre-test.tar.bz2'
 | 
			
		||||
    src = open(local) if os.access(local, os.R_OK) else urllib2.urlopen(MOBILEREAD+'calibre-%version-i686.tar.bz2')
 | 
			
		||||
    if hasattr(src, 'info'):
 | 
			
		||||
            size = int(src.info()['content-length'])
 | 
			
		||||
    else:
 | 
			
		||||
        src.seek(0, 2)
 | 
			
		||||
        size = src.tell()
 | 
			
		||||
        src.seek(0)
 | 
			
		||||
    f = tempfile.NamedTemporaryFile()
 | 
			
		||||
    while f.tell() < size:
 | 
			
		||||
        f.write(src.read(4*1024))
 | 
			
		||||
        percent = f.tell()/float(size)
 | 
			
		||||
        if pb is not None:
 | 
			
		||||
            pb.update(percent)
 | 
			
		||||
        else:
 | 
			
		||||
            print '%d%%, '%int(percent*100),
 | 
			
		||||
    f.seek(0)
 | 
			
		||||
    return f
 | 
			
		||||
 | 
			
		||||
def main(args=sys.argv):
 | 
			
		||||
    defdir = '/opt/calibre'
 | 
			
		||||
    destdir = raw_input('Enter the installation directory for calibre (Its contents will be deleted!)[%s]: '%defdir).strip()
 | 
			
		||||
    if not destdir:
 | 
			
		||||
        destdir = defdir
 | 
			
		||||
    if os.path.exists(destdir):
 | 
			
		||||
        shutil.rmtree(destdir)
 | 
			
		||||
    os.makedirs(destdir)
 | 
			
		||||
    
 | 
			
		||||
    f = download_tarball()
 | 
			
		||||
    
 | 
			
		||||
    print 'Extracting...'
 | 
			
		||||
    extract_tarball(f, destdir)
 | 
			
		||||
    manifest =  create_launchers(destdir)
 | 
			
		||||
    manifest += do_postinstall(destdir)
 | 
			
		||||
    
 | 
			
		||||
    manifest += ['/usr/bin/calibre-uninstall']
 | 
			
		||||
    
 | 
			
		||||
    UNINSTALLER = '''\
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
import os, sys
 | 
			
		||||
if os.geteuid() != 0:
 | 
			
		||||
    print 'You must run this uninstaller as root'
 | 
			
		||||
    sys.exit(0)
 | 
			
		||||
manifest = %s
 | 
			
		||||
failures = []
 | 
			
		||||
for path in manifest:
 | 
			
		||||
    print 'Deleting', path
 | 
			
		||||
    try:
 | 
			
		||||
        os.unlink(path)
 | 
			
		||||
    except:
 | 
			
		||||
        failures.append(path)
 | 
			
		||||
        
 | 
			
		||||
print 'Uninstalling complete.'
 | 
			
		||||
if failures:
 | 
			
		||||
    print 'Failed to remove the following files:'
 | 
			
		||||
    for f in failures: print f
 | 
			
		||||
'''%repr(manifest)
 | 
			
		||||
    
 | 
			
		||||
    open('/usr/bin/calibre-uninstall', 'wb').write(UNINSTALLER)
 | 
			
		||||
    os.chmod('/usr/bin/calibre-uninstall', 
 | 
			
		||||
             stat.S_IXUSR|stat.S_IXOTH|stat.S_IXGRP|stat.S_IREAD|stat.S_IWRITE|stat.S_IRGRP|stat.S_IROTH)
 | 
			
		||||
    
 | 
			
		||||
    print 'You can uninstall calibre by running sudo calibre-uninstall'
 | 
			
		||||
    
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    sys.exit(main())
 | 
			
		||||
@ -85,6 +85,8 @@ if not _run_once:
 | 
			
		||||
        to byte strings using `encoding`, calls abspath and then decodes back to unicode.
 | 
			
		||||
        '''
 | 
			
		||||
        to_unicode = False
 | 
			
		||||
        if encoding is None:
 | 
			
		||||
            encoding = preferred_encoding
 | 
			
		||||
        if isinstance(path, unicode):
 | 
			
		||||
            path = path.encode(encoding)
 | 
			
		||||
            to_unicode = True
 | 
			
		||||
@ -97,6 +99,8 @@ if not _run_once:
 | 
			
		||||
    _join = os.path.join
 | 
			
		||||
    def my_join(a, *p):
 | 
			
		||||
        encoding=sys.getfilesystemencoding()
 | 
			
		||||
        if not encoding:
 | 
			
		||||
            encoding = preferred_encoding
 | 
			
		||||
        p = [a] + list(p)
 | 
			
		||||
        _unicode = False
 | 
			
		||||
        for i in p:
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,6 @@ from trac.util import Markup
 | 
			
		||||
 | 
			
		||||
__appname__ = 'calibre'
 | 
			
		||||
DOWNLOAD_DIR = '/var/www/calibre.kovidgoyal.net/htdocs/downloads'
 | 
			
		||||
LINUX_INSTALLER = '/var/www/calibre.kovidgoyal.net/calibre/src/calibre/linux_installer.py'
 | 
			
		||||
MOBILEREAD = 'https://dev.mobileread.com/dist/kovid/calibre/'
 | 
			
		||||
 | 
			
		||||
class OS(dict):
 | 
			
		||||
@ -114,7 +113,7 @@ class Download(Component):
 | 
			
		||||
        if req.path_info == '/download':
 | 
			
		||||
            return self.top_level(req)
 | 
			
		||||
        elif req.path_info == '/download_linux_binary_installer':
 | 
			
		||||
            req.send(open(LINUX_INSTALLER).read().replace('%version', self.version_from_filename()), 'text/x-python')
 | 
			
		||||
            req.send(LINUX_INSTALLER.replace('%version', self.version_from_filename()), 'text/x-python')
 | 
			
		||||
        else:
 | 
			
		||||
            match = re.match(r'\/download_(\S+)', req.path_info)
 | 
			
		||||
            if match:
 | 
			
		||||
@ -240,3 +239,196 @@ If not, head over to <a href="http://calibre.kovidgoyal.net/wiki/Development#Tra
 | 
			
		||||
                    operating_systems=operating_systems, font_size='x-large', top_level=False)
 | 
			
		||||
        return 'download.html', data, None
 | 
			
		||||
                            
 | 
			
		||||
 | 
			
		||||
LINUX_INSTALLER = '''
 | 
			
		||||
import sys, os, shutil, tarfile, subprocess, tempfile, urllib2, re, stat
 | 
			
		||||
 | 
			
		||||
MOBILEREAD='https://dev.mobileread.com/dist/kovid/calibre/'
 | 
			
		||||
 | 
			
		||||
class TerminalController:
 | 
			
		||||
    BOL = ''             #: Move the cursor to the beginning of the line
 | 
			
		||||
    UP = ''              #: Move the cursor up one line
 | 
			
		||||
    DOWN = ''            #: Move the cursor down one line
 | 
			
		||||
    LEFT = ''            #: Move the cursor left one char
 | 
			
		||||
    RIGHT = ''           #: Move the cursor right one char
 | 
			
		||||
    
 | 
			
		||||
    # Deletion:
 | 
			
		||||
    CLEAR_SCREEN = ''    #: Clear the screen and move to home position
 | 
			
		||||
    CLEAR_EOL = ''       #: Clear to the end of the line.
 | 
			
		||||
    CLEAR_BOL = ''       #: Clear to the beginning of the line.
 | 
			
		||||
    CLEAR_EOS = ''       #: Clear to the end of the screen
 | 
			
		||||
    
 | 
			
		||||
    # Output modes:
 | 
			
		||||
    BOLD = ''            #: Turn on bold mode
 | 
			
		||||
    BLINK = ''           #: Turn on blink mode
 | 
			
		||||
    DIM = ''             #: Turn on half-bright mode
 | 
			
		||||
    REVERSE = ''         #: Turn on reverse-video mode
 | 
			
		||||
    NORMAL = ''          #: Turn off all modes
 | 
			
		||||
    
 | 
			
		||||
    # Cursor display:
 | 
			
		||||
    HIDE_CURSOR = ''     #: Make the cursor invisible
 | 
			
		||||
    SHOW_CURSOR = ''     #: Make the cursor visible
 | 
			
		||||
    
 | 
			
		||||
    # Terminal size:
 | 
			
		||||
    COLS = None          #: Width of the terminal (None for unknown)
 | 
			
		||||
    LINES = None         #: Height of the terminal (None for unknown)
 | 
			
		||||
    
 | 
			
		||||
    # Foreground colors:
 | 
			
		||||
    BLACK = BLUE = GREEN = CYAN = RED = MAGENTA = YELLOW = WHITE = ''
 | 
			
		||||
    
 | 
			
		||||
    # Background colors:
 | 
			
		||||
    BG_BLACK = BG_BLUE = BG_GREEN = BG_CYAN = ''
 | 
			
		||||
    BG_RED = BG_MAGENTA = BG_YELLOW = BG_WHITE = ''
 | 
			
		||||
    
 | 
			
		||||
    _STRING_CAPABILITIES = """
 | 
			
		||||
    BOL=cr UP=cuu1 DOWN=cud1 LEFT=cub1 RIGHT=cuf1
 | 
			
		||||
    CLEAR_SCREEN=clear CLEAR_EOL=el CLEAR_BOL=el1 CLEAR_EOS=ed BOLD=bold
 | 
			
		||||
    BLINK=blink DIM=dim REVERSE=rev UNDERLINE=smul NORMAL=sgr0
 | 
			
		||||
    HIDE_CURSOR=cinvis SHOW_CURSOR=cnorm""".split()
 | 
			
		||||
    _COLORS = """BLACK BLUE GREEN CYAN RED MAGENTA YELLOW WHITE""".split()
 | 
			
		||||
    _ANSICOLORS = "BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE".split()
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, term_stream=sys.stdout):
 | 
			
		||||
        # Curses isn't available on all platforms
 | 
			
		||||
        try: import curses
 | 
			
		||||
        except: return
 | 
			
		||||
        
 | 
			
		||||
        # If the stream isn't a tty, then assume it has no capabilities.
 | 
			
		||||
        if not hasattr(term_stream, 'isatty') or not term_stream.isatty(): return
 | 
			
		||||
        
 | 
			
		||||
        # Check the terminal type.  If we fail, then assume that the
 | 
			
		||||
        # terminal has no capabilities.
 | 
			
		||||
        try: curses.setupterm()
 | 
			
		||||
        except: return
 | 
			
		||||
        
 | 
			
		||||
        # Look up numeric capabilities.
 | 
			
		||||
        self.COLS = curses.tigetnum('cols')
 | 
			
		||||
        self.LINES = curses.tigetnum('lines')
 | 
			
		||||
        
 | 
			
		||||
        # Look up string capabilities.
 | 
			
		||||
        for capability in self._STRING_CAPABILITIES:
 | 
			
		||||
            (attrib, cap_name) = capability.split('=')
 | 
			
		||||
            setattr(self, attrib, self._tigetstr(cap_name) or '')
 | 
			
		||||
        
 | 
			
		||||
        # Colors
 | 
			
		||||
        set_fg = self._tigetstr('setf')
 | 
			
		||||
        if set_fg:
 | 
			
		||||
            for i,color in zip(range(len(self._COLORS)), self._COLORS):
 | 
			
		||||
                setattr(self, color, curses.tparm(set_fg, i) or '')
 | 
			
		||||
        set_fg_ansi = self._tigetstr('setaf')
 | 
			
		||||
        if set_fg_ansi:
 | 
			
		||||
            for i,color in zip(range(len(self._ANSICOLORS)), self._ANSICOLORS):
 | 
			
		||||
                setattr(self, color, curses.tparm(set_fg_ansi, i) or '')
 | 
			
		||||
        set_bg = self._tigetstr('setb')
 | 
			
		||||
        if set_bg:
 | 
			
		||||
            for i,color in zip(range(len(self._COLORS)), self._COLORS):
 | 
			
		||||
                setattr(self, 'BG_'+color, curses.tparm(set_bg, i) or '')
 | 
			
		||||
        set_bg_ansi = self._tigetstr('setab')
 | 
			
		||||
        if set_bg_ansi:
 | 
			
		||||
            for i,color in zip(range(len(self._ANSICOLORS)), self._ANSICOLORS):
 | 
			
		||||
                setattr(self, 'BG_'+color, curses.tparm(set_bg_ansi, i) or '')
 | 
			
		||||
    
 | 
			
		||||
    def _tigetstr(self, cap_name):
 | 
			
		||||
        # String capabilities can include "delays" of the form "$<2>".
 | 
			
		||||
        # For any modern terminal, we should be able to just ignore
 | 
			
		||||
        # these, so strip them out.
 | 
			
		||||
        import curses
 | 
			
		||||
        cap = curses.tigetstr(cap_name) or ''
 | 
			
		||||
        return re.sub(r'\$<\d+>[/*]?', '', cap)
 | 
			
		||||
    
 | 
			
		||||
    def render(self, template):
 | 
			
		||||
        return re.sub(r'\$\$|\${\w+}', self._render_sub, template)
 | 
			
		||||
    
 | 
			
		||||
    def _render_sub(self, match):
 | 
			
		||||
        s = match.group()
 | 
			
		||||
        if s == '$$': return s
 | 
			
		||||
        else: return getattr(self, s[2:-1])
 | 
			
		||||
 | 
			
		||||
class ProgressBar:
 | 
			
		||||
    BAR = '%3d%% ${GREEN}[${BOLD}%s%s${NORMAL}${GREEN}]${NORMAL}\n'
 | 
			
		||||
    HEADER = '${BOLD}${CYAN}%s${NORMAL}\n\n'
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, term, header):
 | 
			
		||||
        self.term = term
 | 
			
		||||
        if not (self.term.CLEAR_EOL and self.term.UP and self.term.BOL):
 | 
			
		||||
            raise ValueError("Terminal isn't capable enough -- you "
 | 
			
		||||
            "should use a simpler progress dispaly.")
 | 
			
		||||
        self.width = self.term.COLS or 75
 | 
			
		||||
        self.bar = term.render(self.BAR)
 | 
			
		||||
        self.header = self.term.render(self.HEADER % header.center(self.width))
 | 
			
		||||
        self.cleared = 1 #: true if we haven't drawn the bar yet.
 | 
			
		||||
        
 | 
			
		||||
    def update(self, percent, message=''):
 | 
			
		||||
        if isinstance(message, unicode):
 | 
			
		||||
            message = message.encode('utf-8', 'ignore')
 | 
			
		||||
        if self.cleared:
 | 
			
		||||
            sys.stdout.write(self.header)
 | 
			
		||||
            self.cleared = 0
 | 
			
		||||
        n = int((self.width-10)*percent)
 | 
			
		||||
        msg = message.center(self.width)
 | 
			
		||||
        sys.stdout.write(
 | 
			
		||||
        self.term.BOL + self.term.UP + self.term.CLEAR_EOL +
 | 
			
		||||
        (self.bar % (100*percent, '='*n, '-'*(self.width-10-n))) +
 | 
			
		||||
        self.term.CLEAR_EOL + msg)
 | 
			
		||||
        sys.stdout.flush()
 | 
			
		||||
    
 | 
			
		||||
    def clear(self):
 | 
			
		||||
        if not self.cleared:
 | 
			
		||||
            sys.stdout.write(self.term.BOL + self.term.CLEAR_EOL +
 | 
			
		||||
            self.term.UP + self.term.CLEAR_EOL +
 | 
			
		||||
            self.term.UP + self.term.CLEAR_EOL)
 | 
			
		||||
            self.cleared = 1
 | 
			
		||||
 | 
			
		||||
def download_tarball():
 | 
			
		||||
    try:
 | 
			
		||||
        pb  = ProgressBar(TerminalController(sys.stdout), 'Downloading calibre...')
 | 
			
		||||
    except ValueError:
 | 
			
		||||
        print 'Downloading calibre...'
 | 
			
		||||
        pb = None
 | 
			
		||||
    local = 'calibre-test.tar.bz2'
 | 
			
		||||
    src = open(local) if os.access(local, os.R_OK) else urllib2.urlopen(MOBILEREAD+'calibre-%version-i686.tar.bz2')
 | 
			
		||||
    if hasattr(src, 'info'):
 | 
			
		||||
            size = int(src.info()['content-length'])
 | 
			
		||||
    else:
 | 
			
		||||
        src.seek(0, 2)
 | 
			
		||||
        size = src.tell()
 | 
			
		||||
        src.seek(0)
 | 
			
		||||
    f = tempfile.NamedTemporaryFile()
 | 
			
		||||
    while f.tell() < size:
 | 
			
		||||
        f.write(src.read(4*1024))
 | 
			
		||||
        percent = f.tell()/float(size)
 | 
			
		||||
        if pb is not None:
 | 
			
		||||
            pb.update(percent)
 | 
			
		||||
        else:
 | 
			
		||||
            print '%d%%, '%int(percent*100),
 | 
			
		||||
    f.seek(0)
 | 
			
		||||
    return f
 | 
			
		||||
 | 
			
		||||
def extract_tarball(tar, destdir):
 | 
			
		||||
    print 'Extracting application files...'
 | 
			
		||||
    if hasattr(tar, 'read'):
 | 
			
		||||
        try:
 | 
			
		||||
            tarfile.open(fileobj=tar, mode='r').extractall(destdir)
 | 
			
		||||
        except: # tarfile.py on Fedora 9 is buggy
 | 
			
		||||
            subprocess.check_call(['tar', 'xjf', tar.name, '-C', destdir])
 | 
			
		||||
    else:
 | 
			
		||||
        tarfile.open(tar, 'r').extractall(destdir)
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    defdir = '/opt/calibre'
 | 
			
		||||
    destdir = raw_input('Enter the installation directory for calibre (Its contents will be deleted!)[%s]: '%defdir).strip()
 | 
			
		||||
    if not destdir:
 | 
			
		||||
        destdir = defdir
 | 
			
		||||
    destdir = os.path.abspath(destdir)
 | 
			
		||||
    if os.path.exists(destdir):
 | 
			
		||||
        shutil.rmtree(destdir)
 | 
			
		||||
    os.makedirs(destdir)
 | 
			
		||||
    
 | 
			
		||||
    f = download_tarball()
 | 
			
		||||
    
 | 
			
		||||
    print 'Extracting files to %s ...'%destdir
 | 
			
		||||
    extract_tarball(f, destdir)
 | 
			
		||||
    pi = os.path.join(destdir, calibre_postinstall)
 | 
			
		||||
    subprocess.call('pi', shell=True)
 | 
			
		||||
    return 0
 | 
			
		||||
'''
 | 
			
		||||
@ -37,7 +37,7 @@
 | 
			
		||||
      <h2>Note</h2>
 | 
			
		||||
      <div class="note">
 | 
			
		||||
      <ul>
 | 
			
		||||
      <li>This installer is very new and has only been tested ona  couple of systems, so if you encounter
 | 
			
		||||
      <li>This installer is very new and has only been tested on a couple of systems, so if you encounter
 | 
			
		||||
      problems, please report them.</li>
 | 
			
		||||
      <li>You shoud have help2man and xdg-utils installed on your system.</li>
 | 
			
		||||
      </ul>
 | 
			
		||||
 | 
			
		||||
@ -6,14 +6,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre 0.4.51\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-05-24 06:23+0000\n"
 | 
			
		||||
"Last-Translator: Kovid Goyal <Unknown>\n"
 | 
			
		||||
"Language-Team: bg\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:41+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
"Generated-By: pygettext.py 1.5\n"
 | 
			
		||||
 | 
			
		||||
@ -1546,49 +1546,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1612,7 +1612,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -1993,22 +1993,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2503,8 +2503,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2700,7 +2700,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2904,25 +2904,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2934,7 +2934,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3088,11 +3088,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4134,39 +4134,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4521,13 +4523,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -10,14 +10,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: ca\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-05-24 06:21+0000\n"
 | 
			
		||||
"Last-Translator: Kovid Goyal <Unknown>\n"
 | 
			
		||||
"Language-Team: \n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:41+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1592,49 +1592,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Ubicació de la base de dades no vàlida"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr "<br>Cal que siga un directori."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Ubicació de la base de dades no vàlida "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Ubicació de la base de dades no vàlida.<br>No es pot escriure "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1658,7 +1658,7 @@ msgstr "Cerca la nova ubicació de la base de dades"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2039,22 +2039,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr "Coberta"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr "Canvia la imatge de la &coberta:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr "Cerca una imatge per a utilitzar com a coberta d'aquest llibre."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2563,8 +2563,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2763,7 +2763,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2967,25 +2967,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2997,7 +2997,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3151,11 +3151,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4203,43 +4203,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr "Biblioteca"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"El Sony Reader\n"
 | 
			
		||||
"%s està disponible"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"La targeta\n"
 | 
			
		||||
"%s està disponible"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4594,13 +4592,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4912,6 +4910,20 @@ msgstr ""
 | 
			
		||||
#~ msgid "<b>Changes will only take affect after a restart."
 | 
			
		||||
#~ msgstr "<b>Els canvis s'ignoren fins que el re-inicieu."
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "El Sony Reader\n"
 | 
			
		||||
#~ "%s està disponible"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Card\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "La targeta\n"
 | 
			
		||||
#~ "%s està disponible"
 | 
			
		||||
 | 
			
		||||
#~ msgid "%s is not available in LRF format. Please convert it first."
 | 
			
		||||
#~ msgstr "%s no està disponible en LRF. Ha de ser convertir primer."
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-10-23 12:18+0000\n"
 | 
			
		||||
"Last-Translator: raduz <raduzator@gmail.com>\n"
 | 
			
		||||
"Language-Team: Czech <cs@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:49+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1627,49 +1627,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1693,7 +1693,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2074,22 +2074,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2584,8 +2584,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2781,7 +2781,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2985,25 +2985,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3015,7 +3015,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3169,11 +3169,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4215,39 +4215,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4602,13 +4604,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: de\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-06 14:13+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-09 09:15+0000\n"
 | 
			
		||||
"Last-Translator: S. Dorscht <Unknown>\n"
 | 
			
		||||
"Language-Team: de\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
"Generated-By: pygettext.py 1.5\n"
 | 
			
		||||
 | 
			
		||||
@ -1868,50 +1868,50 @@ msgstr ""
 | 
			
		||||
"Content\n"
 | 
			
		||||
"Server"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr "Fehler Log:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr "Zugriffs-Protokolldatei:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr "Content Server konnte nicht gestartet werden"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr "Ungültige Größe"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Die Größe %s ist ungültig. Sie muss der Form BreitexHöhe entsprechen."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Ortsangabe der Datenbank ungültig"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr "<br>Muss ein Verzeichnis sein."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Ortsangabe der Datenbank ungültig "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Ortsangabe der Datenbank ungültig.<br>Speichern nicht möglich "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr "Komprimiere Datenbank. Das kann etwas dauern..."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr "Komprimiere Datenbank..."
 | 
			
		||||
 | 
			
		||||
@ -1938,7 +1938,7 @@ msgstr "Zu einem neuen Ort der Datenbank wechseln"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2349,22 +2349,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr "Umschlagbild"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Um&schlagbild der Quelldatei verwenden"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr "&Umschlagbild ändern:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr "Nach Umschlagbild durchsuchen..."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Um&schlagbild der Quelldatei verwenden"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2904,8 +2904,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
@ -2915,8 +2915,8 @@ msgstr ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
msgid "Edit Meta information"
 | 
			
		||||
@ -3121,7 +3121,7 @@ msgid "News"
 | 
			
		||||
msgstr "Nachrichten"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr "Rezepte"
 | 
			
		||||
 | 
			
		||||
@ -3342,25 +3342,25 @@ msgstr "Dieser Feed wurde schon zu diesem Rezept hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr "Ungültige Eingabe"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr "<p>Konnte Rezept nicht erstellen. Fehler:<br>%s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr "Rezept ersetzen?"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Es gibt schon ein erstelltes Rezept mit dem Namen %s. Soll es ersetzt werden?"
 | 
			
		||||
@ -3373,7 +3373,7 @@ msgstr "Rezept wählen"
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr "Rezept zum Anpassen auswählen"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr "Eine Rezept Datei auswählen"
 | 
			
		||||
 | 
			
		||||
@ -3563,11 +3563,11 @@ msgstr "Regulärer Ausdruck (?P<title>)"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr "Kein Treffer"
 | 
			
		||||
 | 
			
		||||
@ -4680,44 +4680,48 @@ msgstr "Verweismodus"
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr "Lesezeichen"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr "Ungültiger regulärer Ausdruck"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr "Ungültiger regulärer Ausdruck: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr "Bibliothek"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s verfügbar"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"verfügbar"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Karte\n"
 | 
			
		||||
"%s verfügbar"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"verfügbar"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr "Ein Klick zeigt die Liste der auf dem Computer vorhandenen Bücher"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Ein Klick zeigt die Liste der im Hauptspeicher des Geräts vorhandenen Bücher"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Ein Klick zeigt die Liste der auf der Speicherkarte des Geräts vorhandenen "
 | 
			
		||||
@ -5170,13 +5174,13 @@ msgstr "Konnte SSH Sitzung nicht abschließen: "
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr "Authentifizierung schlug fehl am Server: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr "Feed unbekannt"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr "Artikel ohne Titel"
 | 
			
		||||
 | 
			
		||||
@ -5634,6 +5638,20 @@ msgstr "Zeige detailierte Ausgabeinformation. Hilfreich zur Fehlersuche."
 | 
			
		||||
#~ msgid "Custom news sources"
 | 
			
		||||
#~ msgstr "Individuelle Nachrichtenquellen"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s verfügbar"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Card\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Karte\n"
 | 
			
		||||
#~ "%s verfügbar"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Job killed by user"
 | 
			
		||||
#~ msgstr "Auftrag durch Benutzer abgebrochen"
 | 
			
		||||
 | 
			
		||||
@ -5650,6 +5668,29 @@ msgstr "Zeige detailierte Ausgabeinformation. Hilfreich zur Fehlersuche."
 | 
			
		||||
#~ msgid " does not allow copying of text."
 | 
			
		||||
#~ msgstr " lässt das Kopieren von Text nicht zu."
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Path to the calibre database. Default is to use the path stored in the "
 | 
			
		||||
#~ "settings."
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-06-24 07:23+0000\n"
 | 
			
		||||
"Last-Translator: Thanos Petkakis <thanospet@gmail.com>\n"
 | 
			
		||||
"Language-Team: Greek <el@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:41+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1546,49 +1546,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1612,7 +1612,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -1993,22 +1993,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2503,8 +2503,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2700,7 +2700,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2904,25 +2904,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2934,7 +2934,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3088,11 +3088,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4134,39 +4134,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4521,13 +4523,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -10,14 +10,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: es\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-11-15 16:21+0000\n"
 | 
			
		||||
"Last-Translator: Pablo Carmona A. <Unknown>\n"
 | 
			
		||||
"Language-Team: Spanish\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:41+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1730,49 +1730,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Ubicación no válida"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr "<br>Debe ser un directorio."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Ubicación no válida "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Ubicación no válida.<br>Imposible escribir en "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr "Compactando base de datos. Esto podría durar un rato"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr "Compactando..."
 | 
			
		||||
 | 
			
		||||
@ -1798,7 +1798,7 @@ msgstr "Navegar a la nueva ubicación de la base de datos"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2181,22 +2181,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr "Portada"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Usar portada del archivo &fuente"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr "Cambia la imagen de &portada:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr "Localizar una imagen a utilizar como portada de este libro."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Usar portada del archivo &fuente"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2708,19 +2708,9 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
"type=\"text/css\">\n"
 | 
			
		||||
"p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
msgid "Edit Meta information"
 | 
			
		||||
@ -2923,7 +2913,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr "Recetas"
 | 
			
		||||
 | 
			
		||||
@ -3136,25 +3126,25 @@ msgstr "Este Feed ya se ha añadido a la receta"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr "Entrada incorrecta"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr "<p>No se puede crear la receta. Error:<br>%s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr "Reemplazar la receta?"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr "una receta personalizada llamada %s ya existe. Quiere reemplazarla?"
 | 
			
		||||
 | 
			
		||||
@ -3166,7 +3156,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr "Seleccionar un archivo de receta"
 | 
			
		||||
 | 
			
		||||
@ -3333,11 +3323,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr "Ninguna coincidencia"
 | 
			
		||||
 | 
			
		||||
@ -4428,43 +4418,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr "Expresión regular no válida"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr "Expresión regular no valida: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr "Biblioteca"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Sony Reader\n"
 | 
			
		||||
"%s disponible"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Tarjeta\n"
 | 
			
		||||
"%s disponible"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr "Haga click para ver la lista de libros disponibles en su ordenador"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr "Haga click para ver la lista de libros disponibles en su lector"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Haga click para ver la lista de libros en la tarjeta de almacenamiento de su "
 | 
			
		||||
@ -4855,13 +4843,13 @@ msgstr "No se ha podido negociar período de sesiones SSH: "
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr "No se ha podido autenticar con el servidor: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr "Newsfeed desconocido"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr "Artículo sin título"
 | 
			
		||||
 | 
			
		||||
@ -5327,6 +5315,20 @@ msgstr "Mostrar información de salida detallada. Útil para depuración"
 | 
			
		||||
#~ msgid "Custom news sources"
 | 
			
		||||
#~ msgstr "Nueva fuente de noticias personalizada"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Sony Reader\n"
 | 
			
		||||
#~ "%s disponible"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Card\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Tarjeta\n"
 | 
			
		||||
#~ "%s disponible"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Job killed by user"
 | 
			
		||||
#~ msgstr "Trabajo detenido por el usuario"
 | 
			
		||||
 | 
			
		||||
@ -5410,6 +5412,29 @@ msgstr "Mostrar información de salida detallada. Útil para depuración"
 | 
			
		||||
#~ msgid " does not allow copying of text."
 | 
			
		||||
#~ msgstr " no permite copiar texto."
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Path to the calibre database. Default is to use the path stored in the "
 | 
			
		||||
#~ "settings."
 | 
			
		||||
 | 
			
		||||
@ -6,14 +6,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre 0.4.22\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-08-28 13:18+0000\n"
 | 
			
		||||
"Last-Translator: Anthony Guéchoum <Unknown>\n"
 | 
			
		||||
"Language-Team: fr\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:41+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
"Generated-By: pygettext.py 1.5\n"
 | 
			
		||||
 | 
			
		||||
@ -1690,49 +1690,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Chemin de la database invalide"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr "<br>Doit être un répertoire."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Chemin de la database invalide "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Chemin de la database invalide.<br>Erreur en écriture "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1756,7 +1756,7 @@ msgstr "Choisir un nouvel emplacement pour la base de données"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2140,22 +2140,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr "Couverture du livre"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Utilise l'image de couverture du fichier &source"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr "Modifie l'image &cover :"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr "Rechercher une image à utiliser en tant que couverture du livre."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Utilise l'image de couverture du fichier &source"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2671,8 +2671,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2876,7 +2876,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3083,25 +3083,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3113,7 +3113,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3267,11 +3267,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4330,43 +4330,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr "Librairie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Lecteur \n"
 | 
			
		||||
"%s disponible"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Carte\n"
 | 
			
		||||
"%s disponible"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4721,13 +4719,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -5061,6 +5059,20 @@ msgstr ""
 | 
			
		||||
#~ "<b>Les modifications ne seront prises en compte qu'après avoir relancé le "
 | 
			
		||||
#~ "programme."
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Lecteur \n"
 | 
			
		||||
#~ "%s disponible"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Card\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Carte\n"
 | 
			
		||||
#~ "%s disponible"
 | 
			
		||||
 | 
			
		||||
#~ msgid "%s is not available in LRF format. Please convert it first."
 | 
			
		||||
#~ msgstr "%s n'est pas disponible au format LRF. Veuillez le convertir avant."
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-09-30 12:33+0000\n"
 | 
			
		||||
"Last-Translator: Calidonia <Unknown>\n"
 | 
			
		||||
"Language-Team: Galician <gl@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:41+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1551,49 +1551,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1617,7 +1617,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -1998,22 +1998,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2508,8 +2508,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2705,7 +2705,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2909,25 +2909,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2939,7 +2939,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3093,11 +3093,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4139,39 +4139,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4526,13 +4528,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,14 +8,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre_calibre-it\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-05 09:30+0000\n"
 | 
			
		||||
"Last-Translator: Iacopo Benesperi <Unknown>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-08 21:59+0000\n"
 | 
			
		||||
"Last-Translator: S. Dorscht <Unknown>\n"
 | 
			
		||||
"Language-Team: italiano\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
"Generated-By: pygettext.py 1.5\n"
 | 
			
		||||
 | 
			
		||||
@ -1845,49 +1845,49 @@ msgstr ""
 | 
			
		||||
"Server dei\n"
 | 
			
		||||
"contenuti"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr "File di log degli errori:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr "File di log degli accessi:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr "Avvio del server dei contenuti fallito"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Percorso database non valido"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr "<br>Deve essere una cartella"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Percorso database non valido "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Percorso database non valido.<br>Impossibile scrivere su "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr "Compattazione database. Poterbbe richiedere un po' di tempo"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr "Compattazione..."
 | 
			
		||||
 | 
			
		||||
@ -1913,7 +1913,7 @@ msgstr "Sfoglia per specificare una nuova posizione del database"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2320,23 +2320,23 @@ msgid "Book Cover"
 | 
			
		||||
msgstr "Copertina del libro"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Usa copertina del file di &origine"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr "Ca&mbia l'immagine di copertina:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Sfoglia per trovare un'immagine da usare come copertina per questo libro"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Usa copertina del file di &origine"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2871,8 +2871,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
@ -2882,8 +2882,8 @@ msgstr ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
msgid "Edit Meta information"
 | 
			
		||||
@ -3086,7 +3086,7 @@ msgid "News"
 | 
			
		||||
msgstr "Notizie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr "Formule"
 | 
			
		||||
 | 
			
		||||
@ -3303,25 +3303,25 @@ msgstr "Questo feed è già stato aggiunto alla formula"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr "Input non valido"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr "<p>Impossibile creare la formula. Errore:<br>%s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr "Sovrascrivere la formula?"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr "Esiste già una formula personalizzata di nome %s. Sovrascriverla?"
 | 
			
		||||
 | 
			
		||||
@ -3333,7 +3333,7 @@ msgstr "Prendi formula"
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr "Prende la formula per personalizzarla"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr "Scegliere un file di formula"
 | 
			
		||||
 | 
			
		||||
@ -3521,11 +3521,11 @@ msgstr "Espressione regolare (?P<title>)"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr "Nessuna corrispondenza"
 | 
			
		||||
 | 
			
		||||
@ -4635,46 +4635,44 @@ msgstr "Modalità riferimento"
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr "Segnalibro"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr "Espressione regolare non valida"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr "Espressione regolare non valida: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr "Biblioteca"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Lettore\n"
 | 
			
		||||
"%s disponibili"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Scheda\n"
 | 
			
		||||
"%s disponibili"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Fare clic per vedere la lista di libri disponibili sul proprio computer"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Fare clic per vedere la lista di libri nella memoria principale del proprio "
 | 
			
		||||
"lettore"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Fare clic per vedere la lista di libri nella scheda di memoria del proprio "
 | 
			
		||||
@ -5119,13 +5117,13 @@ msgstr "Negoziazione della sessione SSH fallita: "
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr "Autenticazione fallita col server: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr "Feed sconosciuto"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr "Articolo senza titolo"
 | 
			
		||||
 | 
			
		||||
@ -5519,6 +5517,43 @@ msgstr "Mostra un output dettagliato. Utile per il debugging"
 | 
			
		||||
#~ msgid "Custom news sources"
 | 
			
		||||
#~ msgstr "Fonti di notizie personalizzate"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Lettore\n"
 | 
			
		||||
#~ "%s disponibili"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Card\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Scheda\n"
 | 
			
		||||
#~ "%s disponibili"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "The fields to display when listing books in the database. Should be a comma "
 | 
			
		||||
#~ "separated list of fields.\n"
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-05 23:40+0000\n"
 | 
			
		||||
"Last-Translator: Helene Klungvik <Unknown>\n"
 | 
			
		||||
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1709,49 +1709,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1775,7 +1775,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2156,22 +2156,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2666,8 +2666,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2863,7 +2863,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3067,25 +3067,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3097,7 +3097,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3251,11 +3251,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4297,39 +4297,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4684,13 +4686,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: de\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-06 14:15+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-09 09:16+0000\n"
 | 
			
		||||
"Last-Translator: S. Dorscht <Unknown>\n"
 | 
			
		||||
"Language-Team: de\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
"Generated-By: pygettext.py 1.5\n"
 | 
			
		||||
 | 
			
		||||
@ -1868,50 +1868,50 @@ msgstr ""
 | 
			
		||||
"Content\n"
 | 
			
		||||
"Server"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr "Fehler-Protokolldatei:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr "Zugriffs-Protokolldatei:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr "Content Server konnte nicht gestartet werden"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr "Ungültige Größe"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Die Größe %s ist ungültig. Sie muss der Form BreitexHöhe entsprechen."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Ortsangabe der Datenbank ungültig"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr "<br>Muss ein Verzeichnis sein."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Ortsangabe der Datenbank ungültig "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Ortsangabe der Datenbank ungültig.<br>Speichern nicht möglich "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr "Komprimiere Datenbank. Das kann etwas dauern..."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr "Komprimiere Datenbank..."
 | 
			
		||||
 | 
			
		||||
@ -1938,7 +1938,7 @@ msgstr "Zu einem neuen Ort der Datenbank wechseln"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2349,22 +2349,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr "Umschlagbild"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Um&schlagbild der Quelldatei verwenden"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr "&Umschlagbild ändern:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr "Nach Umschlagbild durchsuchen..."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Um&schlagbild der Quelldatei verwenden"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2904,8 +2904,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
@ -2915,8 +2915,8 @@ msgstr ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
msgid "Edit Meta information"
 | 
			
		||||
@ -3121,7 +3121,7 @@ msgid "News"
 | 
			
		||||
msgstr "Nachrichten"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr "Rezepte"
 | 
			
		||||
 | 
			
		||||
@ -3342,25 +3342,25 @@ msgstr "Dieser Feed wurde schon zu diesem Rezept hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr "Ungültige Eingabe"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr "<p>Konnte Rezept nicht erstellen. Fehler:<br>%s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr "Rezept ersetzen?"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Es gibt schon ein erstelltes Rezept mit dem Namen %s. Soll es ersetzt werden?"
 | 
			
		||||
@ -3373,7 +3373,7 @@ msgstr "Rezept wählen"
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr "Rezept zum Anpassen auswählen"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr "Eine Rezept Datei auswählen"
 | 
			
		||||
 | 
			
		||||
@ -3563,11 +3563,11 @@ msgstr "Regulärer Ausdruck (?P<title>)"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr "Kein Treffer"
 | 
			
		||||
 | 
			
		||||
@ -4680,44 +4680,48 @@ msgstr "Verweismodus"
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr "Lesezeichen"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr "Ungültiger regulärer Ausdruck"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr "Ungültiger regulärer Ausdruck: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr "Bibliothek"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s verfügbar"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"verfügbar"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Karte\n"
 | 
			
		||||
"%s verfügbar"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"verfügbar"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr "Ein Klick zeigt die Liste der auf dem Computer vorhandenen Bücher"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Ein Klick zeigt die Liste der im Hauptspeicher des Geräts vorhandenen Bücher"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Ein Klick zeigt die Liste der auf der Speicherkarte des Geräts vorhandenen "
 | 
			
		||||
@ -5170,13 +5174,13 @@ msgstr "Konnte SSH Sitzung nicht abschließen: "
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr "Authentifizierung schlug fehl am Server: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr "Feed unbekannt"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr "Artikel ohne Titel"
 | 
			
		||||
 | 
			
		||||
@ -5634,6 +5638,20 @@ msgstr "Zeige detailierte Ausgabeinformation. Hilfreich zur Fehlersuche."
 | 
			
		||||
#~ msgid "Custom news sources"
 | 
			
		||||
#~ msgstr "Individuelle Nachrichtenquellen"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s verfügbar"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Card\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Karte\n"
 | 
			
		||||
#~ "%s verfügbar"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Job killed by user"
 | 
			
		||||
#~ msgstr "Auftrag durch Benutzer abgebrochen"
 | 
			
		||||
 | 
			
		||||
@ -5650,6 +5668,29 @@ msgstr "Zeige detailierte Ausgabeinformation. Hilfreich zur Fehlersuche."
 | 
			
		||||
#~ msgid " does not allow copying of text."
 | 
			
		||||
#~ msgstr " lässt das Kopieren von Text nicht zu."
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Path to the calibre database. Default is to use the path stored in the "
 | 
			
		||||
#~ "settings."
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-09-04 01:49+0000\n"
 | 
			
		||||
"Last-Translator: Marc van den Dikkenberg <Unknown>\n"
 | 
			
		||||
"Language-Team: Dutch <nl@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:49+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1732,49 +1732,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Foutieve database locatie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr "<br>Moet een folder zijn."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Foutieve database locatie "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Foutieve database locatie.<br>Kan niet schrijven naar "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr "Database aan het comprimeren. Dit kan even duren."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr "Comprimeren..."
 | 
			
		||||
 | 
			
		||||
@ -1800,7 +1800,7 @@ msgstr "Blader naar de nieuwe database locatie"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2184,22 +2184,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr "Boek Omslag"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Gebruik omslag van &bron bestand"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr "Verander &Omslag Afbeelding"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr "Zoek een afbeelding om als omslag voor dit boek te gebruiken."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Gebruik omslag van &bron bestand"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2718,19 +2718,9 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
"type=\"text/css\">\n"
 | 
			
		||||
"p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
msgid "Edit Meta information"
 | 
			
		||||
@ -2933,7 +2923,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr "Recepten"
 | 
			
		||||
 | 
			
		||||
@ -3146,25 +3136,25 @@ msgstr "Deze feed is al aan een recept toegevoegd"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr "Ongeldige invoer"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr "<p>Een recept kon niet worden aangemaakt. Foutmelding:<br>%s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr "Recept vervangen?"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr "Een persoonlijk recept genaat %s bestaat al. Wilt u deze vervangen?"
 | 
			
		||||
 | 
			
		||||
@ -3176,7 +3166,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr "Kies een recept"
 | 
			
		||||
 | 
			
		||||
@ -3344,11 +3334,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr "Geen overeenkomst"
 | 
			
		||||
 | 
			
		||||
@ -4441,44 +4431,42 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr "Ongeldige reguliere expressie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr "Ongeldige reguliere expressie: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr "Bibliotheek"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Lezer\n"
 | 
			
		||||
"%s beschikbaar"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Kaart\n"
 | 
			
		||||
"%s beschikbaar"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr "Klik om een de lijst met boeken op uw computer te zien"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Klik om de lijst met boeken in het hoofdgeheugen van uw lezer te zien"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr "Klik om de lijst met boeken op de opslag kaart van uw lezer te zien"
 | 
			
		||||
 | 
			
		||||
@ -4902,13 +4890,13 @@ msgstr "SSH sessie kon niet tot stand worden gebracht: "
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr "Authenticatie met server mislukt: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr "Onbekende feed"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr "Artikel zonder naam"
 | 
			
		||||
 | 
			
		||||
@ -5358,6 +5346,20 @@ msgstr ""
 | 
			
		||||
#~ msgid "Custom news sources"
 | 
			
		||||
#~ msgstr "Persoonlijke nieuws bronnen"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Lezer\n"
 | 
			
		||||
#~ "%s beschikbaar"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Card\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Kaart\n"
 | 
			
		||||
#~ "%s beschikbaar"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Job killed by user"
 | 
			
		||||
#~ msgstr "Opdracht beëindigd door gebruiker"
 | 
			
		||||
 | 
			
		||||
@ -5374,6 +5376,29 @@ msgstr ""
 | 
			
		||||
#~ msgid " does not allow copying of text."
 | 
			
		||||
#~ msgstr " staat copieren van tekst niet toe."
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
#~ "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
#~ "type=\"text/css\">\n"
 | 
			
		||||
#~ "p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
#~ "</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
#~ "font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
#~ "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
#~ "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
#~ "family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Path to the calibre database. Default is to use the path stored in the "
 | 
			
		||||
#~ "settings."
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-07 20:51+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-10 13:38+0000\n"
 | 
			
		||||
"Last-Translator: Bartosz Kaszubowski <gosimek@gmail.com>\n"
 | 
			
		||||
"Language-Team: Polish <pl@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:49+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -402,7 +402,7 @@ msgstr "Temat(y) tej książki, jako lista rozdzielona przecinkami."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:847
 | 
			
		||||
msgid "Set the publisher of this book."
 | 
			
		||||
msgstr "Ustaw wydawcę tego e-booka."
 | 
			
		||||
msgstr "Ustaw wydawcę tej książki"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:849
 | 
			
		||||
msgid "A summary of this book."
 | 
			
		||||
@ -421,10 +421,12 @@ msgid ""
 | 
			
		||||
"Be more verbose while processing. Can be specified multiple times to "
 | 
			
		||||
"increase verbosity."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Wyświetlaj szczegółowe komunikaty w czasie pracy. Zaznaczenie w wielu "
 | 
			
		||||
"miejscach zwiększa liczbę szczegółów."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:857
 | 
			
		||||
msgid "Output HTML is \"pretty printed\" for easier parsing by humans"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wyjściowy HTML jest \"ładnie drukowany\" dla łatwiejszej analizy"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:863
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -711,10 +713,12 @@ msgid ""
 | 
			
		||||
"You must add this option if processing files generated by pdftohtml, "
 | 
			
		||||
"otherwise conversion will fail."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Musisz dodać tą opcję jeśli generowałeś plik przez pdftohtml, w innym "
 | 
			
		||||
"przypadku konwersja nie powiedzie się."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:192
 | 
			
		||||
msgid "Use this option on html0 files from Book Designer."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Użyj tej opcji dla plików html0 z Book Designer."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:195
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -726,19 +730,19 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:203
 | 
			
		||||
msgid "The serif family of fonts to embed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Rodzina czcionek szeryfowych do umieszczenia"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:206
 | 
			
		||||
msgid "The sans-serif family of fonts to embed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Rodzina czcionek sans-serif do umieszczenia"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:209
 | 
			
		||||
msgid "The monospace family of fonts to embed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Rodzina czcionek monospace do umieszczenia"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213
 | 
			
		||||
msgid "Be verbose while processing"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wyświetlaj szczegółowe kominukaty w czasie pracy"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:215
 | 
			
		||||
msgid "Convert to LRS"
 | 
			
		||||
@ -873,6 +877,8 @@ msgid ""
 | 
			
		||||
"Be verbose, useful for debugging. Can be specified multiple times for "
 | 
			
		||||
"greater verbosity."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Wyświetlaj szczegółowe komunikaty przydatne przy debugowaniu. Zaznaczenie w "
 | 
			
		||||
"wielu miejscach zwiększa liczbę szczegółów."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:317
 | 
			
		||||
msgid "Don't show progress bar."
 | 
			
		||||
@ -932,7 +938,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:316
 | 
			
		||||
msgid "\tBook Designer file detected."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "\twykryto plik Book Designer."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:318
 | 
			
		||||
msgid "\tParsing HTML..."
 | 
			
		||||
@ -1010,7 +1016,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1862
 | 
			
		||||
msgid "Could not read cover image: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Nie można odczytać grafiki okładki: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1865
 | 
			
		||||
msgid "Cannot read from: %s"
 | 
			
		||||
@ -1078,7 +1084,7 @@ msgstr "Ścieżka do pliku wyjściowego"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:272
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:115
 | 
			
		||||
msgid "Verbose processing"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Szczegółowe komunikaty w czasie pracy"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:274
 | 
			
		||||
msgid "Convert LRS to LRS, useful for debugging."
 | 
			
		||||
@ -1181,7 +1187,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:405
 | 
			
		||||
msgid "Be more verbose."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wyświetlaj szczegółowe kominukaty."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:417
 | 
			
		||||
msgid "You must specify a single PDF file."
 | 
			
		||||
@ -1354,7 +1360,7 @@ msgstr " nie znaleziono"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:51
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:82
 | 
			
		||||
msgid "LibraryThing.com server error. Try again later."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Błąd serwera LibraryThing.com. Spróbuj ponownie poźniej."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:60
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -1475,7 +1481,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59
 | 
			
		||||
msgid "Delete books from library after uploading to device"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Usuń książki z biblioteki po przesłaniu ich na urządzenie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:72
 | 
			
		||||
msgid "Device no longer connected."
 | 
			
		||||
@ -1491,7 +1497,7 @@ msgstr "Pozyskaj listę książek na urządzeniu"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:137
 | 
			
		||||
msgid "Send metadata to device"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Prześlij metadane do urządzenia"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:144
 | 
			
		||||
msgid "Upload %d books to device"
 | 
			
		||||
@ -1568,7 +1574,7 @@ msgstr "&Tytuł:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:90
 | 
			
		||||
msgid "&Author(s):"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Autor(zy):"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:91
 | 
			
		||||
msgid "&Number of Colors:"
 | 
			
		||||
@ -1630,49 +1636,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr "Dziennik błędów:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr "Dziennik dostępów:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr "Niewłaściwy rozmiar"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Niewłaściwa lokalizacja bazy danych"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Niewłaściwa lokalizacja bazy danych "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Niewłaściwa lokalizacja bazy danych.<br>Nie można zapisać do "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1696,7 +1702,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -1734,7 +1740,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:371
 | 
			
		||||
msgid "Read &metadata from files"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wczytytuj &metadane z plików"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:372
 | 
			
		||||
msgid "Format for &single file save:"
 | 
			
		||||
@ -1756,7 +1762,7 @@ msgstr " sekund"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:376
 | 
			
		||||
msgid "Choose &language (requires restart):"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wybierz &język (wymaga restartu):"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:377
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/utils/config.py:536
 | 
			
		||||
@ -1825,7 +1831,7 @@ msgstr "Małe"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:396
 | 
			
		||||
msgid "&Button size in toolbar"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Rozmiar przycisków na pasku narzędzi"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:397
 | 
			
		||||
msgid "Show &text in toolbar buttons"
 | 
			
		||||
@ -1833,7 +1839,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:398
 | 
			
		||||
msgid "Select visible &columns in library view"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wybierz &kolumny pokazywane w widoku biblioteki"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:401
 | 
			
		||||
msgid "Use internal &viewer for the following formats:"
 | 
			
		||||
@ -1861,7 +1867,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:407
 | 
			
		||||
msgid "&Metadata from file name"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Metadane z nazwy pliku"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:408
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -1956,7 +1962,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:143
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:155
 | 
			
		||||
msgid "Metadata"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Metadane"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:85
 | 
			
		||||
@ -2004,7 +2010,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:93
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:167
 | 
			
		||||
msgid "Choose cover for "
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wybierz okładkę dla "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:100
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:174
 | 
			
		||||
@ -2074,30 +2080,30 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:315
 | 
			
		||||
msgid "Book Cover"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Okładka książki"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Zmień grafikę &okładki:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
msgid "&Title: "
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Tytuł: "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:376
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512
 | 
			
		||||
@ -2110,7 +2116,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:283
 | 
			
		||||
msgid "&Author(s): "
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Autor(zy): "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:378
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514
 | 
			
		||||
@ -2138,14 +2144,14 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:132
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:293
 | 
			
		||||
msgid "&Publisher: "
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Wydawca: "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:382
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:133
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:294
 | 
			
		||||
msgid "Change the publisher of this book"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Zmień wydawcę tej ksiązki"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:383
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519
 | 
			
		||||
@ -2321,11 +2327,11 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139
 | 
			
		||||
msgid "Error fetching metadata"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Błąd podczas pobierania metadanych"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144
 | 
			
		||||
msgid "No metadata found"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Nie znaleziono metadanych"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -2334,11 +2340,11 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:77
 | 
			
		||||
msgid "Fetch metadata"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Pobierz metadane"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:78
 | 
			
		||||
msgid "Fetching metadata for <b>%1</b>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Pobierz metadane dla <b>%1</b>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:79
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -2352,7 +2358,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81
 | 
			
		||||
msgid "Fetch"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Pobierz"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:82
 | 
			
		||||
msgid "Matches"
 | 
			
		||||
@ -2373,15 +2379,15 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs.py:38
 | 
			
		||||
msgid " - Jobs"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr " - Zadania"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:38
 | 
			
		||||
msgid "Active Jobs"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Aktywne zadanie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:39
 | 
			
		||||
msgid "&Stop selected job"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Zatrzymaj zaznaczone zadanie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:98
 | 
			
		||||
msgid "Choose the format to convert into LRF"
 | 
			
		||||
@ -2415,6 +2421,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:263
 | 
			
		||||
msgid "<li><b>book-designer</b> - HTML0 files from Book Designer</li>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"<li><b>book-designer</b> - pliki HTML0 stworzone w Book Designer</li>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:296
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -2587,22 +2594,13 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
"type=\"text/css\">\n"
 | 
			
		||||
"p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin:0; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0; font-family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
msgid "Edit Meta information"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Edytuj metadane"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278
 | 
			
		||||
@ -2647,11 +2645,11 @@ msgstr "Dodaj ta&gi: "
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:297
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:298
 | 
			
		||||
msgid "Open Tag Editor"
 | 
			
		||||
msgstr "Otwórz edytor tagów"
 | 
			
		||||
msgstr "Otwórz edytor etykiet"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:138
 | 
			
		||||
msgid "&Remove tags:"
 | 
			
		||||
msgstr "&Usuń tagi:"
 | 
			
		||||
msgstr "&Usuń etykiety:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:139
 | 
			
		||||
msgid "Comma separated list of tags to remove from the books. "
 | 
			
		||||
@ -2670,7 +2668,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:294
 | 
			
		||||
msgid "<b>Could not fetch cover.</b><br/>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "<b>Nie można pobrać okładki.</b><br/>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:294
 | 
			
		||||
msgid "Could not fetch cover"
 | 
			
		||||
@ -2686,7 +2684,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277
 | 
			
		||||
msgid "Edit Meta Information"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Edytuj metadane"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:281
 | 
			
		||||
msgid "Swap the author and title"
 | 
			
		||||
@ -2793,7 +2791,7 @@ msgid "News"
 | 
			
		||||
msgstr "Aktualności"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2918,7 +2916,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124
 | 
			
		||||
msgid "A&vailable tags"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Dostępne etykiety"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -3001,25 +2999,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3031,7 +3029,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3185,11 +3183,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3227,7 +3225,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs2.py:46
 | 
			
		||||
msgid "Job"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Zadanie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs2.py:47
 | 
			
		||||
msgid "Status"
 | 
			
		||||
@ -3235,15 +3233,15 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs2.py:48
 | 
			
		||||
msgid "Progress"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Postęp"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs2.py:49
 | 
			
		||||
msgid "Running time"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Czas pracy"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs2.py:65
 | 
			
		||||
msgid "Unknown job"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Nieznane zadanie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/jobs2.py:70
 | 
			
		||||
msgid "Finished"
 | 
			
		||||
@ -3292,7 +3290,7 @@ msgstr "Ocena"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:274
 | 
			
		||||
msgid "None"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Brak"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:280
 | 
			
		||||
msgid "Book <font face=\"serif\">%s</font> of %s."
 | 
			
		||||
@ -3309,6 +3307,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:922
 | 
			
		||||
msgid "Search (For Advanced Search click the button to the left)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Szukaj (Aby użyć zaawansowanego wyszukiwania kliknij przycisk po lewej)"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:47
 | 
			
		||||
msgid "Configure Viewer"
 | 
			
		||||
@ -3388,7 +3387,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:98
 | 
			
		||||
msgid "&Restore"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Przywróć"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:99
 | 
			
		||||
msgid "&Donate"
 | 
			
		||||
@ -3427,7 +3426,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:153
 | 
			
		||||
msgid "and delete from library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "i usuń z biblioteki"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:155
 | 
			
		||||
msgid "Send to storage card by default"
 | 
			
		||||
@ -3435,7 +3434,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:168
 | 
			
		||||
msgid "Edit metadata individually"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Edytuj metadane pjedyńczo"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:170
 | 
			
		||||
msgid "Edit metadata in bulk"
 | 
			
		||||
@ -3443,7 +3442,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173
 | 
			
		||||
msgid "Add books from a single directory"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Dodaj książki z pojedyńczego folderu"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -3460,11 +3459,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:190
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:311
 | 
			
		||||
msgid "Save to disk"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Zapisz na dysku"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:191
 | 
			
		||||
msgid "Save to disk in a single directory"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Zapisz na dysku w pojedyńczym folderze"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:192
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1106
 | 
			
		||||
@ -3622,7 +3621,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730
 | 
			
		||||
msgid "Cannot edit metadata"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Nie można edytować metadanych"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:708
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:730
 | 
			
		||||
@ -3651,11 +3650,11 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:849
 | 
			
		||||
msgid "Cannot save to disk"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Nie można zapisać na dysku"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:853
 | 
			
		||||
msgid "Choose destination directory"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wyberz folder docelowy"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:860
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -3714,7 +3713,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1118
 | 
			
		||||
msgid "Copying library to "
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Kopiowanie biblioteki do "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1128
 | 
			
		||||
msgid "Invalid database"
 | 
			
		||||
@ -3772,7 +3771,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1251
 | 
			
		||||
msgid "Choose new location for database"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wybierz nową lokalizację dla bazy danych"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1304
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -3840,7 +3839,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:293
 | 
			
		||||
msgid "&Search:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "&Szukaj:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:294
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -3868,11 +3867,11 @@ msgstr "Dopasuj wszystkie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:302
 | 
			
		||||
msgid "Sort by &popularity"
 | 
			
		||||
msgstr "Sorduj według &popularności"
 | 
			
		||||
msgstr "Sortuj według &popularności"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:303
 | 
			
		||||
msgid "Add books"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Dodaj książki"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:304
 | 
			
		||||
msgid "A"
 | 
			
		||||
@ -3881,7 +3880,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:305
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:306
 | 
			
		||||
msgid "Remove books"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Usuń książki"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:307
 | 
			
		||||
msgid "Del"
 | 
			
		||||
@ -3889,7 +3888,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:308
 | 
			
		||||
msgid "Edit meta information"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Edytuj metadane"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:309
 | 
			
		||||
msgid "E"
 | 
			
		||||
@ -3897,7 +3896,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:310
 | 
			
		||||
msgid "Send to device"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Preślij na urządzenie"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:312
 | 
			
		||||
msgid "S"
 | 
			
		||||
@ -3925,7 +3924,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:319
 | 
			
		||||
msgid "Open containing folder"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Otwórz folder zawierający"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:320
 | 
			
		||||
msgid "Show book details"
 | 
			
		||||
@ -3951,7 +3950,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:146
 | 
			
		||||
msgid "Click to browse books by their covers"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Kliknij, aby przeglądać książki po okładkach"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:146
 | 
			
		||||
msgid "Click to turn off Cover Browsing"
 | 
			
		||||
@ -3965,7 +3964,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:159
 | 
			
		||||
msgid "Click to browse books by tags"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Kliknij, aby przeglądać ksiązki po etykietach"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/tags.py:42
 | 
			
		||||
msgid "Authors"
 | 
			
		||||
@ -4233,39 +4232,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Biblioteka"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4397,6 +4398,8 @@ msgid ""
 | 
			
		||||
"Add books to database even if they already exist. Comparison is done based "
 | 
			
		||||
"on book titles."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Dodaj książki do bazy danych nawet jeśli już są w niej. Porównanie odbywa "
 | 
			
		||||
"się na podstawie tytułów."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/library/cli.py:316
 | 
			
		||||
msgid "You must specify at least one file to add"
 | 
			
		||||
@ -4594,7 +4597,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/utils/config.py:538
 | 
			
		||||
msgid "Read metadata from files"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wczytaj metadane z plików"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/utils/config.py:540
 | 
			
		||||
msgid "The priority of worker processes"
 | 
			
		||||
@ -4620,13 +4623,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr "Nieznany kanał"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr "Artukył bez tytułu"
 | 
			
		||||
 | 
			
		||||
@ -4695,7 +4698,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:37
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:92
 | 
			
		||||
msgid "Be more verbose while processing."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Wyświetlaj szczegółowe kominukaty w czasie pracy."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:39
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:94
 | 
			
		||||
@ -4735,7 +4738,7 @@ msgstr "Ukryj pasek postępu"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:105
 | 
			
		||||
msgid "Very verbose output, useful for debugging."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Bardzo szczegółowy wynik. Przydatny do debugowania."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:57
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:107
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-07-05 03:33+0000\n"
 | 
			
		||||
"Last-Translator: Tiago Silva <Unknown>\n"
 | 
			
		||||
"Language-Team: Portuguese <pt@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1546,49 +1546,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1612,7 +1612,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -1993,22 +1993,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2503,8 +2503,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2700,7 +2700,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2904,25 +2904,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2934,7 +2934,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3088,11 +3088,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4134,39 +4134,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4521,13 +4523,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -6,21 +6,20 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre 0.4.55\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-07 14:04-0800\n"
 | 
			
		||||
"Last-Translator: Kovid Goyal <kovid@kovidgoyal.net>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-12-07 22:09+0000\n"
 | 
			
		||||
"Last-Translator: Kovid Goyal <Unknown>\n"
 | 
			
		||||
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Generator: Lokalize 0.2\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
"X-Poedit-Country: RUSSIAN FEDERATION\n"
 | 
			
		||||
"X-Poedit-Language: Russian\n"
 | 
			
		||||
"X-Poedit-SourceCharset: utf-8\n"
 | 
			
		||||
"Generated-By: pygettext.py 1.5\n"
 | 
			
		||||
"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,-1,329,-1,-1\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:153
 | 
			
		||||
@ -41,7 +40,8 @@ msgstr "Опции контроля преобразования в EPUB"
 | 
			
		||||
msgid ""
 | 
			
		||||
"The output EPUB file. If not specified, it is derived from the input file "
 | 
			
		||||
"name."
 | 
			
		||||
msgstr "Выходной файл EPUB. Если не назначено, извлекается имя входящего файла."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Выходной файл EPUB. Если не назначено, извлекается имя входящего файла."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:105
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -108,7 +108,8 @@ msgstr "Путь к обложке используемой для этой кн
 | 
			
		||||
msgid ""
 | 
			
		||||
"Use the cover detected from the source file in preference to the specified "
 | 
			
		||||
"cover."
 | 
			
		||||
msgstr "Вместо заданной, использовать определение обложки из исходного файла."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Вместо заданной, использовать определение обложки из исходного файла."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:127
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -243,7 +244,8 @@ msgid "Keep intermediate files during processing by html2epub"
 | 
			
		||||
msgstr "Сохранить промежуточную копию файла во время обработки html2epub"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:170
 | 
			
		||||
msgid "Extract the contents of the produced EPUB file to the specified directory."
 | 
			
		||||
msgid ""
 | 
			
		||||
"Extract the contents of the produced EPUB file to the specified directory."
 | 
			
		||||
msgstr "Извлечь содержимое созданного файла EPUB в специальную дерикторию."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_any.py:43
 | 
			
		||||
@ -342,8 +344,10 @@ msgid "%s format books are not supported"
 | 
			
		||||
msgstr "%s формат книг не поддерживается"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/split.py:30
 | 
			
		||||
msgid "Could not find reasonable point at which to split: %s Sub-tree size: %d KB"
 | 
			
		||||
msgstr "Не могу найти приемлимое место разделения: %s Размер поддерева: %d КБ"
 | 
			
		||||
msgid ""
 | 
			
		||||
"Could not find reasonable point at which to split: %s Sub-tree size: %d KB"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Не могу найти приемлимое место разделения: %s Размер поддерева: %d КБ"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/split.py:109
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -739,7 +743,8 @@ msgstr ""
 | 
			
		||||
"нескольких элементов."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:180
 | 
			
		||||
msgid "Force a page break before tags whose names match this regular expression."
 | 
			
		||||
msgid ""
 | 
			
		||||
"Force a page break before tags whose names match this regular expression."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Устанавить разрывы страниц перед тегами, имена которых соответствуют этому "
 | 
			
		||||
"регулярному выражению."
 | 
			
		||||
@ -877,7 +882,8 @@ msgstr ""
 | 
			
		||||
"%s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:282
 | 
			
		||||
msgid "Options to control the conversion of comics (CBR, CBZ) files into ebooks"
 | 
			
		||||
msgid ""
 | 
			
		||||
"Options to control the conversion of comics (CBR, CBZ) files into ebooks"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Опции контроля преобразования файлов комиксов (CBR, CBZ) в электронную книгу"
 | 
			
		||||
 | 
			
		||||
@ -886,7 +892,8 @@ msgid "Title for generated ebook. Default is to use the filename."
 | 
			
		||||
msgstr "Заголовок для созданной книги. По умолчанию используется имя файла."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:290
 | 
			
		||||
msgid "Set the author in the metadata of the generated ebook. Default is %default"
 | 
			
		||||
msgid ""
 | 
			
		||||
"Set the author in the metadata of the generated ebook. Default is %default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Ввести автора в метаданные создаваемые электронной книгой. По умолчанию "
 | 
			
		||||
"%default"
 | 
			
		||||
@ -1098,8 +1105,10 @@ msgstr ""
 | 
			
		||||
"%s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1765
 | 
			
		||||
msgid "An error occurred while processing a table: %s. Ignoring table markup."
 | 
			
		||||
msgstr "Призошла ошибка при обработке таблицы: %s. Пропустить разметку таблицы."
 | 
			
		||||
msgid ""
 | 
			
		||||
"An error occurred while processing a table: %s. Ignoring table markup."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Призошла ошибка при обработке таблицы: %s. Пропустить разметку таблицы."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1767
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -1254,11 +1263,14 @@ msgstr "Катигория этой книги. Например: История
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:598
 | 
			
		||||
msgid "Path to a graphic that will be set as this files' thumbnail"
 | 
			
		||||
msgstr "Путь к картинке, которая будет использоваться в этом файле как миниатюра"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Путь к картинке, которая будет использоваться в этом файле как миниатюра"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:601
 | 
			
		||||
msgid "Path to a txt file containing the comment to be stored in the lrf file."
 | 
			
		||||
msgstr "Путь к текстовому файлу содержащему комментарии сохраняемые в файл lrf."
 | 
			
		||||
msgid ""
 | 
			
		||||
"Path to a txt file containing the comment to be stored in the lrf file."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Путь к текстовому файлу содержащему комментарии сохраняемые в файл lrf."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:605
 | 
			
		||||
msgid "Extract thumbnail from LRF file"
 | 
			
		||||
@ -1297,7 +1309,8 @@ msgid "Could not find pdftohtml, check it is in your PATH"
 | 
			
		||||
msgstr "Не могу найти pdftohtml, проверьте наличе по PATH"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:61
 | 
			
		||||
msgid " is an image based PDF. Only conversion of text based PDFs is supported."
 | 
			
		||||
msgid ""
 | 
			
		||||
" is an image based PDF. Only conversion of text based PDFs is supported."
 | 
			
		||||
msgstr ""
 | 
			
		||||
" PDF содержит картинки. Поддерживается преобразование только текстовых PDF."
 | 
			
		||||
 | 
			
		||||
@ -1802,49 +1815,49 @@ msgstr ""
 | 
			
		||||
"Сервер\n"
 | 
			
		||||
"Контента"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr "Лог ошибок:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr "Лог доступа:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr "Сбой запуска контент сервера"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Неправильное расположение базы данных"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr "<br>Должна быть дирректория."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Неправильное расположение базы данных "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Неправильное расположение базы данных.<br>Немогу записать "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr "Сжатие базы данных. Это займет некоторое время."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr "Сжатие..."
 | 
			
		||||
 | 
			
		||||
@ -1868,7 +1881,7 @@ msgstr "Просмотреть расположение новой базы да
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -1981,7 +1994,8 @@ msgstr "Использовать &Римские цифры для нумера
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:391
 | 
			
		||||
msgid "&Number of covers to show in browse mode (after restart):"
 | 
			
		||||
msgstr "&Количество обложек показываемых в режиме просмотра (после перезагрузки):"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"&Количество обложек показываемых в режиме просмотра (после перезагрузки):"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:392
 | 
			
		||||
msgid "Toolbar"
 | 
			
		||||
@ -2216,7 +2230,7 @@ msgstr "Ошибка чтения файла"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:184
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:60
 | 
			
		||||
msgid "<p>There was an error reading from file: <br /><b>"
 | 
			
		||||
msgstr "<p>Ошибка при чтении файла:<br/><b>"
 | 
			
		||||
msgstr "<p>Ошибка при чтении файла:<br /><b>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:190
 | 
			
		||||
@ -2265,22 +2279,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr "Обложка книги"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Использовать обложку из &исходного файла"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr "Заменено изображение &обложки:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr "Просматреть изображения для обложки этой книги."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Использовать обложку из &исходного файла"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2536,7 +2550,8 @@ msgid "No metadata found"
 | 
			
		||||
msgstr "Нет метаданных"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144
 | 
			
		||||
msgid "No metadata found, try adjusting the title and author or the ISBN key."
 | 
			
		||||
msgid ""
 | 
			
		||||
"No metadata found, try adjusting the title and author or the ISBN key."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Нет метаданных, попробуйте откорректировать заглавие и автора или ISBN ключ."
 | 
			
		||||
 | 
			
		||||
@ -2569,7 +2584,8 @@ msgid "Matches"
 | 
			
		||||
msgstr "Совпадения"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:83
 | 
			
		||||
msgid "Select the book that most closely matches your copy from the list below"
 | 
			
		||||
msgid ""
 | 
			
		||||
"Select the book that most closely matches your copy from the list below"
 | 
			
		||||
msgstr "Из списка выберете книгу, которая более соответствует вашей."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:33
 | 
			
		||||
@ -2745,7 +2761,8 @@ msgstr " пикс."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:557
 | 
			
		||||
msgid "&Convert tables to images (good for large/complex tables)"
 | 
			
		||||
msgstr "Преобразовать таблицы в картинки (полезно для больших/сложных таблиц)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Преобразовать таблицы в картинки (полезно для больших/сложных таблиц)"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:558
 | 
			
		||||
msgid "&Multiplier for text size in rendered tables:"
 | 
			
		||||
@ -2805,19 +2822,9 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" "
 | 
			
		||||
"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
 | 
			
		||||
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style "
 | 
			
		||||
"type=\"text/css\">\n"
 | 
			
		||||
"p, li { white-space: pre-wrap; }\n"
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
msgid "Edit Meta information"
 | 
			
		||||
@ -2956,7 +2963,8 @@ msgid "Fetch cover image from server"
 | 
			
		||||
msgstr "Получить изображение обложки с сервера"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:322
 | 
			
		||||
msgid "Change the username and/or password for your account at LibraryThing.com"
 | 
			
		||||
msgid ""
 | 
			
		||||
"Change the username and/or password for your account at LibraryThing.com"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Сменить имя пользователя и/или пароль для ваших данных на LibraryThing.com"
 | 
			
		||||
 | 
			
		||||
@ -3019,7 +3027,7 @@ msgid "News"
 | 
			
		||||
msgstr "Новости"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr "Состав"
 | 
			
		||||
 | 
			
		||||
@ -3236,25 +3244,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3266,7 +3274,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3420,11 +3428,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3836,7 +3844,8 @@ msgid "No space on device"
 | 
			
		||||
msgstr "Нет места на устройстве"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:635
 | 
			
		||||
msgid "<p>Cannot upload books to device there is no more free space available "
 | 
			
		||||
msgid ""
 | 
			
		||||
"<p>Cannot upload books to device there is no more free space available "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:665
 | 
			
		||||
@ -4465,43 +4474,41 @@ msgstr "Справочный режим"
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr "Закладка"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr "Неправильное регулярное выражение"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr "Неправильное регулярное выражение: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Ридер\n"
 | 
			
		||||
"%s доступен"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Карта\n"
 | 
			
		||||
"%s доступна"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4856,13 +4863,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr "Неизвестная заготовка"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4879,7 +4886,8 @@ msgstr ""
 | 
			
		||||
msgid ""
 | 
			
		||||
"Timeout in seconds to wait for a response from the server. Default: %default "
 | 
			
		||||
"s"
 | 
			
		||||
msgstr "Максимальное время ожидания ответа от сервера. По умолчанию: %default с"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Максимальное время ожидания ответа от сервера. По умолчанию: %default с"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:22
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:450
 | 
			
		||||
@ -5035,7 +5043,8 @@ msgstr ""
 | 
			
		||||
"%s\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:85
 | 
			
		||||
msgid "Options to control web2disk (used to fetch websites linked from feeds)"
 | 
			
		||||
msgid ""
 | 
			
		||||
"Options to control web2disk (used to fetch websites linked from feeds)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Опции контроля web2disk (обычно вызываются линки сайтов переводных страниц )"
 | 
			
		||||
 | 
			
		||||
@ -5143,7 +5152,8 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:439
 | 
			
		||||
msgid "Base directory into which URL is saved. Default is %default"
 | 
			
		||||
msgstr "Основная директория, в которую сохранятся URL. По умолчанию: %default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Основная директория, в которую сохранятся URL. По умолчанию: %default"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:445
 | 
			
		||||
msgid ""
 | 
			
		||||
@ -5168,6 +5178,20 @@ msgstr "Показать детальную информацию. Использ
 | 
			
		||||
#~ msgid "&Priority for conversion jobs:"
 | 
			
		||||
#~ msgstr "&Очередность работ преобразования:"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Ридер\n"
 | 
			
		||||
#~ "%s доступен"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Card\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Карта\n"
 | 
			
		||||
#~ "%s доступна"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Detect a chapter beginning at an element having the specified attribute. The "
 | 
			
		||||
#~ "format for this option is tagname regexp,attribute name,attribute value "
 | 
			
		||||
@ -5182,4 +5206,3 @@ msgstr "Показать детальную информацию. Использ
 | 
			
		||||
 | 
			
		||||
#~ msgid "Enable system &tray icon"
 | 
			
		||||
#~ msgstr "Использовать иконку в панели задач"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										5070
									
								
								src/calibre/translations/sk.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5070
									
								
								src/calibre/translations/sk.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -6,14 +6,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre 0.4.17\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-09-19 19:17+0000\n"
 | 
			
		||||
"Last-Translator: Kovid Goyal <Unknown>\n"
 | 
			
		||||
"Language-Team: sl\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:42+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:49+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
"Generated-By: pygettext.py 1.5\n"
 | 
			
		||||
 | 
			
		||||
@ -1703,49 +1703,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr "Napačna lokacija podatkovne baze"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr "<br>Mora biti direktorij."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr "Napačna lokacija podatkovne baze "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr "Napačna lokacija podatkovne baze. <br>Ne morem pisati v "
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr "Krčenje podatkovne baze. To lahko traja nekaj časa."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr "Krčenje ..."
 | 
			
		||||
 | 
			
		||||
@ -1771,7 +1771,7 @@ msgstr "Prebrskaj za novo lokacijo podatkovne baze"
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -2154,22 +2154,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr "Naslovna Stran"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Uporabi na&slovnico iz izvorne datoteke"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr "Spremeni &sliko naslovne strani:"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr "Izberi sliko, ki bo uporabljena za naslovnico te knjige."
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr "Uporabi na&slovnico iz izvorne datoteke"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2679,8 +2679,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2882,7 +2882,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr "Recepti"
 | 
			
		||||
 | 
			
		||||
@ -3092,25 +3092,25 @@ msgstr "Ta feed je že bil dodan v recept"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr "Nepravilen vnos"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr "<p>Kreiranje recepta ni bilo mogoče. Napaka:<br>%s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr "Zamenjam recept?"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr "Vir novic po meri z imenom %s že obstaja. Ga želite zamenjati?"
 | 
			
		||||
 | 
			
		||||
@ -3122,7 +3122,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr "Izberite recept"
 | 
			
		||||
 | 
			
		||||
@ -3279,11 +3279,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr "Brez zadetka"
 | 
			
		||||
 | 
			
		||||
@ -4372,45 +4372,43 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr "Neveljaven regularni izraz"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr "Neveljaven regularni izraz: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr "Knjižnica"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s je na voljo"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Kartica\n"
 | 
			
		||||
"%s je na voljo"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr "Kliknite za seznam knjig, ki so na voljo na vašem računalniku"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Kliknite za seznam knjig, ki so na voljo v glavnem pomnilniku vašega reader-"
 | 
			
		||||
"ja"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Kliknite za seznam knjig, ki so na voljo v spominski kartici v vašem reader-"
 | 
			
		||||
@ -4825,13 +4823,13 @@ msgstr "Avtentikacija SSH seje ni uspela: "
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr "Avtentikacija s strežnikom ni uspela: %s"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr "Neznani feed"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr "Neznan članek"
 | 
			
		||||
 | 
			
		||||
@ -5175,6 +5173,20 @@ msgstr "Podrobneje prikaži izhodne informacije. Koristno za razhroščevanje."
 | 
			
		||||
#~ msgid "Custom news sources"
 | 
			
		||||
#~ msgstr "Viri novic po meri"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Reader\n"
 | 
			
		||||
#~ "%s je na voljo"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Card\n"
 | 
			
		||||
#~ "%s available"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Kartica\n"
 | 
			
		||||
#~ "%s je na voljo"
 | 
			
		||||
 | 
			
		||||
#~ msgid " does not allow copying of text."
 | 
			
		||||
#~ msgstr " ne omogoča kopiranje teksta."
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-09-14 18:45+0000\n"
 | 
			
		||||
"Last-Translator: Linus C Unneback <linus@folkdatorn.se>\n"
 | 
			
		||||
"Language-Team: Swedish <sv@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:41+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1546,49 +1546,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1612,7 +1612,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -1993,22 +1993,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2503,8 +2503,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2700,7 +2700,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2904,25 +2904,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2934,7 +2934,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3088,11 +3088,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4134,39 +4134,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4521,13 +4523,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: calibre\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-06 07:37+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2008-12-09 02:03+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2008-06-24 13:22+0000\n"
 | 
			
		||||
"Last-Translator: వీవెన్ (Veeven) <Unknown>\n"
 | 
			
		||||
"Language-Team: Telugu <te@li.org>\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-07 21:41+0000\n"
 | 
			
		||||
"X-Launchpad-Export-Date: 2008-12-10 21:48+0000\n"
 | 
			
		||||
"X-Generator: Launchpad (build Unknown)\n"
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:135
 | 
			
		||||
@ -1546,49 +1546,49 @@ msgid ""
 | 
			
		||||
"Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:161
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:162
 | 
			
		||||
msgid "Error log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:165
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:166
 | 
			
		||||
msgid "Access log:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:187
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:188
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:339
 | 
			
		||||
msgid "Failed to start content server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "Invalid size"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:227
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:228
 | 
			
		||||
msgid "The size %s is invalid. must be of the form widthxheight"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:269
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:273
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
msgid "Invalid database location"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "<br>Must be a directory."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:270
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:271
 | 
			
		||||
msgid "Invalid database location "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:274
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:275
 | 
			
		||||
msgid "Invalid database location.<br>Cannot write to "
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting database. This may take a while."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:286
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:287
 | 
			
		||||
msgid "Compacting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -1612,7 +1612,7 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:389
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:399
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:400
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:282
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:288
 | 
			
		||||
@ -1993,22 +1993,22 @@ msgid "Book Cover"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:371
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:316
 | 
			
		||||
msgid "Change &cover image:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:373
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:372
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:317
 | 
			
		||||
msgid "Browse for an image to use as the cover of this book."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:374
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510
 | 
			
		||||
msgid "Use cover from &source file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:375
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279
 | 
			
		||||
@ -2503,8 +2503,8 @@ msgid ""
 | 
			
		||||
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
 | 
			
		||||
"font-weight:400; font-style:normal;\">\n"
 | 
			
		||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-"
 | 
			
		||||
"family:'Sans Serif'; font-size:9pt;\"></p></body></html>"
 | 
			
		||||
"margin-left:0px; margin-right:0px; -qt-block-indent:0; text-"
 | 
			
		||||
"indent:0px;\"></p></body></html>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122
 | 
			
		||||
@ -2700,7 +2700,7 @@ msgid "News"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:137
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Recipes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2904,25 +2904,25 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:163
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
msgid "Invalid input"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:173
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:229
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:230
 | 
			
		||||
msgid "<p>Could not create recipe. Error:<br>%s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:210
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
msgid "Replace recipe?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:211
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:235
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:212
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
 | 
			
		||||
msgid "A custom recipe named %s already exists. Do you want to replace it?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -2934,7 +2934,7 @@ msgstr ""
 | 
			
		||||
msgid "Pick the recipe to customize"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:221
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:222
 | 
			
		||||
msgid "Choose a recipe file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -3088,11 +3088,11 @@ msgstr ""
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:54
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:68
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:70
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:55
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:59
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:64
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:69
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:71
 | 
			
		||||
msgid "No match"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4134,39 +4134,41 @@ msgstr ""
 | 
			
		||||
msgid "Bookmark"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:47
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
msgid "Invalid regular expression"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:49
 | 
			
		||||
msgid "Invalid regular expression: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:178
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:183
 | 
			
		||||
msgid "Library"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:179
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid ""
 | 
			
		||||
"Reader\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:180
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:184
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:185
 | 
			
		||||
msgid ""
 | 
			
		||||
"Card\n"
 | 
			
		||||
"%s\n"
 | 
			
		||||
"available"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:189
 | 
			
		||||
msgid "Click to see the list of books available on your computer"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:190
 | 
			
		||||
msgid "Click to see the list of books in the main memory of your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:186
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:191
 | 
			
		||||
msgid "Click to see the list of books on the storage card in your reader"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
@ -4521,13 +4523,13 @@ msgstr ""
 | 
			
		||||
msgid "Failed to authenticate with server: %s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:63
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:84
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:75
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:96
 | 
			
		||||
msgid "Unknown feed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:102
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:124
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:114
 | 
			
		||||
#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:136
 | 
			
		||||
msgid "Untitled article"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										37
									
								
								src/calibre/web/feeds/recipes/telegraph_uk.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/calibre/web/feeds/recipes/telegraph_uk.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,37 @@
 | 
			
		||||
#!/usr/bin/env  python
 | 
			
		||||
 | 
			
		||||
__license__   = 'GPL v3'
 | 
			
		||||
__copyright__ = '2008, Darko Miletic <darko.miletic at gmail.com>'
 | 
			
		||||
'''
 | 
			
		||||
telegraph.co.uk
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
from calibre.web.feeds.news import BasicNewsRecipe
 | 
			
		||||
 | 
			
		||||
class TelegraphUK(BasicNewsRecipe):
 | 
			
		||||
    title                 = u'Telegraph.co.uk'
 | 
			
		||||
    __author__            = 'Darko Miletic'
 | 
			
		||||
    description           = 'News from United Kingdom'    
 | 
			
		||||
    oldest_article        = 7
 | 
			
		||||
    max_articles_per_feed = 100
 | 
			
		||||
    no_stylesheets        = True
 | 
			
		||||
    use_embedded_content  = False
 | 
			
		||||
 | 
			
		||||
    keep_only_tags    = [ 
 | 
			
		||||
                           dict(name='div', attrs={'class':'storyHead'})
 | 
			
		||||
                          ,dict(name='div', attrs={'class':'story'    }) 
 | 
			
		||||
                        ]
 | 
			
		||||
    remove_tags    = [dict(name='div', attrs={'class':'slideshow'})]
 | 
			
		||||
    
 | 
			
		||||
    feeds          = [
 | 
			
		||||
                         (u'UK News'        , u'http://www.telegraph.co.uk/news/uknews/rss'                                      )
 | 
			
		||||
                        ,(u'World News'     , u'http://www.telegraph.co.uk/news/worldnews/rss'                                   )
 | 
			
		||||
                        ,(u'Politics'       , u'http://www.telegraph.co.uk/news/newstopics/politics/rss'                         )
 | 
			
		||||
                        ,(u'Technology News', u'http://www.telegraph.co.uk/scienceandtechnology/technology/technologynews/rss'   )
 | 
			
		||||
                        ,(u'UK News'        , u'http://www.telegraph.co.uk/scienceandtechnology/technology/technologyreviews/rss')
 | 
			
		||||
                        ,(u'Science News'   , u'http://www.telegraph.co.uk/scienceandtechnology/science/sciencenews/rss'         )
 | 
			
		||||
                        ,(u'Sport'          , u'http://www.telegraph.co.uk/sport/rss'                                            )
 | 
			
		||||
                        ,(u'Earth News'     , u'http://www.telegraph.co.uk/earth/earthnews/rss'                                  )
 | 
			
		||||
                        ,(u'Comment'        , u'http://www.telegraph.co.uk/comment/rss'                                          )
 | 
			
		||||
                        ,(u'How about that?', u'http://www.telegraph.co.uk/news/newstopics/howaboutthat/rss'                     )
 | 
			
		||||
                     ]
 | 
			
		||||
@ -102,15 +102,12 @@ def build_osx(shutdown=True):
 | 
			
		||||
    return os.path.basename(installer)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def build_linux(shutdown=True):
 | 
			
		||||
def build_linux(*args, **kwargs):
 | 
			
		||||
    installer = installer_name('tar.bz2')
 | 
			
		||||
    vm = '/vmware/linux/libprs500-gentoo.vmx'
 | 
			
		||||
    start_vm(vm, 'linux', (BUILD_SCRIPT%('sudo python setup.py develop', 'python','installer/linux/freeze.py')).replace('rm ', 'sudo rm '), sleep=120)
 | 
			
		||||
    subprocess.check_call(('scp', 'linux:/tmp/%s'%os.path.basename(installer), 'dist'))
 | 
			
		||||
    exec open('installer/linux/freeze.py')
 | 
			
		||||
    freeze()
 | 
			
		||||
    if not os.path.exists(installer):
 | 
			
		||||
        raise Exception('Failed to build installer '+installer)
 | 
			
		||||
    if shutdown:
 | 
			
		||||
        subprocess.Popen(('ssh', 'linux', 'sudo', '/sbin/poweroff'))
 | 
			
		||||
    return os.path.basename(installer)
 | 
			
		||||
 | 
			
		||||
def build_installers():
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user