calibre - en to es translation catalogue (80 entries)

en: Writing your own plugins to extend calibre's functionality
es: Escribir sus propios complementos para extender la funcionalidad de calibre

en: calibre has a very modular design. Almost all functionality in calibre comes in the form of plugins. Plugins are used for conversion, for downloading news (though these are called recipes), for various components of the user interface, to connect to different devices, to process files when adding them to calibre and so on. You can get a complete list of all the built-in plugins in calibre by going to :guilabel:`Preferences->Advanced->Plugins`.
es: calibre tiene un diseño muy modular. Casi todas las funciones de calibre vienen en forma de complementos. Los complementos se utilizan para la conversión, para la descarga de noticias (aunque éstos se llaman fórmulas), para diversos componentes de la interfaz de usuario, para conectarse a diferentes dispositivos, para procesar archivos cuando se añaden a calibre, etcétera. Puede obtener una lista completa de todos los complementos integrados en calibre en :guilabel:`Preferencias > Avanzado > Complementos`.

en: Here, we will teach you how to create your own plugins to add new features to calibre.
es: Aquí le enseñaremos como crear sus propios complementos para agregar funciones a calibre.

en: Contents
es: Índice

en: This only applies to calibre releases >= 0.8.60
es: Esto sólo se aplica a versiones calibre >= 0.8.60

en: Anatomy of a calibre plugin
es: Anatomía de un complemento de calibre

en: A calibre plugin is very simple, it's just a ZIP file that contains some Python code and any other resources like image files needed by the plugin. Without further ado, let's see a basic example.
es: Un complemento de calibre es muy sencillo, no es más que un archivo ZIP que contiene algo de código Python y otros recursos, como archivos de imagen, que necesite el complemento. Sin más preámbulos, vamos a ver un ejemplo básico.

en: Suppose you have an installation of calibre that you are using to self publish various e-documents in EPUB and MOBI formats. You would like all files generated by calibre to have their publisher set as "Hello world", here's how to do it. Create a file named :file:`__init__.py` (this is a special name and must always be used for the main file of your plugin) and enter the following Python code into it:
es: Supongamos que está usando una instalación de calibre publicar sus propios documentos electrónicos en formatos EPUB y MOBI. Le gustaría que todos los archivos generados por calibre establecieran la editorial como «Hello World», he aquí cómo hacerlo. Cree un archivo llamado :file:`__init __.py` (éste es un nombre especial y siempre debe ser el del archivo principal del complemento) e introduzca el siguiente código Python en él:

en: That's all. To add this code to calibre as a plugin, simply run the following in the folder in which you created :file:`__init__.py`::
es: Eso es todo. Para agregar este código a calibre como un complemento, simplemente ejecute lo siguiente en la carpeta donde reside el archivo :file:`__init__.py`::

en: On macOS, the command line tools are inside the calibre bundle, for example, if you installed calibre in :file:`/Applications` the command line tools are in :file:`/Applications/calibre.app/Contents/MacOS/`.
es: En macOS, las herramientas de línea de órdenes están dentro del paquete calibre, por ejemplo, si ha instalado calibre en :file:`/Aplicaciones` las herramientas de línea de órdenes están en :file:/Aplicaciones/calibre.app/Contents/MacOS/`.

en: You can download the Hello World plugin from :download_file:`helloworld_plugin.zip`.
es: Puede descargar el complemento Hello World de :download_file:`helloworld_plugin.zip`.

en: Every time you use calibre to convert a book, the plugin's :meth:`run` method will be called and the converted book will have its publisher set to "Hello World". This is a trivial plugin, lets move on to a more complex example that actually adds a component to the user interface.
es: Cada vez que utilice calibre para convertir un libro, el método :meth:`run` del complemento se ejecutará y el libro convertido tendrá como editorial predeterminada «Hello World». Éste es un complemento intranscendente, veamos un ejemplo más complejo que agrega un componente a la interfaz de usuario.

en: A User Interface plugin
es: Un complemento de interfaz de usuario

en: This plugin will be spread over a few files (to keep the code clean). It will show you how to get resources (images or data files) from the plugin ZIP file, allow users to configure your plugin, how to create elements in the calibre user interface and how to access and query the books database in calibre.
es: Este complemento ocupará unos pocos archivos (para mantener el código más limpio). Le mostrará cómo obtener recursos (imágenes o archivos de datos) desde el archivo ZIP del complemento, cómo permitir a los usuarios configurar el complemento, cómo crear elementos en la interfaz de usuario de calibre y cómo acceder y consultar la base de datos de libros de calibre.

en: You can download this plugin from :download_file:`interface_demo_plugin.zip`
es: Puede descargar este complemento de :download_file:`interface_demo_plugin.zip`

en: The first thing to note is that this ZIP file has a lot more files in it, explained below, pay particular attention to ``plugin-import-name-interface_demo.txt``.
es: Lo primero que hay que tener en cuenta es que este archivo ZIP tiene muchos más archivos en su interior, explicados a continuación, preste especial atención a ``plugin-import-name-interface_demo.txt``.

en: An empty text file used to enable the multi-file plugin magic. This file must be present in all plugins that use more than one .py file. It should be empty and its filename must be of the form: ``plugin-import-name-**some_name**.txt``. The presence of this file allows you to import code from the .py files present inside the ZIP file, using a statement like::
es: Un archivo de texto vacío utilizado para activar la gestión de múltiples archivos en el complemento. Este archivo debe estar presente en todos los complementos que utilicen más de un archivo .py. Debe quedar vacío y su nombre debe ser de la forma: ``plugin-import-name-**some_name**.txt``. La presencia de este archivo le permite importar código de los archivos .py presentes dentro del archivo ZIP, usando una sentencia como ésta::

en: The prefix ``calibre_plugins`` must always be present. ``some_name`` comes from the filename of the empty text file. ``some_module`` refers to  :file:`some_module.py` file inside the ZIP file. Note that this importing is just as powerful as regular Python imports. You can create packages and subpackages of .py modules inside the ZIP file, just like you would normally (by defining __init__.py in each sub-folder), and everything should "just work".
es: El prefijo ``calibre_plugins`` siempre debe estar presente. ``some_name`` proviene del nombre del archivo de texto vacío. ``some_module`` se refiere al archivo :file:`some_module.py` dentro del archivo ZIP. Tenga en cuenta que esta importación es tan potente como las importaciones normales en Python. Puede crear paquetes y subpaquetes de módulos .py dentro del archivo ZIP, igual que lo haría normalmente (definiendo __init__.py en cada subcarpeta), y todo «debería funcionar».

en: The name you use for ``some_name`` enters a global namespace shared by all plugins, **so make it as unique as possible**. But remember that it must be a valid Python identifier (only alphabets, numbers and the underscore).
es: El nombre que utilice para ``some_name`` entra en un espacio global de nombres compartido por todos los complementos, **así que hágalo tan único como sea posible**. Pero recuerde que debe ser un identificador Python válido (sólo letras, números y guión bajo).

en: As before, the file that defines the plugin class
es: Como antes, el archivo que define la clase del complemento

en: This file contains the actual code that does something useful
es: Este archivo contiene el código real que realiza alguna operación útil

en: This file defines the interface part of the plugin
es: Este archivo define la interfaz del complemento

en: The icon for this plugin
es: El icono para este complemento

en: A text file with information about the plugin
es: Un archivo de texto con información acerca de este complemento

en: A folder containing .mo files with the translations of the user interface of your plugin into different languages. See below for details.
es: Una carpeta que contiene archivos .mo con las traducciones de la interfaz de usuario del complemento a diferentes idiomas. Ver más adelante para más detalles.

en: Now let's look at the code.
es: Ahora veamos el código.

en: First, the obligatory ``__init__.py`` to define the plugin metadata:
es: Primero, el ``__init__.py`` obligatorio para definir los metadatos del complemento:

en: The only noteworthy feature is the field :attr:`actual_plugin`. Since calibre has both command line and GUI interfaces, GUI plugins like this one should not load any GUI libraries in __init__.py. The actual_plugin field does this for you, by telling calibre that the actual plugin is to be found in another file inside your ZIP archive, which will only be loaded in a GUI context.
es: La única característica notable es el campo :attr:`actual_plugin`. Puesto que calibre posee tanto una interfaz gráfica como de línea de órdenes, los complementos con interfaz gráfica como éste no cargan ninguna biblioteca gráfica en __init__.py. El campo actual_plugin se encargad de esto, informando a calibre de que el complemento real se encuentra en otro archivo dentro del archivo ZIP, que sólo se cargará en un contexto de interfaz gráfica.

en: Remember that for this to work, you must have a plugin-import-name-some_name.txt file in your plugin ZIP file, as discussed above.
es: Recuerde que para que esto funcione, debe tener un archivo plugin-import-name-some_name.txt en el archivo ZIP del complemento, como se discutió anteriormente.

en: Also there are a couple of methods for enabling user configuration of the plugin. These are discussed below.
es: También hay un par de métodos para permitir la configuración por parte del usuario del complemento. Éstos se discuten más adelante.

en: Now let's look at ui.py which defines the actual GUI plugin. The source code is heavily commented and should be self explanatory:
es: Veamos ahora ui.py, que define la interfaz gráfica del complemento. El código fuente está explícitamente comentado y se explica por sí mismo:

en: The actual logic to implement the Interface Plugin Demo dialog.
es: El código que implementa el cuadro de diálogo «Interface Plugin Demo».

en: Getting resources from the plugin ZIP file
es: Obtener recursos del archivo ZIP del complemento

en: calibre's plugin loading system defines a couple of built-in functions that allow you to conveniently get files from the plugin ZIP file.
es: El sistema de carga de complementos de calibre tiene predefinidas un par de funciones que permiten obtener archivos desde el archivo ZIP del complemento de manera práctica.

en: **get_resources(name_or_list_of_names)**
es: **get_resources(nombre_o_lista_de_nombres)**

en: This function should be called with a list of paths to files inside the ZIP file. For example to access the file :file:`icon.png` in the folder images in the ZIP file, you would use: ``images/icon.png``. Always use a forward slash as the path separator, even on Windows. When you pass in a single name, the function will return the raw bytes of that file or None if the name was not found in the ZIP file. If you pass in more than one name then it returns a dictionary mapping the names to bytes.  If a name is not found, it will not be present in the returned dictionary.
es: Esta función debe ejecutarse con una lista de rutas de acceso a archivos dentro del archivo ZIP. Por ejemplo, para acceder al archivo :file:`icon.png` en la carpeta :file:`images` del archivo ZIP, utilizaría: ``images/icon.png``. Use siempre una barra inclinada a la derecha como separador de ruta, incluso en windows. Cuando se pasa un solo nombre, la función devolverá los bytes en bruto de ese archivo o None si el nombre no se encuentra en el archivo ZIP. Si se pasa más de un nombre, entonces devuelve un diccionario de mapeo de nombres a bytes. Si no se encuentra un nombre, no estará presente en el diccionario devuelto.

en: **get_icons(name_or_list_of_names, plugin_name='')**
es: **get_icons(nombre_o_lista_de_nombres, nombre_de_complemento)**

en: A wrapper for get_resources() that creates QIcon objects from the raw bytes returned by get_resources. If a name is not found in the ZIP file the corresponding QIcon will be null. In order to support icon theme-ing, pass in the human friendly name of your plugin as ``plugin_name``. If the user is using an icon theme with icons for your plugin, they will be loaded preferentially.
es: Una extensión de get_resources() que crea objetos QIcon a partir de los bytes en bruto devueltos por get_resources. Si un nombre no se encuentra en el archivo ZIP, el correspondiente QIcon será nulo. Para permitir el uso de temas de iconos, pase el nombre «para humanos» del complemento como ``nombre de complemento``. Si el usuario está usando un tema de iconos con iconos para el complemento, se usarán éstos de manera preferente.

en: Enabling user configuration of your plugin
es: Habilitar la configuración de usuario para el complemento

en: To allow users to configure your plugin, you must define three methods in your base plugin class, **is_customizable**, **config_widget** and **save_settings** as shown below:
es: Para permitir a los usuarios configurar el complemento, debe definir tres métodos en la clase base del complemento, **is_customizable**, **config_widget** y **save_settings** como se muestra a continuación:

en: calibre has many different ways to store configuration data (a legacy of its long history). The recommended way is to use the **JSONConfig** class, which stores your configuration information in a .json file.
es: calibre tiene muchas maneras diferentes de almacenar los datos de configuración (un legado de su larga historia). El método recomendado es usar la clase **JSONConfig**, que almacena la información de configuración en un archivo .json.

en: The code to manage configuration data in the demo plugin is in config.py:
es: El código para gestionar los datos de configuración en el complemento de demostración está en config.py:

en: The ``prefs`` object is now available throughout the plugin code by a simple::
es: El objeto ``prefs`` está ahora disponible en todo el código del complemento simplemente con::

en: You can see the ``prefs`` object being used in main.py:
es: Puede observar que el objeto ``prefs`` se usa en main.py:

en: Edit book plugins
es: Complementos para modificar libros

en: Now let's change gears for a bit and look at creating a plugin to add tools to the calibre book editor. The plugin is available here: :download_file:`editor_demo_plugin.zip`.
es: Vamos a cambiar de tercio y enfocarnos en la creación de un complemento para añadir herramientas al editor de libros de calibre. El complemento está disponible aquí: :download_file:`editor_demo_plugin.zip`.

en: The first step, as for all plugins is to create the import name empty txt file, as described :ref:`above <import_name_txt>`. We shall name the file ``plugin-import-name-editor_plugin_demo.txt``.
es: El primer paso, como para todos los complementos es crear el archivo vacío con el nombre de importación descrito :ref:`anteriormente <import_name_txt>`. Vamos a nombrar el archivo ``plugin-import-name-editor_plugin_demo.txt``.

en: Now we create the mandatory ``__init__.py`` file that contains metadata about the plugin -- its name, author, version, etc.
es: Ahora creamos el archivo obligatorio ``__init__.py`` que contiene los metadatos del complemento: nombre, autor, versión, etc.

en: A single editor plugin can provide multiple tools each tool corresponds to a single button in the toolbar and entry in the :guilabel:`Plugins` menu in the editor. These can have sub-menus in case the tool has multiple related actions.
es: Un solo complemento del editor puede proporcionar múltiples herramientas; cada herramienta corresponde a un único botón en la barra de herramientas y entrada en el menú :guilabel:`Complementos` del editor. Éstos pueden tener submenús en el caso de que la herramienta posea múltiples acciones relacionadas.

en: The tools must all be defined in the file ``main.py`` in your plugin. Every tool is a class that inherits from the :class:`calibre.gui2.tweak_book.plugin.Tool` class. Let's look at ``main.py`` from the demo plugin, the source code is heavily commented and should be self-explanatory. Read the API documents of the :class:`calibre.gui2.tweak_book.plugin.Tool` class for more details.
es: Todas las herramientas deben estar definidas en el archivo ``main.py`` del complemento. Cada herramienta es una clase que hereda de la clase :class:`calibre.gui2.tweak_book.plugin.Tool`. Echemos un vistazo al ``main.py`` del complemento de demostración; el código fuente está profusamente comentado y se explica por sí mismo. Lea la documentación de la API de la clase  :clase:`calibre.gui2.tweak_book.plugin.Tool` para más detalles.

en: Here we will see the definition of a single tool that will multiply all font sizes in the book by a number provided by the user. This tool demonstrates various important concepts that you will need in developing your own plugins, so you should read the (heavily commented) source code carefully.
es: Aquí veremos la definición de una herramienta que multiplicará todos los tamaños de letra en el libro por un número proporcionado por el usuario. Esta herramienta demuestra varios conceptos importantes que se necesitarán para desarrollar otros complementos, por lo que debe leer el código fuente (muy comentado) cuidadosamente.

en: Let's break down ``main.py``. We see that it defines a single tool, named *Magnify fonts*. This tool will ask the user for a number and multiply all font sizes in the book by that number.
es: Vamos a analizar ``main.py``. Vemos que define una única herramienta, llamada *Magnify fonts*. Esta herramienta le pediráá al usuario un número y multiplicará todos los tamaños de letra en el libro por dicho número.

en: The first important thing is the tool name which you must set to some relatively unique string as it will be used as the key for this tool.
es: La primera cosa importante es el nombre de la herramienta que debe establecer a algún texto relativamente único, ya que se utilizará como clave para esta herramienta.

en: The next important entry point is the :meth:`calibre.gui2.tweak_book.plugin.Tool.create_action`. This method creates the QAction objects that appear in the plugins toolbar and plugin menu. It also, optionally, assigns a keyboard shortcut that the user can customize. The triggered signal from the QAction is connected to the ask_user() method that asks the user for the font size multiplier, and then runs the magnification code.
es: El siguiente punto de entrada importante es :meth:`calibre.gui2.tweak_book.plugin.Tool.create_action`. Este método crea los objetos QAction que aparecen en la barra de herramientas y en el menú de complementos. También, opcionalmente, asigna un atajo de teclado que el usuario puede personalizar. La señal que se genera en el objeto QAction está conectada con el método ask_user() que pide al usuario el multiplicador del tamaño de letra, y luego ejecuta el código de ampliación.

en: The magnification code is well commented and fairly simple. The main things to note are that you get a reference to the editor window as ``self.gui`` and the editor *Boss* as ``self.boss``. The *Boss* is the object that controls the editor user interface. It has many useful methods, that are documented in the :class:`calibre.gui2.tweak_book.boss.Boss` class.
es: El código de aumento está bien comentado y es bastante simple. Lo principal que hay que destacar es que se obtiene una referencia a la ventana del editor como ``self.gui`` y al *Boss* del editor como ``self.boss``. El *Boss* es el objeto que controla la interfaz de usuario del editor. Tiene muchos métodos útiles, que se documentan en la clase :class:`calibre.gui2.tweak_book.boss.Boss`.

en: Finally, there is ``self.current_container`` which is a reference to the book being edited as a :class:`calibre.ebooks.oeb.polish.container.Container` object. This represents the book as a collection of its constituent HTML/CSS/image files and has convenience methods for doing many useful things. The container object and various useful utility functions that can be reused in your plugin code are documented in :ref:`polish_api`.
es: Finalmente está ``self.current_container``, que es una referencia al libro que se está editando como un objeto :class:`calibre.ebooks.oeb.polish.container.Container`. Éste representa el libro como una colección de archivos HTML, CSS e imágenes y posee diversos métodos prácticos para hacer varias cosas útiles. El objeto contenedor y varias funciones utilitarias que se pueden reutilizar en el código de los complementos están documentados en :ref:`polish_api`.

en: Adding translations to your plugin
es: Añadir traducciones al complemento

en: You can have all the user interface strings in your plugin translated and displayed in whatever language is set for the main calibre user interface.
es: Puede traducir todos los textos de la interfaz de usuario del complemento y mostrarlos en el idioma en que está configurada la interfaz principal de calibre.

en: The first step is to go through your plugin's source code and mark all user visible strings as translatable, by surrounding them in _(). For example::
es: El primer paso es ir al código fuente del complemento y marcar todos los textos visibles por el usuario como traducibles, encerrándolos con _(). Por ejemplo::

en: Then use some program to generate .po files from your plugin source code. There should be one .po file for every language you want to translate into. For example: de.po for German, fr.po for French and so on. You can use the `Poedit <https://poedit.net/>`_ program for this.
es: Después utilice algún programa para generar archivos .po para el código fuente del complemento. Debe haber un archivo .po para cada idioma al que lo quiera traducir. Por ejemplo: de.po para el alemán, fr.po para el francés, etc. Puede utilizar el programa `Poedit <https://poedit.net/>`_ para esto.

en: Send these .po files to your translators. Once you get them back, compile them into .mo files. You can again use Poedit for that, or just do::
es: Envíe estos archivos .po a los traductores. Cuando reciba los archivos traducidos, compílelos en archivos .mo. Puede utilizar nuevamente Poedit para ello, o simplemente ejecutar::

en: Put the .mo files into the ``translations`` folder in your plugin.
es: Ponga los archivos .mo en la carpeta ``translations`` del complemento.

en: The last step is to simply call the function `load_translations()` at the top of your plugin's .py files. For performance reasons you should only call this function in those .py files that actually have translatable strings. So in a typical User Interface plugin you would call it at the top of ``ui.py`` but not ``__init__.py``.
es: El último paso es simplemente ejecutar la función `load_translations()` al principio de los archivos .py del complemento. Por motivos de rendimiento, sólo debe llamar a esta función en aquellos archivos .py que realmente poseen textos traducibles. Así que en un complemento de interfaz de usuario típico, la ejecutaría en ``ui.py`` pero no en ``__init__.py``.

en: You can test the translations of your plugins by changing the user interface language in calibre under :guilabel:`Preferences->Interface->Look & feel` or by running calibre with the ``CALIBRE_OVERRIDE_LANG`` environment variable set. For example::
es: Puede probar las traducciones del complemento cambiando el idioma de la interfaz de usuario en calibre bajo :guilabel:`Preferencias > Interfaz > Apariencia` o ejecutando calibre con la variable de entorno ``CALIBRE_OVERRIDE_LANG`` establecida. Por ejemplo::

en: Replace ``de`` with the language code of the language you want to test.
es: Sustituya ``de`` por el código del idioma que desea probar.

en: For translations with plurals, use the ``ngettext()`` function instead of ``_()``. For example::
es: Para traducciones con plurales, use la función ``ngettext()`` en lugar de ``_()``. Por ejemplo::

en: The plugin API
es: La API del complemento

en: As you may have noticed above, a plugin in calibre is a class. There are different classes for the different types of plugins in calibre. Details on each class, including the base class of all plugins can be found in :ref:`plugins`.
es: Como ya se habrá dado cuenta, un complemento en calibre es una clase. Hay diferentes clases para los diferentes tipos de complementos en calibre. Los detalles de cada clase, incluyendo la clase base de todos los complementos, se pueden encontrar en :ref:`plugins`.

en: Your plugin is almost certainly going to use code from calibre. To learn how to find various bits of functionality in the calibre code base, read the section on the calibre :ref:`code_layout`.
es: Es casi seguro que el complemento va a usar el código de calibre. Para saber cómo encontrar los distintos elementos de funcionalidad en el código base de calibre, lea la sección :ref:`code_layout`.

en: Debugging plugins
es: Depurar complementos

en: The first, most important step is to run calibre in debug mode. You can do this from the command line with::
es: El primer paso, el más importante, es ejecutar calibre en modo de depuración. Puede hacer esto desde la línea de órdenes con::

en: Or from within calibre by right-clicking the :guilabel:`Preferences` button or using the :kbd:`Ctrl+Shift+R` keyboard shortcut.
es: O desde el mismo calibre, pulsando con el botón derecho en :guilabel:`Preferencias` o usando el atajo de teclado :kbd:`Ctrl+Mayús+R`.

en: When running from the command line, debug output will be printed to the console, when running from within calibre the output will go to a txt file.
es: Cuando se ejecuta desde la línea de órdenes, la salida de depuración se enviará a la consola, si se ejecuta dentro de calibre, la salida irá a un archivo txt.

en: You can insert print statements anywhere in your plugin code, they will be output in debug mode. Remember, this is Python, you really shouldn't need anything more than print statements to debug ;) I developed all of calibre using just this debugging technique.
es: Puede insertar sentencias de impresión en cualquier lugar en el código fuente del complemento, tendrán efecto en el modo de depuración. Recuerde, esto es Python, no debe necesitar más que sentencias de impresión para depurar ;) He desarrollado todo calibre usando sólo esta técnica de depuración.

en: You can quickly test changes to your plugin by using the following command line::
es: Puede probar rápidamente los cambios en el complemento con la siguiente orden::

en: This will shutdown a running calibre, wait for the shutdown to complete, then update your plugin in calibre and relaunch calibre.
es: Esto cerrará calibre, esperará hasta que se cierre completamente, después actualiza el complemento en calibre y vuelve a iniciar calibre.

en: More plugin examples
es: Más ejemplos de complementos

en: You can find a list of many sophisticated calibre plugins `here <https://www.mobileread.com/forums/showthread.php?t=118764>`_.
es: Puede encontrar una lista de muchos complementos de calibre más complejos `aqui <https://www.mobileread.com/forums/showthread.php?t=118764>`_.

en: Sharing your plugins with others
es: Compartir sus complementos con otros

en: If you would like to share the plugins you have created with other users of calibre, post your plugin in a new thread in the `calibre plugins forum <https://www.mobileread.com/forums/forumdisplay.php?f=237>`_.
es: Si desea compartir los complementos que ha creado con otros usuarios de calibre, inicie un nuevo hilo adjuntando el complemento en el `foros de complementos de calibre <https://www.mobileread.com/forums/forumdisplay.php?f=237>`_ (en inglés).
