calibre - en to it translation catalogue (80 entries)

en: Writing your own plugins to extend calibre's functionality
it: Scrivere i propri plugin per estendere le funzionalità di 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`.
it: calibre ha una struttura estremamente modulare. Quasi tutte le funzionalità di calibre agiscono sotto forma di plugin. Dei plugin sono usati per le conversioni, per scaricare le notizie (sebbene questi siano chiamati ricette), per molte componenti dell'interfaccia utente, per connettersi a svariati dispositivi, per elaborare i file aggiunti a calibre e così via. Puoi ottenere una lista completa dei plugin inclusi in calibre andando in :guilabel:`Preferenze->Avanzate->Plugin`.

en: Here, we will teach you how to create your own plugins to add new features to calibre.
it: Qui, ti insegneremo come creare i tuoi plugin per aggiungere nuove funzioni a calibre.

en: Contents
it: Contenuti

en: This only applies to calibre releases >= 0.8.60
it: Si applica solo alle versioni di calibre >= 0.8.60

en: Anatomy of a calibre plugin
it: Anatomia di un plugin di 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.
it: Un plugin di calibre è molto semplice, è solo un file ZIP che contiene del codice in Python e qualsiasi altra risorsa necessaria al plugin, come le immagini. Senza indugiare oltre, vediamo un semplice esempio.

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:
it: Immagina di avere un'installazione di calibre che usi per l'autopubblicazione di vari documenti elettronici nei formati EPUB e MOBI. Vorresti fare in modo che tutti i file generati da calibre avessero "Hello world" impostato come editore, ecco il modo di farlo. Crea un file con il nome :file:`__init__.py` (questo è un nome speciale che deve sempre essere usato per il file principale del tuo plugin) e inseriscivi il seguente codice Python:

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`::
it: Questo è tutto. Per aggiungere questo codice a calibre come plugin, devi solo eseguire il comando che segue nella cartella in cui hai creato :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/`.
it: In macOS, gli strumenti da linea di comando si trovano dentro il bundle di calibre, per esempio, se hai installato calibre in :file:`/Applications` gli strumenti si trovano in :file:`/Applications/calibre.app/Contents/MacOS/`.

en: You can download the Hello World plugin from :download_file:`helloworld_plugin.zip`.
it: Puoi scaricare il plugin Hello World da :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.
it: Ogni volta che usi calibre per convertire un libro il metodo :meth:`run` del plugin sarà chiamato, e il libro convertito vedrà il suo editore impostato a "Hello World". Questo è un plugin molto semplice, passiamo a un esempio più complesso che aggiunge realmente un componente all'interfaccia utente.

en: A User Interface plugin
it: Un plugin dell'interfaccia utente

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.
it: Questo plugin sarà distribuito in pochi file (per mantenere il codice pulito). Vi mostrerà come ottenere risorse (immagini o file di dati) dal file ZIP del plugin, come consentire agli utenti di configurare il plugin, come creare elementi nell'interfaccia utente di calibre e come accedere e interrogare il database dei libri in Calibre.

en: You can download this plugin from :download_file:`interface_demo_plugin.zip`
it: Il plugin può essere scaricato da :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``.
it: La prima cosa da notare è che questo file ZIP contiene molti altri file, spiegati di seguito; prestate particolare attenzione 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::
it: Un file di testo vuoto usato per abilitare la magia dei plugin multi-file. Questo file deve essere presente in tutti i plugin che utilizzano più di un file .py. Deve essere vuoto e il suo nome deve essere della forma: ``plugin-import-name-**some_name**.txt``. La presenza di questo file consente di importare codice dai file .py presenti all'interno del file ZIP, utilizzando un'istruzione del tipo::

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".
it: Il prefisso ``calibre_plugins'' deve essere sempre presente. ``some_name`` proviene dal nome del file di testo vuoto. ``some_module`` si riferisce al file :file:`some_module.py` all'interno del file ZIP. Si noti che questa importazione è altrettanto potente delle normali importazioni di Python. Si possono creare pacchetti e sottopacchetti di moduli .py all'interno del file ZIP, proprio come si farebbe normalmente (defining __init__.py in ogni sottocartella) e tutto dovrebbe "funzionare".

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).
it: Il nome che si usa per ``some_name'' entra in uno spazio dei nomi globale condiviso da tutti i plugin, **quindi deve essere il più unico possibile**. Ma ricordate che deve essere un identificatore Python valido (solo alfabeti, numeri e trattino basso).

en: As before, the file that defines the plugin class
it: Come in precedenza, il file che definisce la classe del plugin

en: This file contains the actual code that does something useful
it: Questo file contiene il codice vero e proprio che fa qualcosa di utile

en: This file defines the interface part of the plugin
it: Questo file definisce la parte dell'interfaccia del plugin

en: The icon for this plugin
it: L'icona per questo plugin

en: A text file with information about the plugin
it: File di testo con informazioni sul plugin

en: **translations**
it: **traduzioni**

en: A folder containing .mo files with the translations of the user interface of your plugin into different languages. See below for details.
it: La cartella contiene file .mo con l'interfaccia utente del tuo plugin tradotta in diverse lingue. Guarda più in basso per i dettagli.

en: Now let's look at the code.
it: Ora diamo un'occhiata al codice.

en: First, the obligatory ``__init__.py`` to define the plugin metadata:
it: Innanzitutto, l'obbligatorio ``__init__.py`` per definire i metadati del plugin:

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.
it: L'unica caratteristica degna di nota è il campo :attr:`actual_plugin`. Poiché calibre ha sia un'interfaccia a riga di comando che una GUI, i plugin GUI come questo non dovrebbero caricare alcuna libreria GUI in __init__.py. Il campo actual_plugin fa questo per voi, dicendo a calibre che il plugin vero e proprio si trova in un altro file all'interno dell'archivio ZIP, che verrà caricato solo in un contesto GUI.

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.
it: Ricordare che, per funzionare, è necessario avere un file plugin-import-name-some_name.txt nel file ZIP del plugin, come discusso in precedenza.

en: Also there are a couple of methods for enabling user configuration of the plugin. These are discussed below.
it: Esistono inoltre un paio di metodi per abilitare la configurazione del plugin da parte dell'utente. Questi sono discussi di seguito.

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:
it: Ora diamo un'occhiata a ui.py, che definisce il plugin GUI vero e proprio. Il codice sorgente è pesantemente commentato e dovrebbe essere autoesplicativo:

en: The actual logic to implement the Interface Plugin Demo dialog.
it: La logica effettiva per implementare la finestra di dialogo Demo del plugin di interfaccia.

en: Getting resources from the plugin ZIP file
it: Ottenere le risorse dal file ZIP del plugin

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.
it: Il sistema di caricamento dei plugin di Calibre definisce un paio di funzioni integrate che consentono di ottenere comodamente i file dal file ZIP del plugin.

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.
it: Questa funzione deve essere chiamata con un elenco di percorsi dei file all'interno del file ZIP. Ad esempio, per accedere al file :file:`icon.png` nella cartella images del file ZIP, si deve usare: ``images/icon.png``. Usare sempre una barra in avanti come separatore di percorso, anche su Windows. Quando si passa un solo nome, la funzione restituisce i byte grezzi di quel file o Nessuno se il nome non è stato trovato nel file ZIP. Se si inserisce più di un nome, la funzione restituisce un dizionario che mappa i nomi in byte. Se un nome non viene trovato, non sarà presente nel dizionario restituito.

en: **get_icons(name_or_list_of_names, plugin_name='')**
it: **get_icons(nome_o_lista_di_nomi, nome_plugin='')**

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.
it: Un wrapper per get_resources() che crea oggetti QIcon dai byte grezzi restituiti da get_resources. Se un nome non viene trovato nel file ZIP, la QIcon corrispondente sarà nulla. Per supportare la tematizzazione delle icone, passare il nome umano del plugin come ``plugin_name``. Se l'utente utilizza un tema di icone con icone per il plugin, queste verranno caricate in modo preferenziale.

en: Enabling user configuration of your plugin
it: Abilitazione della configurazione del plugin da parte dell'utente

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:
it: Per consentire agli utenti di configurare il plugin, è necessario definire tre metodi nella classe base del plugin, **is_customizable**, **config_widget** e **save_settings**, come mostrato di seguito:

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.
it: Calibre ha molti modi diversi per memorizzare i dati di configurazione (un'eredità della sua lunga storia). Il modo consigliato è quello di usare la classe **JSONConfig**, che memorizza le informazioni di configurazione in un file .json.

en: The code to manage configuration data in the demo plugin is in config.py:
it: Il codice per gestire i dati di configurazione nel plugin demo si trova in config.py:

en: The ``prefs`` object is now available throughout the plugin code by a simple::
it: L'oggetto ``prefs'' è ora disponibile in tutto il codice del plugin tramite un semplice::

en: You can see the ``prefs`` object being used in main.py:
it: Si può vedere l'oggetto ``prefs'' utilizzato in main.py:

en: Edit book plugins
it: Modifica dei plugin del libro

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`.
it: Ora cambiamo un po' marcia e vediamo di creare un plugin per aggiungere strumenti all'editor di libri di Calibre. Il plugin è disponibile qui: :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``.
it: Il primo passo, come per tutti i plugin, è creare il file txt vuoto con il nome dell'importazione, come descritto :ref:` sopra<import_name_txt>. Chiameremo il file ``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.
it: Ora creiamo il file obbligatorio ``__init__.py`` che contiene i metadati sul plugin: il suo nome, l'autore, la versione, ecc.

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.
it: Un singolo plugin dell'editor può fornire più strumenti, ciascuno dei quali corrisponde a un singolo pulsante nella barra degli strumenti e a una voce nel menu :guilabel:`Plugins` dell'editor. Questi possono avere dei sottomenu nel caso in cui lo strumento abbia più azioni correlate.

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.
it: Gli strumenti devono essere tutti definiti nel file ``main.py`` del plugin. Ogni strumento è una classe che eredita dalla classe :class:`calibre.gui2.tweak_book.plugin.Tool`. Diamo un'occhiata a ``main.py`` del plugin demo; il codice sorgente è pesantemente commentato e dovrebbe essere autoesplicativo. Per maggiori dettagli, leggete i documenti API della classe :class:`calibre.gui2.tweak_book.plugin.Tool`.

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.
it: Qui vedremo la definizione di un singolo strumento che moltiplica tutte le dimensioni dei caratteri del libro per un numero fornito dall'utente. Questo strumento dimostra vari concetti importanti che vi serviranno per sviluppare i vostri plugin, quindi dovreste leggere attentamente il codice sorgente (pesantemente commentato).

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.
it: Analizziamo ``main.py``. Vediamo che definisce un singolo strumento, chiamato *Magnify fonts*. Questo strumento chiede all'utente un numero e moltiplica tutte le dimensioni dei caratteri nel libro per quel numero.

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.
it: La prima cosa importante è il nome dello strumento, che deve essere impostato con una stringa relativamente unica, in quanto verrà utilizzato come chiave per questo strumento.

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.
it: Il prossimo punto di ingresso importante è il metodo :meth:`calibre.gui2.tweak_book.plugin.Tool.create_action`. Questo metodo crea gli oggetti QAction che appaiono nella barra degli strumenti e nel menu del plugin. Inoltre, opzionalmente, assegna una scorciatoia da tastiera che l'utente può personalizzare. Il segnale di attivazione della QAction è collegato al metodo ask_user() che chiede all'utente il moltiplicatore della dimensione del carattere e poi esegue il codice di ingrandimento.

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.
it: Il codice dell'ingrandimento è ben commentato e abbastanza semplice. Le cose principali da notare sono che si ottiene un riferimento alla finestra dell'editor come ``self.gui`` e all'editor *Boss* come ``self.boss``. Il *Boss* è l'oggetto che controlla l'interfaccia utente dell'editor. Ha molti metodi utili, documentati nella classe :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`.
it: Infine, c'è ``self.current_container`` che è un riferimento al libro che si sta editando come oggetto :class:`calibre.ebooks.oeb.polish.container.Container`. Questo rappresenta il libro come un insieme di file HTML/CSS/immagine che lo compongono e dispone di metodi di utilità per fare molte cose utili. L'oggetto container e le varie funzioni di utilità che possono essere riutilizzate nel codice del plugin sono documentate in :ref:`polish_api`.

en: Adding translations to your plugin
it: Aggiungi traduzione al tuo plugin

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.
it: È possibile far tradurre tutte le stringhe dell'interfaccia utente del plugin e visualizzarle nella lingua impostata per l'interfaccia utente principale di 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::
it: Il primo passo consiste nell'esaminare il codice sorgente del plugin e contrassegnare tutte le stringhe visibili dall'utente come traducibili, circondandole con _(). Ad esempio::

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.
it: Quindi utilizzare un programma per generare file .po dal codice sorgente del plugin. Dovrebbe esserci un file .po per ogni lingua in cui si vuole tradurre. Per esempio: de.po per il tedesco, fr.po per il francese e così via. Si può usare il programma `Poedit <https://poedit.net/>`_ per questo.

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::
it: Inviate questi file .po ai vostri traduttori. Una volta ricevuti, compilateli in file .mo. A tale scopo si può usare Poedit o semplicemente fare::

en: Put the .mo files into the ``translations`` folder in your plugin.
it: Mettere i file .mo nella cartella ``translations`` del plugin.

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``.
it: L'ultimo passo consiste nel chiamare la funzione `caricare_traduzioni()` all'inizio dei file .py del plugin. Per ragioni di prestazioni, si dovrebbe chiamare questa funzione solo nei file .py che hanno effettivamente stringhe traducibili. Quindi, in un tipico plugin di interfaccia utente, la si dovrebbe chiamare all'inizio di ``ui.py``, ma non di ``__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::
it: È possibile verificare le traduzioni dei propri plugin cambiando la lingua dell'interfaccia utente in calibre sotto :guilabel:`Preferences->Interface->Look & feel` o eseguendo calibre con la variabile d'ambiente ``CALIBRE_OVERRIDE_LANG``. Per esempio::

en: Replace ``de`` with the language code of the language you want to test.
it: Sostituire ``de'' con il codice della lingua che si vuole testare.

en: For translations with plurals, use the ``ngettext()`` function instead of ``_()``. For example::
it: Per le traduzioni con i plurali, utilizzare la funzione ``ngettext()`` invece di ``_()``. Ad esempio::

en: The plugin API
it: API del plugin

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`.
it: Come avrete notato sopra, un plugin in Calibre è una classe. Esistono diverse classi per i diversi tipi di plugin in Calibre. I dettagli su ciascuna classe, compresa la classe base di tutti i plugin, si trovano in :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`.
it: Il vostro plugin utilizzerà quasi certamente del codice di Calibre. Per sapere come trovare varie funzionalità nella base di codice di Calibre, leggere la sezione sul :ref:`code_layout` di Calibre.

en: Debugging plugins
it: Debug dei plugin

en: The first, most important step is to run calibre in debug mode. You can do this from the command line with::
it: Il primo passo, il più importante, è quello di eseguire Calibre in modalità debug. È possibile farlo dalla riga di comando con::

en: Or from within calibre by right-clicking the :guilabel:`Preferences` button or using the :kbd:`Ctrl+Shift+R` keyboard shortcut.
it: Oppure dall'interno di Calibre facendo clic con il tasto destro del mouse sul pulsante :guilabel:`Preferences` o usando la scorciatoia da tastiera :kbd:`Ctrl+Shift+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.
it: Quando si esegue dalla riga di comando, l'output di debug viene stampato sulla console, mentre quando si esegue dall'interno di Calibre l'output viene inviato a un file 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.
it: Si possono inserire dichiarazioni di stampa in qualsiasi punto del codice del plugin, che verranno emesse in modalità di debug. Ricordate, questo è Python, non dovrebbe essere necessario altro che dichiarazioni di stampa per il debug ;) Ho sviluppato tutto Calibre utilizzando proprio questa tecnica di debug.

en: You can quickly test changes to your plugin by using the following command line::
it: È possibile testare rapidamente le modifiche apportate al plugin utilizzando la seguente riga di comando::

en: This will shutdown a running calibre, wait for the shutdown to complete, then update your plugin in calibre and relaunch calibre.
it: In questo modo si spegne un Calibre in esecuzione, si attende il completamento dello spegnimento, quindi si aggiorna il plugin in Calibre e si rilancia Calibre.

en: More plugin examples
it: Più esempi di plugin

en: You can find a list of many sophisticated calibre plugins `here <https://www.mobileread.com/forums/showthread.php?t=118764>`_.
it: È possibile trovare un elenco di molti sofisticati plugin di Calibre `qui <https://www.mobileread.com/forums/showthread.php?t=118764>`_.

en: Sharing your plugins with others
it: Condividi i tuoi plugin con gli altri

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>`_.
it: Se vuoi condividere i plugin che hai creato con altri utenti di Calibre, posta il tuo plugin in un nuovo thread nel `calibre plugins forum <https://www.mobileread.com/forums/forumdisplay.php?f=237>`_.
