Add localization support (borrowed from Calibre2OPDS)

This commit is contained in:
Sébastien Lucas 2012-05-29 20:10:41 +02:00
parent 656d2e67cc
commit e30513b0b3
12 changed files with 1011 additions and 25 deletions

7
README
View file

@ -98,6 +98,13 @@ On the OPDS client side I mainly tested with FBReader and Aldiko on Android.
It also seems to work with Stanza.
= Credits =
* All localization informations come from Calibre2OPDS (http://calibre2opds.com/)
* Locale message handling is inspired of http://www.mind-it.info/2010/02/22/a-simple-approach-to-localization-in-php/
* str_format function come from http://tmont.com/blargh/2010/1/string-format-in-php
* All testers
= Copyright & License =
COPS - 2012 (c) Sébastien Lucas <sebastien@slucas.fr>

View file

@ -31,8 +31,8 @@ class Author extends Base {
public static function getCount() {
$nAuthors = parent::getDb ()->query('select count(*) from authors')->fetchColumn();
$entry = new Entry ("Authors", self::ALL_AUTHORS_ID,
"Alphabetical index of the $nAuthors authors", "text",
$entry = new Entry (localize("authors.title"), self::ALL_AUTHORS_ID,
str_format (localize("authors.alphabetical"), $nAuthors), "text",
array ( new LinkNavigation ("?page=".parent::PAGE_ALL_AUTHORS)));
return $entry;
}
@ -48,7 +48,7 @@ order by sort');
{
$author = new Author ($post->id, $post->sort);
array_push ($entryArray, new Entry ($post->sort, $author->getEntryId (),
"$post->count books", "text",
str_format (localize("bookword.many"), $post->count), "text",
array ( new LinkNavigation ($author->getUri ()))));
}
return $entryArray;

View file

@ -13,6 +13,56 @@ function getURLParam ($name, $default = NULL) {
return $default;
}
/**
* This method is a direct copy-paste from
* http://tmont.com/blargh/2010/1/string-format-in-php
*/
function str_format($format) {
$args = func_get_args();
$format = array_shift($args);
preg_match_all('/(?=\{)\{(\d+)\}(?!\})/', $format, $matches, PREG_OFFSET_CAPTURE);
$offset = 0;
foreach ($matches[1] as $data) {
$i = $data[0];
$format = substr_replace($format, @$args[$i], $offset + $data[1] - 1, 2 + strlen($i));
$offset += strlen(@$args[$i]) - 2 - strlen($i);
}
return $format;
}
/**
* This method is based on this page
* http://www.mind-it.info/2010/02/22/a-simple-approach-to-localization-in-php/
*/
function localize($phrase) {
/* Static keyword is used to ensure the file is loaded only once */
static $translations = NULL;
/* If no instance of $translations has occured load the language file */
if (is_null($translations)) {
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
$lang_file_en = NULL;
$lang_file = 'lang/Localization_' . $lang . '.json';
if (!file_exists($lang_file)) {
$lang_file = 'lang/' . 'Localization_en.json';
}
elseif ($lang != "en") {
$lang_file_en = 'lang/' . 'Localization_en.json';
}
$lang_file_content = file_get_contents($lang_file);
/* Load the language file as a JSON object and transform it into an associative array */
$translations = json_decode($lang_file_content, true);
if ($lang_file_en)
{
$lang_file_content = file_get_contents($lang_file_en);
$translations_en = json_decode($lang_file_content, true);
$translations = array_merge ($translations_en, $translations);
}
}
return $translations[$phrase];
}
class Link
{
const OPDS_THUMBNAIL_TYPE = "http://opds-spec.org/image/thumbnail";
@ -183,7 +233,7 @@ class PageAllAuthors extends Page
{
public function InitializeContent ()
{
$this->title = "All authors";
$this->title = localize("authors.title");
$this->entryArray = Author::getAllAuthors();
$this->idPage = Author::ALL_AUTHORS_ID;
}
@ -204,7 +254,7 @@ class PageAllTags extends Page
{
public function InitializeContent ()
{
$this->title = "All tags";
$this->title = localize("tags.title");
$this->entryArray = Tag::getAllTags();
$this->idPage = Tag::ALL_TAGS_ID;
}
@ -225,7 +275,7 @@ class PageAllSeries extends Page
{
public function InitializeContent ()
{
$this->title = "All series";
$this->title = localize("series.title");
$this->entryArray = Serie::getAllSeries();
$this->idPage = Serie::ALL_SERIES_ID;
}
@ -236,7 +286,7 @@ class PageSerieDetail extends Page
public function InitializeContent ()
{
$serie = Serie::getSerieById ($this->idGet);
$this->title = "Series : " . $serie->name;
$this->title = $serie->name;
$this->entryArray = Book::getBooksBySeries ($this->idGet);
$this->idPage = $serie->getEntryId ();
}
@ -246,7 +296,7 @@ class PageAllBooks extends Page
{
public function InitializeContent ()
{
$this->title = "All books by starting letter";
$this->title = localize ("allbooks.title");
$this->entryArray = Book::getAllBooks ();
$this->idPage = Book::ALL_BOOKS_ID;
}
@ -256,7 +306,7 @@ class PageAllBooksLetter extends Page
{
public function InitializeContent ()
{
$this->title = "All books starting by " . $this->idGet;
$this->title = str_format (localize ("splitByLetter.letter"), localize ("bookword.title"), $this->idGet);
$this->entryArray = Book::getBooksByStartingLetter ($this->idGet);
$this->idPage = Book::getEntryIdByLetter ($this->idGet);
}
@ -266,7 +316,7 @@ class PageRecentBooks extends Page
{
public function InitializeContent ()
{
$this->title = "Most recent books";
$this->title = localize ("recent.title");
$this->entryArray = Book::getAllRecentBooks ();
$this->idPage = Book::ALL_RECENT_BOOKS_ID;
}
@ -276,7 +326,7 @@ class PageQueryResult extends Page
{
public function InitializeContent ()
{
$this->title = "Search result for query *" . $this->query . "*";
$this->title = "Search result for query *" . $this->query . "*"; // TODO I18N
$this->entryArray = Book::getBooksByQuery ($this->query);
}
}

View file

@ -121,7 +121,7 @@ class Book extends Base {
$addition = "";
$se = $this->getSerie ();
if (!is_null ($se)) {
$addition = $addition . "<strong>Series : </strong>Book $this->seriesIndex in $se->name<br />\n";
$addition = $addition . "<strong>" . localize("content.series") . "</strong>" . str_format (localize ("content.series.data"), $this->seriesIndex, $se->name) . "<br />\n";
}
return $addition . strip_tags ($this->comment, '<div>');
}
@ -188,12 +188,12 @@ class Book extends Base {
}
foreach ($this->getAuthors () as $author) {
array_push ($linkArray, new LinkNavigation ($author->getUri (), "related", "Other books by $author->name"));
array_push ($linkArray, new LinkNavigation ($author->getUri (), "related", str_format (localize ("bookentry.author"), localize ("splitByLetter.book.other"), $author->name)));
}
$serie = $this->getSerie ();
if (!is_null ($serie)) {
array_push ($linkArray, new LinkNavigation ($serie->getUri (), "related", "Other books by the serie $serie->name"));
array_push ($linkArray, new LinkNavigation ($serie->getUri (), "related", str_format (localize ("content.series.data"), $this->seriesIndex, $serie->name)));
}
return $linkArray;
@ -210,14 +210,14 @@ class Book extends Base {
global $config;
$nBooks = parent::getDb ()->query('select count(*) from books')->fetchColumn();
$result = array();
$entry = new Entry ("Books",
$entry = new Entry (localize ("allbooks.title"),
self::ALL_BOOKS_ID,
"Alphabetical index of the $nBooks books", "text",
str_format (localize ("allbooks.alphabetical"), $nBooks), "text",
array ( new LinkNavigation ("?page=".parent::PAGE_ALL_BOOKS)));
array_push ($result, $entry);
$entry = new Entry ("Recents books",
$entry = new Entry (localize ("recent.title"),
self::ALL_RECENT_BOOKS_ID,
"Alphabetical index of the " . $config['cops_recentbooks_limit'] . " most recent books", "text",
str_format (localize ("recent.list"), $config['cops_recentbooks_limit']), "text",
array ( new LinkNavigation ("?page=".parent::PAGE_ALL_RECENT_BOOKS)));
array_push ($result, $entry);
return $result;
@ -309,7 +309,7 @@ order by substr (upper (sort), 1, 1)");
while ($post = $result->fetchObject ())
{
array_push ($entryArray, new Entry ($post->title, Book::getEntryIdByLetter ($post->title),
"$post->count books", "text",
str_format (localize("bookword.many"), $post->count), "text",
array ( new LinkNavigation ("?page=".parent::PAGE_ALL_BOOKS_LETTER."&id=".$post->title))));
}
return $entryArray;

172
lang/Localization_de.json Normal file
View file

@ -0,0 +1,172 @@
{
"boolean.no":"nein",
"boolean.yes":"ja",
"splitByLetter.letter":"{0} unter {1}",
"home.title":"Hauptkatalog",
"link.fullentry":"Vollständiger Eintrag",
"title.nextpage":"nächste Seite ({0} von {1})",
"title.lastpage":"nächste Seite (letzte)",
"title.numberOfPages":"{0} ({1} Seiten)",
"bookword.title":"Bücher",
"bookword.none":"Kein Buch",
"bookword.one":"1 Buch",
"bookword.many":"{0} Bücher",
"authorword.title":"Autoren",
"authorword.none":"Kein Autor",
"authorword.one":"1 Autor",
"authorword.many":"{0} Autoren",
"taglevelword.title":"Schlagwortebenen",
"taglevelword.none":"Keine Schlagwortebene",
"taglevelword.one":"1 Schlagwortebene",
"taglevelword.many":"{0} Schlagwortebenen",
"seriesword.title":"Serien",
"seriesword.none":"Keine Serie",
"seriesword.one":"1 Serie",
"seriesword.many":"{0} Serien",
"tagword.title":"Schlagwörter",
"tagword.none":"Kein Schlagwort",
"tagword.one":"1 Schlagwort",
"tagword.many":"{0} Schlagwörter",
"content.tags":"Schlagwörter: ",
"content.series":"Serien: ",
"content.series.data":"Buch {0} der {1} - Reihe",
"content.publisher":"Verlag: ",
"content.publisher.data":"Veröffentlicht {1} von {0}",
"content.summary":"Inhalt: ",
"bookentry.series":"Buch {0} der {1} - Reihe",
"bookentry.author":"{0} von {1}",
"bookentry.tags":"{0} unter {1}",
"bookentry.ratings":"{0} bewertet mit {1}",
"bookentry.goodreads":"Dieses Buch bei Goodreads",
"bookentry.goodreads.review":"Rezensiere dieses Buch bei Goodreads",
"bookentry.goodreads.author":"{0} bei Goodreads",
"bookentry.wikipedia":"Dieses Buch bei Wikipedia",
"bookentry.wikipedia.author":"{0} bei Wikipedia",
"bookentry.librarything":"Dieses Buch bei LibraryThing",
"bookentry.librarything.author":"{0} bei LibraryThing",
"bookentry.amazon":"Dieses Buch bei Amazon",
"bookentry.amazon.author":"{0} bei Amazon",
"bookentry.isfdb.author":"{0} bei ISFDB",
"bookentry.download":"Lade dieses eBook als {0}",
"bookentry.rated":"{0} {1}",
"bookentry.fullentrylink":"Vollständiger Eintrag",
"tags.title":"Schlagwörter",
"tags.categorized":"Index der {0} Schlagwörter nach Kategorien",
"tags.categorized.single":"Index des Schlagworts nach Kategorien - sehr nützlich ;)",
"tags.alphabetical":"Alphabetischer Index der {0} Schlagwörter",
"tags.alphabetical.single":"Alphabetischer Index des Schlagworts ;)",
"splitByLetter.tag.other":"Andere Schlagwörter",
"authors.series.title":"Serien: {0}",
"authors.title":"Autoren",
"authors.alphabetical":"Alphabetischer Index der {0} Autoren",
"authors.alphabetical.single":"Alphabetischer Index des Autors - unglaublich nützlich ;)",
"splitByLetter.author.other":"Andere Autoren",
"series.title":"Serien",
"series.alphabetical":"Alphabetischer Index der {0} Serien",
"series.alphabetical.single":"Alphabetischer Index der Serie - äußerst nützlich ;)",
"splitByLetter.series.other":"Andere Serien",
"recent.title":"Neuzugänge",
"recent.list":"{0} neue Bücher",
"recent.list.single":"Das neueste einzige Buch - der Trend geht zum Zweitbuch ;)",
"rating.title":"Bewertung",
"rating.summary":"{0}, gruppiert nach Bewertung",
"allbooks.title":"Alle Bücher",
"allbooks.alphabetical":"Alphabetischer Index der {0} Bücher",
"allbooks.alphabetical.single":"Alphabetischer Index des einzigen Buchs - unverzichtbar ;)",
"splitByLetter.book.other":"Andere Bücher",
"main.title":"Calibre Bibliothek",
"main.summary":"{0} hat {1} katalogisierte Bücher",
"info.databasefolderset":"Das Datenbankverzeichnis wurde gesetzt",
"info.targetfolderset":"Der Zielordner wurde gesetzt",
"info.started":"Gestartet",
"info.completed":"Fertig",
"error.cannotTransform":"kann {0} nicht verarbeiten",
"error.notYetReady":"Noch nicht bereit",
"error.nodatabase":"Die Calibre Datenbank (metadata.db) kann bei {0} nicht gefunden werden",
"error.nogeneratetype":"Es wurden weder ODPS noch HTML Optionen zur Katalog-Erstellung gesetzt.",
"error.nocatalog":"Katalogverzeichnis nicht ausgewählt ",
"error.targetdoesnotexist":"Das Zielverzeichnis existiert nicht; soll es erstellt werden ?",
"error.targetsame":"Das Zielverzeichnis darf nicht identisch mit dem Datenbankverzeichnis sein",
"error.targetparent":"Das Zielverzeichnis darf das Datenbankverzeichnis nicht enthalten",
"error.noSubcatalog":"Der Katalog kann nicht erstellt werden, da alle Subsektionen abgewählt sind.",
"error.nobooks":"In der Calibre Bibliothek konnte kein Buch gefunden werden, das den Aufnahmekriterien entspricht. Ist die Liste der Formate korrekt ?",
"error.loadingThumbnail":"Fehler beim Laden der Bild-Datei {0}",
"error.savingThumbnail":"Fehler beim Speichern der Vorschaubilderdatei {0}",
"error.generatingThumbnail":"Fehler beim Erzeugen des Vorschaubilds für {0}",
"error.noPublishedDate":"Das Publikationsdatum des Buchs ist nicht gesetzt",
"error.noAddedDate":"Das Eintragsdatum des Buchs ist nicht gesetzt",
"error.loadingProperties":"Fehler beim Laden der Eigenschaften",
"error.userAbort":"Katalogerstellung abgebrochen",
"error.crashAbort":"Fürchterlicher Fehler während der Katalogerstellung. Für Details siehe Log-Datei",
"error.unexpectedFatal":"Unerwarteter grausamer Fehler während der Katalogerstellung",
"error.cause":"Ursache",
"error.message":"Nachricht",
"error.stackTrace":"Stapelrückverfolgung",
"i18n.downloads":"Downloads, Links und andere Kataloge",
"i18n.links":"Links und andere Kataloge",
"i18n.coversection":"Cover",
"i18n.downloadfile":"Download Datei",
"i18n.downloadsection":"Downloads",
"i18n.relatedsection":"Verwandte Kataloge",
"i18n.linksection":"Externe Links",
"i18n.backToMain":"Zurück zur Hauptseite des Katalogs",
"i18n.summarysection":"Zusammenfassung",
"i18n.dateGenerated":"Katalog erstellt am {0}",
"deeplevel.summary":"{0} aufgeschlüsselt nach Autoren, Schlagwörter, etc.",
"about.title":"Calibre2Opds Dokumentation",
"about.summary":"Anmerkungen zur Verwendung von Calibre2Opds",
"usage.intro":"Die Optionen werden der Konfigurationsdatei in {0} entnommen",
"intro.goal":"Erstelle OPDS und HTML Kataloge der Calibre eBooks Datenbank",
"intro.wiki.title":"Calibre2opds Projektseite:",
"intro.wiki.url":"http://calibre2opds.com",
"intro.team.title":"Das Calibre2Opds Team:",
"intro.team.list1":"David Pierron - Hauptprogrammer",
"intro.team.list2":"Dave Walker - Guru, Manager der Features und Tester der Extraklasse",
"intro.team.list3":"Farid Soussi - CSS und HTML Guru",
"intro.team.list4":"Douglas Steele - Programmierung",
"intro.team.list5":"Jane Litte - Beta Tests und moralische Unterstützung",
"intro.thanks.1":"Speziellen Dank an Kb Sriram, der nicht nur Trook, eine exzellente und OPDS kompatible ",
"intro.thanks.2":"Bibliotheksverwaltung programmierte, sondern auch einen Nook spendete !",
"info.step.started":"Beginne Katalogerstellung",
"info.step.database":"Datenbank wird geladen und gefiltert",
"info.steo.books":"Erstelle Bucheinträge",
"info.step.tags":"Erstelle Schlagwortkatalog",
"info.step.authors":"Erstelle Autorenkatalog",
"info.step.series":"Erstelle Serienkatalog",
"info.step.recent":"Erstelle Katalog für Neuzugänge",
"info.step.rated":"Erstelle Bewertungskatalog",
"info.step.allbooks":"Erstelle Katalog aller Bücher",
"info.step.covers":"Erstelle Cover Dateien",
"info.step.index":"Erstelle Suchindex",
"info.step.reprocessingEpubMetadata":"Bearbeite ePub Metadaten",
"info.step.thumbnails":"Erstelle Vorschaubilder",
"info.step.copycat":"Katalog kopieren",
"info.step.copylib":"Bibliothek kopieren",
"info.step.donein":"Erledigt in {0} Millisekunden",
"info.thumbnails.donein":"{0} Sekunden zur Erzeugung der Vorschaubilder benötigt",
"info.html.donein":"{0} Sekunden zur Erzeugung der HTML Kataloge benötigt",
"info.step.done":"{0} enthält nun die Kataloge",
"info.step.done.gui":"Kataloge wurden erstellt",
"info.step.done.nook":"Dein Nook",
"info.step.done.andYourDb":" und dein Calibreverzeichnis",
"info.step.tidyingtarget":"Nicht mehr benötigte Dateien im Zielverzeichnis werden entfernt",
"info.step.deletingfiles":"Temporäre Dateien werden gelöscht",
"info.step.loadingcache":"Lade Cache",
"info.step.savingcache":"Speichere Cache",
"info.step.featuredbooks":"Katalog der vorgestellten Bücher wird erstellt",
"info.step.customcatalogs":"Benutzerdefinierte Kataloge werden erstellt",
"stats.library.header":"Bibliotheksstatistik",
"stats.run.header":"Statistik starten",
"stats.run.metadata":"ePub Metadaten geändert",
"stats.run.thumbnails":"Vorschaubilder erstellt",
"stats.run.covers":"Cover reformatiert",
"stats.copy.header":"Datei Kopiestatistik",
"stats.copy.notexist":"JA: Ziel existiert nicht",
"stats.copy.lengthdiffer":"JA: Grösse differiert",
"stats.copy.unchecked":"JA: CRC nicht geprüft",
"stats.copy.crcdiffer":"JA: CRC differiert",
"stats.copy.crcsame":"NEIN: CRC ident",
"stats.copy.older":"NEIN: Ursprung älter",
"stats.copy.toself":"NEIN: Ursprungsdatei und Zieldatei sind ident",
"fin":"fin"
}

196
lang/Localization_en.json Normal file
View file

@ -0,0 +1,196 @@
{
"boolean.no":"no",
"boolean.yes":"yes",
"splitByLetter.letter":"{0} starting with {1}",
"home.title":"Main catalog",
"link.fullentry":"Full entry",
"title.nextpage":"next page ({0} of {1})",
"title.lastpage":"next page (last)",
"title.numberOfPages":"{0} ({1} pages)",
"bookword.title":"Books",
"bookword.none":"No book",
"bookword.one":"1 book",
"bookword.many":"{0} books",
"authorword.title":"Authors",
"authorword.none":"No author",
"authorword.one":"1 author",
"authorword.many":"{0} authors",
"taglevelword.title":"Tag levels",
"taglevelword.none":"No tag level",
"taglevelword.one":"1 tag level",
"taglevelword.many":"{0} tag levels",
"seriesword.title":"Series",
"seriesword.none":"No series",
"seriesword.one":"1 series",
"seriesword.many":"{0} series",
"tagword.title":"Tags",
"tagword.none":"No tag",
"tagword.one":"1 tag",
"tagword.many":"{0} tags",
"content.tags":"Tags:",
"content.series":"Series:",
"content.series.data":"Book {0} in the {1} series",
"content.publisher":"Publisher:",
"content.published":"Published:",
"content.publisher.data":"Published {1} by {0}",
"content.summary":"Summary:",
"bookentry.series":"Book {0} in the {1} series",
"bookentry.author":"{0} by {1}",
"bookentry.tags":"{0} in {1}",
"bookentry.ratings":"{0} rated {1}",
"bookentry.goodreads":"This book on Goodreads",
"bookentry.goodreads.review":"Review this book on Goodreads",
"bookentry.goodreads.author":"{0} on Goodreads",
"bookentry.wikipedia":"This book on Wikipedia",
"bookentry.wikipedia.author":"{0} on Wikipedia",
"bookentry.librarything":"This book on LibraryThing",
"bookentry.librarything.author":"{0} on LibraryThing",
"bookentry.amazon":"This book on Amazon",
"bookentry.amazon.author":"{0} on Amazon",
"bookentry.isfdb.author":"{0} on ISFDB",
"bookentry.download":"Download this ebook as {0}",
"bookentry.rated":"{0} {1}",
"bookentry.fullentrylink":"Full entry",
"tags.title":"Tags",
"tags.categorized":"Categorized index of the {0} tags",
"tags.categorized.single":"Categorized index of the single tag - very useful indeed ;)",
"tags.alphabetical":"Alphabetical index of the {0} tags",
"tags.alphabetical.single":"Alphabetical index of the single tag ;)",
"splitByLetter.tag.other":"Other tags",
"authors.series.title":"Series: {0}",
"authors.title":"Authors",
"authors.alphabetical":"Alphabetical index of the {0} authors",
"authors.alphabetical.single":"Alphabetical index of the single author - very useful indeed ;)",
"splitByLetter.author.other":"Other authors",
"series.title":"Series",
"series.alphabetical":"Alphabetical index of the {0} series",
"series.alphabetical.single":"Alphabetical index of the single series - very useful indeed ;)",
"splitByLetter.series.other":"Other series",
"recent.title":"Recent additions",
"recent.list":"{0} most recent books",
"recent.list.single":"Most recent single book - very useful indeed ;)",
"rating.title":"Rating",
"rating.summary":"{0}, grouped by rating",
"allbooks.title":"All books",
"allbooks.alphabetical":"Alphabetical index of the {0} books",
"allbooks.alphabetical.single":"Alphabetical index of the single book - very useful indeed ;)",
"splitByLetter.book.other":"Other books",
"main.title":"Calibre library",
"main.summary":"{0} has catalogued {1}",
"info.databasefolderset":"The database folder has been set",
"info.targetfolderset":"The target folder has been set",
"info.started":"Started",
"info.completed":"Completed",
"startup.newhome":"Default configuration folder home redirected to {0}",
"startup.redirectfound":".redirect file found in {0}",
"startup.redirectreadfail":"... failure reading .redirect file",
"startup.redirectnotfound":"... unable to find redirect folder {0}",
"startup.redirectabandoned":"... so redirect abandoned",
"startup.redirecting":"redirecting home folder to {0}",
"startup.configusing":"Using configuration folder {0}",
"startup.folderuserhome":"Try configuration folder in user home folder {0}",
"startup.foldertilde":"Try configuration folder from tilde folder {0}",
"startup.folderjar":"Try configuration folder from .jar location {0}",
"startup.foldernotexist":"... but specified folder does not exist",
"error.cannotTransform":"cannot transform {0}",
"error.notYetReady":"Not yet ready for use",
"error.searchnotfound":"Cannot find the specified search in the Calibre database",
"error.searchparsefailure":"Cannot interpret the search. Check that you have limited yourself to the fields and syntax described in the documentation.",
"error.databasenotset":"The database folder must be specified. This is the same as the Calibre library folder.",
"error.nodatabase":"The Calibre database (a file named metadata.db) cannot be found at {0}. This file is always located in the calibre library folder.",
"error.nogeneratetype":"Neither OPDS or HTML catalog generation options are set.",
"error.nocatalog":"Catalog folder not specified",
"error.badcatalog":"Catalog folder name invalid",
"error.targetdoesnotexist":"The target folder does not exist; create it ?",
"error.targetnotset":"The target folder is not set and this is mandatory in Publish mode. You are expected to use an existing folder (typically on a network server)",
"error.nooktargetnot set":"The target folder is not set and this is mandatory in Nook mode. In Nook mode you are expected to use an existing folder on the Nook (typically My Documents)",
"error.nooktargetdoesnotexist":"The target folder does not exist. In Nook mode you are expected to use an existing folder on the Nook (typically My Documents)",
"error.targetsame":"The target folder cannot be the same as the Database folder",
"error.targetparent":"The target folder cannot be a folder that contains the Database folder",
"error.noSubcatalog":"Cannot generate a catalog as you have disabled the generation of all normal sub-catalog sections and no external custom catalogs have been specified. ",
"error.nobooks":"No books found in Calibre Library meeting criteria for inclusion in Catalog. Is your list of formats correct?",
"error.loadingThumbnail":"An error occured while loading the image file {0}",
"error.savingThumbnail":"An error occured while saving the thumbnail file {0}",
"error.generatingThumbnail":"An error occured while generating the thumbnail for {0}",
"error.noPublishedDate":"The Published Date is not set for book",
"error.noAddedDate":"The Date added is not set for book",
"error.loadingProperties":"Error while loading properties",
"error.badComment":"Invalid XHTML in the comment field for Book (Id={0}) {1}",
"error.userAbort":"User stopped the catalog generation",
"error.crashAbort":"Fatal error during catalog generation. See log file for more detail.",
"error.unexpectedFatal":"Unexpected fatal error during catalog generation. See log file for more detail.",
"error.cause":"cause",
"error.message":"message",
"error.stackTrace":"stack trace",
"i18n.and":"and",
"i18n.downloads":"Downloads, links and other catalogs",
"i18n.links":"Links and other catalogs",
"i18n.coversection":"Cover",
"i18n.downloadfile":"Download file",
"i18n.downloadsection":"Downloads",
"i18n.relatedsection":"Related catalogs",
"i18n.linksection":"External links",
"i18n.backToMain":"Back to the main page of the catalog",
"i18n.summarysection":"Summary",
"i18n.dateGenerated":"Catalog generated on {0}",
"deeplevel.summary":"{0} broken up by authors, tags, etc. ",
"about.title":"Calibre2Opds Documentation",
"about.summary":"Notes on using Calibre2Opds",
"usage.intro":"The options are taken from the configuration file located at {0}",
"intro.goal":"Generate OPDS and HTML catalogs from your Calibre ebooks database",
"intro.wiki.title":"The project''s home : ",
"intro.wiki.url":"http://calibre2opds.com",
"intro.team.title":"The Calibre2Opds team :",
"intro.team.list1":"David Pierron - main programmer",
"intro.team.list2":"Dave Walker - guru, features manager and tester extraordinaire",
"intro.team.list3":"Farid Soussi - css and html guru",
"intro.team.list4":"Douglas Steele - programmer",
"intro.team.list5":"Jane Litte - beta tester and moral support",
"intro.thanks.1":"Special thanks to Kb Sriram, who not only programmed Trook, an excellent and OPDS compatible ",
"intro.thanks.2":"library manager for the Nook, but also was kind enough to donate a Nook !",
"info.step.started":"started catalog generation",
"info.step.database":"loading and filtering database",
"info.steo.books":"generating book entries",
"info.step.tags":"generating tags catalog",
"info.step.authors":"generating authors catalog",
"info.step.series":"generating series catalog",
"info.step.recent":"generating recent books catalog",
"info.step.rated":"generating books rating catalog",
"info.step.allbooks":"generating all books catalog",
"info.step.covers":"generating the cover files",
"info.step.index":"generating the search index",
"info.step.reprocessingEpubMetadata":"reprocessing the ePub metadata",
"info.step.thumbnails":"generating the thumbnail files",
"info.step.copycat":"copy the catalog",
"info.step.copylib":"copy the library",
"info.step.donein":"done in {0} millisec.",
"info.thumbnails.donein":"spent {0} sec. creating thumbnails",
"info.html.donein":"spent {0} sec. creating HTML catalogs",
"info.step.done":"{0} now contains the catalogs",
"info.step.done.gui":"created the catalogs",
"info.step.done.nook":"Your Nook",
"info.step.done.andYourDb":" and your Calibre folder",
"info.step.tidyingtarget":"Removing superflous files on target",
"info.step.deletingfiles":"Deleting temporary Files",
"info.step.loadingcache":"Loading cache",
"info.step.savingcache":"Saving cache",
"info.step.featuredbooks":"generating featured books catalog",
"info.step.customcatalogs":"generating custom catalogs",
"stats.library.header":"Library Statistics",
"stats.run.header":"Run Statistics",
"stats.run.metadata":"ePub Metadata updated",
"stats.run.thumbnails":"thumbnails generated",
"stats.run.covers":"resized covers generated",
"stats.copy.header":"File Copying Statistics",
"stats.copy.notexist":"YES: Target does not exist",
"stats.copy.lengthdiffer":"YES: Length different",
"stats.copy.unchecked":"YES: CRC not checked",
"stats.copy.crcdiffer":"YES: CRC different",
"stats.copy.crcsame":"NO: CRC same",
"stats.copy.older":"NO: Source older ",
"stats.copy.toself":"NO: Source and Target same file",
"stats.search.header":"Search Database Statistics",
"stats.search.dbsize":"Bytes",
"stats.search.keywords":"Keywords",
"fin":"fin"
}

125
lang/Localization_es.json Normal file
View file

@ -0,0 +1,125 @@
{
"boolean.yes":"si",
"splitByLetter.letter":"{0} que empiezan por {1}",
"home.title":"Catalogo principal",
"link.fullentry":"Entrada completa",
"title.nextpage":"next page ({0} de {1})",
"title.lastpage":"pagina siguiente (ultima)",
"title.numberOfPages":"{0} ({1} paginas)",
"bookword.title":"Libros",
"bookword.none":"Sin libros",
"bookword.one":"1 libro",
"bookword.many":"{0} libros",
"authorword.title":"Autores",
"authorword.none":"Sin autor",
"authorword.one":"1 autor",
"authorword.many":"{0} autores",
"taglevelword.title":"Niveles de Etiquetas",
"taglevelword.none":"Sin nivel de etiquetas",
"taglevelword.one":"1 nivel de etiqueta",
"taglevelword.many":"{0} niveles de etiquetas",
"seriesword.none":"Sin series",
"seriesword.one":"1 serie",
"seriesword.many":"series",
"tagword.title":"Etiquetas",
"tagword.none":"Sin etiquetas",
"tagword.one":"1 etiqueta",
"tagword.many":"etiquetas",
"content.tags":"Etiquetas:",
"content.series.data":"Libro {0} en la {1} serie",
"content.publisher":"Editorial:",
"content.publisher.data":"Publicado {1} por {0}",
"content.summary":"Sumario:",
"bookentry.series":"Libro {0} en la {1} serie",
"bookentry.author":"{0} de {1}",
"bookentry.tags":"{0} en {1}",
"bookentry.ratings":"{0} puntuados {1}",
"bookentry.goodreads":"Este libro en Goodreads",
"bookentry.goodreads.review":"Comenta este libro en Goodreads",
"bookentry.goodreads.author":"{0} en Goodreads",
"bookentry.wikipedia":"Este libro en Wikipedia",
"bookentry.wikipedia.author":"{0} en Wikipedia",
"bookentry.librarything":"Este libro en LibraryThing",
"bookentry.librarything.author":"{0} en LibraryThing",
"bookentry.amazon":"Este libro en Amazon",
"bookentry.amazon.author":"{0} en Amazon",
"bookentry.isfdb.author":"{0} en ISFDB",
"bookentry.download":"Descargar este libro como {0}",
"bookentry.rated":"{0} {1}",
"bookentry.fullentrylink":"Entrada completa",
"tags.title":"etiquetas",
"tags.categorized":"Listado por categorias de las {0} etiquetas",
"tags.categorized.single":"Listado por categorias de la unica etiqueta - muy util ;)",
"tags.alphabetical":"Listado alfabético de las {0} etiquetas",
"tags.alphabetical.single":"Listado Alfabético de la unica etiqueta ;)",
"splitByLetter.tag.other":"Otras etiquetas",
"authors.series.title":"Series",
"authors.title":"Autores",
"authors.alphabetical":"Indice alfabético de {0}",
"authors.alphabetical.single":"Indice de un solo autor",
"splitByLetter.author.other":"Otros Autores",
"series.title":"Series:",
"series.alphabetical":"Indice alfabético de {0}",
"series.alphabetical.single":"Indice de una sola serie",
"splitByLetter.series.other":"Otras series",
"recent.title":"Añadidos recientemente",
"recent.list":"{0} libros más recientes",
"recent.list.single":"El libro más reciente",
"rating.title":"Valoración",
"rating.summary":"{0}, agrupados por valoración",
"allbooks.title":"Todos los libros",
"allbooks.alphabetical":"Indice alfabético de {0} libros",
"allbooks.alphabetical.single":"Indice de un solo ",
"splitByLetter.book.other":"Otros libros",
"main.title":"Biblioteca generada de calibre",
"main.summary":"{0} ha catalogado {1}",
"info.databasefolderset":"El directorio de la base de datos",
"info.targetfolderset":"Se ha establecido el directorio de destino",
"error.cannotTransform":"Error transformando {0}",
"error.nodatabase":"La base de datos de calibre (un fichero llamadometadata.db) no se puede encontrar en {0}",
"error.targetdoesnotexist":"El directorio de destino no existe, ¿crearlo?",
"error.loadingThumbnail":"Ocurrio un error cargando la imagen {0}",
"error.savingThumbnail":"Ocurrio un error guardando la miniatura de la imagen {0}",
"error.generatingThumbnail":"Ocurrio un error generando la miniatura de la imagen {0}",
"i18n.downloads":"Descargas, enlaces y otros catálogos",
"i18n.links":"Enlaces y otros catálogos",
"i18n.downloadfile":"Descargar fichero",
"i18n.downloadsection":"Descargas, enlaces y otros",
"i18n.relatedsection":"Catálogos relacionados",
"i18n.linksection":"Enlaces externos",
"i18n.backToMain":"Volver a la página de inicio del catálogo",
"i18n.summarysection":"Resumen",
"i18n.dateGenerated":"Catálogo creado el {0}",
"deeplevel.summary":"{0} por autores, etiquetas, etc.",
"about.title":"Documentación de Calibre2Opds",
"about.summary":"Notas de Uso",
"usage.intro":"Las opciones provienen del fichero de configuración presente en: {0}",
"intro.goal":"Genear catálogos OPDS y HTML desde la biblioteca de calibre",
"intro.team.title":"El equipo de Calibre2Opds:",
"intro.team.list1":"David Pierron - Programador principal",
"intro.team.list2":"Dave Walker - guru, opciones, gestión y tester extraordinaire",
"intro.team.list4":"Douglas Steele - programador",
"intro.team.list5":"Jane Litte - beta tester y apoyo moral",
"intro.thanks.1":"Gracias especiales a Kb Sriram, que no solo ha programado Trook, un gestor de bibliotecas OPDS excelente y compatible",
"intro.thanks.2":"con el Nook, sino que además ha sido tan amable de donar un Nook",
"info.step.database":"cargando y filtrando la base de datos",
"info.step.tags":"generando catálogo de etiquetas",
"info.step.authors":"generando catálogo de autores",
"info.step.series":"generando catálogo de series",
"info.step.recent":"generando catálogo de libros recientes",
"info.step.rated":"generando catálogo de valoraciones",
"info.step.allbooks":"generando catálogo de todos los libros",
"info.step.covers":"generando las portadas",
"info.step.reprocessingEpubMetadata":"procesando los metadatos de los ePUBs",
"info.step.thumbnails":"generando las miniaturas de imágenes",
"info.step.copycat":"copia del catálogo",
"info.step.copylib":"copia la biblioteca",
"info.step.donein":"terminado en {0} ms.",
"info.thumbnails.donein":"Tardó {0} seg. en crear las miniaturas",
"info.html.donein":"Tardó {0} sec. en crear el catálogo HTML",
"info.step.done":"{0} contiene ahora el catálogo",
"info.step.done.gui":"catálogo creado",
"info.step.done.nook":"Su Nook",
"info.step.done.andYourDb":"y su directorio de calibre",
"fin":"fin"
}

169
lang/Localization_fr.json Normal file
View file

@ -0,0 +1,169 @@
{
"boolean.no":"non",
"boolean.yes":"oui",
"splitByLetter.letter":"{0} débutant par {1}",
"home.title":"Catalogue principal",
"link.fullentry":"Entrée complète",
"title.nextpage":"page suivante ({0} sur {1})",
"title.lastpage":"page suivante (dernière)",
"title.numberOfPages":"{0} ({1} pages)",
"bookword.title":"Livres",
"bookword.none":"Aucun livre",
"bookword.one":"1 livre",
"bookword.many":"{0} livres",
"authorword.title":"Auteurs",
"authorword.none":"Pas d'auteur",
"authorword.one":"1 auteur",
"authorword.many":"{0} auteurs",
"taglevelword.title":"Niveaux",
"taglevelword.none":"Pas de niveau",
"taglevelword.one":"1 niveau",
"taglevelword.many":"{0} niveaux",
"seriesword.title":"Collections",
"seriesword.none":"Pas de collection",
"seriesword.one":"1 collection",
"seriesword.many":"{0} collections",
"tagword.title":"Étiquettes",
"tagword.none":"Sans étiquette",
"tagword.one":"1 étiquette",
"tagword.many":"{0} étiquettes",
"content.tags":"Étiquettes:",
"content.series":"Collection:",
"content.series.data":"Livre {0} dans la collection {1}",
"content.publisher":"Editeur:",
"content.publisher.data":"Publié {0} le {1}",
"content.summary":"Résumé:",
"bookentry.series":"Livre {0} dans la collection {1}",
"bookentry.author":"{0} de {1}",
"bookentry.tags":"{0} dans {1}",
"bookentry.ratings":"{0} notés {1}",
"bookentry.goodreads":"Ce livre sur Goodreads",
"bookentry.goodreads.review":"Critique du livre sur Goodreads",
"bookentry.goodreads.author":"{0} sur Goodreads",
"bookentry.wikipedia":"Ce livre sur Wikipedia",
"bookentry.wikipedia.author":"{0} sur Wikipedia",
"bookentry.librarything":"Ce livre sur LibraryThing",
"bookentry.librarything.author":"{0} sur LibraryThing",
"bookentry.amazon":"Ce livre sur Amazon",
"bookentry.amazon.author":"{0} sur Amazon",
"bookentry.isfdb.author":"{0} sur ISFDB",
"bookentry.download":"Télécharger ce livre au format {0}",
"bookentry.rated":"{0} {1}",
"bookentry.fullentrylink":"Entrée complète",
"tags.title":"Étiquettes",
"tags.categorized":"Index ordonné des {0} étiquettes",
"tags.categorized.single":"Index ordonné de la seule étiquette disponible",
"tags.alphabetical":"Index alphabétique des {0} étiquettes",
"tags.alphabetical.single":"Index alphabétique de la seule étiquette ;)",
"splitByLetter.tag.other":"Autres étiquettes",
"authors.series.title":"Collection: {0}",
"authors.title":"Auteurs",
"authors.alphabetical":"Index alphabétique des {0} auteurs",
"authors.alphabetical.single":"Index alphabétique du seul auteur ;)",
"splitByLetter.author.other":"Autres auteurs",
"series.title":"Collections",
"series.alphabetical":"Index alphabétique de {0} collections",
"series.alphabetical.single":"Index alphabétique de la seule collection ;)",
"splitByLetter.series.other":"Autres collections",
"recent.title":"Ajouts récents",
"recent.list":"{0} livres les plus récents",
"recent.list.single":"Ajouté récemment - ;)",
"rating.title":"Appréciations",
"rating.summary":"{0}, par appréciation",
"allbooks.title":"Tous les livres",
"allbooks.alphabetical":"Index alphabétique des {0} livres",
"allbooks.alphabetical.single":"Index alphabétique du seul livre ;)",
"splitByLetter.book.other":"Autres livres",
"main.title":"Bibliothèque gérée par Calibre",
"main.summary":"{0} a catalogué {1}",
"info.databasefolderset":"Le répertoire de la base de données a été mis à jour",
"info.targetfolderset":"Le répertoire de destination a été mis à jour",
"info.started":"Démarré",
"info.completed":"Terminé",
"error.cannotTransform":"Conversion de {0} impossible",
"error.notYetReady":"Pas encore prêt à être utilisé",
"error.nodatabase":"La base de données de Calibre (un fichier nommé metadata.db) n''est pas à l''endroit indiqué ({0})",
"error.nogeneratetype":"Au moins un type de catalogue doit être généré (OPDS et/ou HTML)",
"error.nocatalog":"Le répertoire du catalogue n'est pas spécifié",
"error.targetdoesnotexist":"Le répertoire de destination n''existe pas; le créer ?",
"error.targetsame":"Le répertoire cible ne peut pas être le même que le répertoire de la base de données",
"error.targetparent":"Le répertoire cible ne peut pas contenir le répertoire de la base de données",
"error.nobooks":"Aucun livre de la bibliothèque Calibre n'a satisfait aux critères pour être inclus dans le catalogue. Est-ce que votre liste de formats est correcte ?",
"error.loadingThumbnail":"Une erreur s''est produite pendant le chargement de l''image {0}",
"error.savingThumbnail":"Une erreur s''est produite pendant la sauvegarde de la miniature {0}",
"error.generatingThumbnail":"Une erreur s''est produite pendant la génération de la minitature {0}",
"error.noPublishedDate":"La date de publication n'est pas renseignée pour le livre",
"error.noAddedDate":"La date d'ajout n'est pas renseignée pour le livre",
"error.loadingProperties":"Erreur durant le chargement de la configuration",
"error.userAbort":"L''utilisateur a stoppé la génération du catalogue",
"error.crashAbort":"Erreur durant la génération du catalogue. Voir le fichier journal pour plus de détails.",
"error.unexpectedFatal":"Erreur fatale durant la génération du catalogue. Voir le fichier journal pour plus de détails.",
"error.cause":"cause",
"error.message":"message",
"error.stackTrace":"extrait de la pile d'appels",
"i18n.downloads":"Téléchargements, liens et autres catalogues",
"i18n.links":"Liens et autres catalogues",
"i18n.coversection":"Couverture",
"i18n.downloadfile":"Télécharger fichier",
"i18n.downloadsection":"Téléchargements",
"i18n.relatedsection":"Catalogues similaires",
"i18n.linksection":"Liens externes",
"i18n.backToMain":"Page principale du catalogue",
"i18n.summarysection":"Résumé",
"i18n.dateGenerated":"Catalogue généré le {0}",
"deeplevel.summary":"{0} par auteur, étiquette, etc.",
"about.title":"Documentation de Calibre2Opds",
"about.summary":"Notes d'utilisation",
"usage.intro":"Les options sont tirées du fichier de configuration qui se trouve ici : {0}",
"intro.goal":"Génère des catalogues OPDS et HTML à partir de votre base de données de Calibre",
"intro.wiki.title":"Le site du projet :",
"intro.team.title":"L'équipe Calibre2Opds :",
"intro.team.list1":"David Pierron - programmeur principal",
"intro.team.list2":"Dave Walker - guru, responsable des fonctionnalités et testeur extraordinaire",
"intro.team.list3":"Farid Soussi - guru HTML et CSS",
"intro.team.list4":"Douglas Steele - programmeur",
"intro.team.list5":"Jane Litte - beta testeuse et soutien moral",
"intro.thanks.1":"Remerciements particuliers à Kb Sriram, qui est l'auteur de Trook, un excellent",
"intro.thanks.2":"gestionnaire de bibliothèque pour Nook, et a m'a fait cadeau d'un Nook !",
"info.step.started":"génération du catalogue démarrée",
"info.step.database":"chargement et filtrage de la base de données",
"info.step.tags":"génération du catalogue des étiquettes",
"info.step.authors":"génération du catalogue des auteurs",
"info.step.series":"génération du catalogue des collections",
"info.step.recent":"génération du catalogue des livres récents",
"info.step.rated":"génération du catalogue des appréciations",
"info.step.allbooks":"génération du catalogue de tous les livres",
"info.step.covers":"génération des couvertures",
"info.step.index":"génération de l'index de recherche",
"info.step.reprocessingEpubMetadata":"mise à jour des métadonnées des ePub",
"info.step.thumbnails":"génération des miniatures",
"info.step.copycat":"copie du catalogue",
"info.step.copylib":"copie de la bibliothèque",
"info.step.donein":"exécuté en {0} millisec.",
"info.thumbnails.donein":"la création des aperçus a nécessité {0} sec.",
"info.html.donein":"la création des catalogues HTML a nécessité {0} sec.",
"info.step.done":"{0} contient à présent les catalogues",
"info.step.done.gui":"les catalogues ont été correctement créés",
"info.step.done.nook":"Votre Nook",
"info.step.done.andYourDb":" et votre répertoire Calibre",
"info.step.tidyingtarget":"effacement des fichiers superflus de la destination",
"info.step.deletingfiles":"effacement des fichiers temporaires",
"info.step.loadingcache":"chargement du cache",
"info.step.savingcache":"sauvegarde du cache",
"info.step.featuredbooks":"génération du catalogue des livres mis en avant",
"info.step.customcatalogs":"génération des catalogues personnalisés",
"stats.library.header":"Statistiques de la bibliothèque",
"stats.run.header":"Statistiques de la génération",
"stats.run.metadata":"nombre d'ePub mis à jour",
"stats.run.thumbnails":"Nombre d'aperçus générés",
"stats.run.covers":"Nombre de couvertures retaillées",
"stats.copy.header":"Statistiques de la copie de fichiers",
"stats.copy.notexist":"OUI: la cible n'existe pas",
"stats.copy.lengthdiffer":"OUI: les tailles diffèrent",
"stats.copy.unchecked":"OUI: CRC non vérifiés",
"stats.copy.crcdiffer":"OUI: CRC différents",
"stats.copy.crcsame":"NON: CRC identiques",
"stats.copy.older":"NON: source plus ancienne",
"stats.copy.toself":"NON: la source et la cible sont le même fichier",
"fin":"fin"
}

127
lang/Localization_it.json Normal file
View file

@ -0,0 +1,127 @@
{
"boolean.yes":"sì",
"splitByLetter.letter":"{0} che iniziano per {1}",
"home.title":"Catalogo principale",
"link.fullentry":"Scheda completa",
"title.nextpage":"pagina seguente ({0} di {1})",
"title.lastpage":"pagina seguente (ultima)",
"title.numberOfPages":"{0} ({1} pagine)",
"bookword.title":"Libri",
"bookword.none":"Nessun libro",
"bookword.one":"1 libro",
"bookword.many":"{0} libri",
"authorword.title":"Autori",
"authorword.none":"Senza autore",
"authorword.one":"1 autore",
"authorword.many":"{0} autori",
"taglevelword.title":"Livelli",
"taglevelword.none":"Nessun livello",
"taglevelword.one":"1 livello",
"taglevelword.many":"{0} livelli",
"seriesword.title":"Collane",
"seriesword.none":"Nessuna collana",
"seriesword.one":"1 collana",
"seriesword.many":"{0} collane",
"tagword.title":"Argomenti",
"tagword.none":"Senza argomento",
"tagword.one":"1 argomento",
"tagword.many":"{0} argomenti",
"content.tags":"Argomenti:",
"content.series":"Collana:",
"content.series.data":"Libro {0} nella collana {1}",
"content.publisher":"Editore:",
"content.publisher.data":"Pubblicato {0} il {1}",
"content.summary":"Riassunto:",
"bookentry.series":"Libro {0} nella collana {1}",
"bookentry.author":"{0} di {1}",
"bookentry.ratings":"{0} annotati {1}",
"bookentry.goodreads":"Questo libro su Goodreads",
"bookentry.goodreads.review":"Commenta questo libro su Goodreads",
"bookentry.goodreads.author":"{0} su Goodreads",
"bookentry.wikipedia":"Questo libro su Wikipedia",
"bookentry.wikipedia.author":"{0} su Wikipedia",
"bookentry.librarything":"Questo libro su LibraryThing",
"bookentry.librarything.author":"{0} su LibraryThing",
"bookentry.amazon":"Questo libro su Amazon",
"bookentry.amazon.author":"{0} su Amazon",
"bookentry.isfdb.author":"{0} su ISFDB",
"bookentry.download":"Scarica questo libro nel formato {0}",
"bookentry.rated":"{0} {1}",
"bookentry.fullentrylink":"Scheda completa",
"tags.title":"Argomenti",
"tags.categorized":"Indice ordinato di {0} argomenti",
"tags.categorized.single":"Indice ordinato del solo argomento disponibile",
"tags.alphabetical":"Indice alfabetico di {0} argomenti",
"tags.alphabetical.single":"Indice alfabetico del solo argomento ;)",
"splitByLetter.tag.other":"Altri argomenti",
"authors.series.title":"Collane: {0}",
"authors.title":"Autori",
"authors.alphabetical":"Indice alfabetico di {0} autori",
"authors.alphabetical.single":"Indice alfabetico di un solo autore ;)",
"splitByLetter.author.other":"Altri autori",
"series.title":"Collane",
"series.alphabetical":"Indice alfabetico di {0} collane",
"series.alphabetical.single":"Indice alfabetico di una sola collana ;)",
"splitByLetter.series.other":"Altre collane",
"recent.title":"Ultime aggiunte",
"recent.list":" I {0} libri più recenti",
"recent.list.single":"Il libro più recente - ;)",
"rating.title":"Valutazioni",
"rating.summary":"{0}, per valutazioni",
"allbooks.title":"Tutti i libri",
"allbooks.alphabetical":"Indice alfabetico di {0} libri",
"allbooks.alphabetical.single":"Indice alfabetico di un solo libro ;)",
"splitByLetter.book.other":"Altri libri",
"main.title":"Biblioteca generata da Calibre",
"main.summary":"{0} ha catalogato {1}",
"info.databasefolderset":"La cartella della base di",
"info.targetfolderset":"La cartella di destinazione è stata aggiornata",
"error.cannotTransform":"Errore nella conversione di {0} ",
"error.nodatabase":"La banca dati di Calibre (il file metadata.db) non è nel posto previsto {0}",
"error.targetdoesnotexist":"La cartella di destinazione non esiste: crearla? ",
"error.loadingThumbnail":"C'è stato un errore nel caricamento dell'immagine {0}",
"error.savingThumbnail":"C'è stato un errore nel salvataggio della miniatura {0}",
"error.generatingThumbnail":"C'è stato un errore nella creazione della miniatura {0}",
"i18n.downloads":"Scarica, collegamenti e altri cataloghi",
"i18n.links":"Collegamenti e altri cataloghi",
"i18n.downloadfile":"Scarica il documento",
"i18n.downloadsection":"Scaricati",
"i18n.relatedsection":"Cataloghi simili",
"i18n.linksection":"Collegamenti esterni",
"i18n.backToMain":"Pagina principale del catalogo",
"i18n.summarysection":"Riassunto",
"i18n.dateGenerated":"Catalogo generato il {0}",
"deeplevel.summary":"{0} par autore, etichetta, ecc.",
"about.title":"Documentazione di Calibre2Opds",
"about.summary":"Note d'utilizzo",
"usage.intro":"Le opzioni sono prese dal file di configuraziones che si trova qui: {0}",
"intro.goal":"Crea cataloghi OPDS e HTML a partire dalla tua banca dati di Calibre",
"intro.wiki.title":"Il sito del progetto: ",
"intro.team.title":"Il team Calibre2Opds:",
"intro.team.list1":"David Pierron - programmatore principale",
"intro.team.list2":"Dave Walker - guru, responsabile delle funzionalità e collaudatore straordinario",
"intro.team.list4":"Douglas Steele - programmatore",
"intro.team.list5":"Jane Litte - collaudatrice beta e sostegno morale",
"intro.thanks.1":"Un ringraziamento particolare a Kb Sriram, autore di Trook, un eccellente ",
"intro.thanks.2":"gestore di biblioteche per Nook, che mi ha regalato un Nook!",
"info.step.database":"caricamento e filtraggio della banca dati",
"info.step.tags":"creazione del catalogo degli argomenti",
"info.step.authors":"creazione del catalogo degli autori",
"info.step.series":"creazione del catalogo delle collane",
"info.step.recent":"creazione del catalogo dei libri recenti",
"info.step.rated":"creazione del catalogo delle valutazioni",
"info.step.allbooks":"creazione del catalogo di tutti i libri ",
"info.step.covers":"creazione delle copertine",
"info.step.reprocessingEpubMetadata":"aggiornamento dei metadati degli epub",
"info.step.thumbnails":"creazione delle miniature",
"info.step.copycat":"copia del catalogo",
"info.step.copylib":"copia della biblioteca",
"info.step.donein":"esecuzione in {0} millisec.",
"info.thumbnails.donein":"la creazione delle miniature è durata {0} sec.",
"info.html.donein":"la creazione dei cataloghi HTML è durata {0} sec.",
"info.step.done":"{0} contiene ora i cataloghi",
"info.step.done.gui":"i cataloghi sono stati creati correttamente",
"info.step.done.nook":"Il tuo Nook",
"info.step.done.andYourDb":" e la tua cartella Calibre",
"fin":"fin"
}

140
lang/Localization_ru.json Normal file
View file

@ -0,0 +1,140 @@
{
"boolean.no":"нет",
"boolean.yes":"да",
"splitByLetter.letter":"{0} начать с {1}",
"home.title":"Основной каталог",
"link.fullentry":"Полный перечень",
"title.nextpage":"следующая страница ({0} из {1})",
"title.lastpage":"следующая страница (последняя)",
"title.numberOfPages":"{0} ({1} страницы(а))",
"bookword.title":"Книги",
"bookword.none":"Нет книг",
"bookword.one":"1 книга",
"bookword.many":"{0} книг(и)",
"authorword.title":"Авторы",
"authorword.none":"Нет авторов",
"authorword.one":"1 автор",
"authorword.many":"{0} авторов(а)",
"taglevelword.title":"Уровни тэгов",
"taglevelword.none":"Нет уровней тэгов",
"taglevelword.one":"1 уровень тэгов",
"taglevelword.many":"{0} уровней(я) тэгов",
"seriesword.title":"Серии",
"seriesword.none":"Нет серий",
"seriesword.one":"1 серия",
"seriesword.many":"{0} серий(и)",
"tagword.title":"Тэги",
"tagword.none":"Нет тэгов",
"tagword.one":"1 тэг",
"tagword.many":"{0} тэгов(а)",
"content.tags":"Тэги:",
"content.series":"Серии:",
"content.series.data":"Книга {0} в {1} серии",
"content.publisher":"Издательство:",
"content.publisher.data":"Опубликовано {1} издательством {0}",
"content.summary":"Краткое содержание:",
"bookentry.series":"Книга {0} в {1} серии",
"bookentry.author":"{0} из {1}",
"bookentry.tags":"{0} в {1}",
"bookentry.ratings":"{0} оценено {1}",
"bookentry.goodreads":"Эта книга на Goodreads",
"bookentry.goodreads.review":"Обзор этой книги на Goodreads",
"bookentry.goodreads.author":"{0} на Goodreads",
"bookentry.wikipedia":"Эта книга на Wikipedia",
"bookentry.wikipedia.author":"{0} на Wikipedia",
"bookentry.librarything":"Эта книга на LibraryThing",
"bookentry.librarything.author":"{0} на LibraryThing",
"bookentry.amazon":"Эта книга на Amazon",
"bookentry.amazon.author":"{0} на Amazon",
"bookentry.isfdb.author":"{0} на ISFDB",
"bookentry.download":"Скачать эту электронную книгу в формате {0}",
"bookentry.rated":"{0} {1}",
"bookentry.fullentrylink":"Полный перечень",
"tags.title":"Тэги",
"tags.categorized":"Категорированный указатель для {0} тэгов",
"tags.categorized.single":"Категорированный указатель для одного тэга - действительно очень полезно ;)",
"tags.alphabetical":"Алфавитный указатель для {0} тэгов",
"tags.alphabetical.single":"Алфавитный указатель для одного тэга ;)",
"splitByLetter.tag.other":"Другие тэги",
"authors.series.title":"Серии: {0}",
"authors.title":"Авторы",
"authors.alphabetical":"Алфавитный указатель для {0} авторов",
"authors.alphabetical.single":"Алфавитный указатель для одного автора - действительно очень полезно ;)",
"splitByLetter.author.other":"Другие авторы",
"series.title":"Серии",
"series.alphabetical":"Алфавитный указатель для {0} серий",
"series.alphabetical.single":"Алфавитный указатель для одной серии - действительно очень полезно ;)",
"splitByLetter.series.other":"Другие серии",
"recent.title":"Недавние поступления",
"recent.list":"{0} недавно поступивших(ие) книг(и)",
"recent.list.single":"Недавно поступившая одна книга - действительно очень полезно ;)",
"rating.title":"Рейтинг",
"rating.summary":"{0}, сгруппировано по рейтингу",
"allbooks.title":"Все книги",
"allbooks.alphabetical":"Алфавитный указатель всех {0} книг",
"allbooks.alphabetical.single":"Алфавитный указатель одной книги - действительно очень полезно ;)",
"splitByLetter.book.other":"Другие книги",
"main.title":"Библиотека Calibre",
"main.summary":"{0} каталогизировано {1}",
"info.databasefolderset":"Папка базы данных указана",
"info.targetfolderset":"Папка расположения результатов указана",
"error.cannotTransform":"не может быть трансформировано {0}",
"error.nodatabase":"База данных библиотеки Calibre (файл metadata.db) не найден {0}",
"error.targetdoesnotexist":"Указанная для расположения результатов папка не существует. Создать ее?",
"error.loadingThumbnail":"Произошла ошибка при загрузке файла с изображением {0}",
"error.savingThumbnail":"Произошла ошибка при сохранении файла мини-описания {0}",
"error.generatingThumbnail":"Произошла ошибка при создании мини-описания для {0}",
"i18n.downloads":"Файлы для скачивания, ссылки и другие каталоги",
"i18n.links":"Ссылки и другие каталоги",
"i18n.downloadfile":"Скачать файл",
"i18n.downloadsection":"Файлы для скачивания",
"i18n.relatedsection":"Связанные каталоги",
"i18n.linksection":"Внешние ссылки",
"i18n.backToMain":"Назад на заглавную страницу каталога",
"i18n.summarysection":"Краткое содержание",
"i18n.dateGenerated":"Каталог создан {0}",
"deeplevel.summary":"{0} разбито по авторам, тэгам и т.д.",
"about.title":"Документация Calibre2Opds",
"about.summary":"Примечания по использованию Calibre2Opds",
"usage.intro":"Эта опция взята из файла конфигурации, расположенного в {0}",
"intro.goal":"Генерация OPDS и HTML каталогов вашей базы электронных книг Calibre",
"intro.team.title":"Команда Calibre2Opds :",
"intro.team.list1":"David Pierron - главный программист",
"intro.team.list2":"Dave Walker - гуру, менеджер по фукциональности и исключительный тестер",
"intro.team.list4":"Douglas Steele - программист",
"intro.team.list5":"Jane Litte - бэта-тестер и моральная поддержка",
"intro.thanks.1":"Особые благодарности Kb Sriram, который программировал Trook, отличный и OPDS-совместимый",
"intro.thanks.2":"менеджер библиотеки Nook, для благодарности достаточно оказать спонсорскую помощь Nook !",
"info.step.database":"загрузка и фильтрация базы данных",
"info.step.tags":"генерация каталога "Тэги"",
"info.step.authors":"генерация каталога "Авторы"",
"info.step.series":"генерация каталога "Серии"",
"info.step.recent":"генерация каталога "Недавние поступления"",
"info.step.rated":"генерация каталога "Рейтинг"",
"info.step.allbooks":"генерация каталога "Все книги"",
"info.step.covers":"генерация файлов обложек",
"info.step.reprocessingEpubMetadata":"переработка метаданных ePub",
"info.step.thumbnails":"генерация файлов мини-образов",
"info.step.copycat":"копировать каталог",
"info.step.copylib":"копировать библиотеку",
"info.step.donein":"выполнено за {0} миллисек.",
"info.thumbnails.donein":"создание мини-образов заняло {0} сек. ",
"info.html.donein":"создание HTML каталогов заняло {0} сек.",
"info.step.done":"{0} теперь содержит каталоги",
"info.step.done.gui":"созданные каталоги",
"info.step.done.nook":"Ваш Nook",
"info.step.done.andYourDb":"и ваша папка Calibre",
"info.step.tidyingtarget":"Удаление лишних файлов в папке расположения результатов",
"info.step.deletingfiles":"Удаление временных файлов",
"info.step.loadingcache":"Загрузить кэш",
"info.step.savingcache":"Сохранить кэш",
"stats.copy.header":"Статистика копирования файла",
"stats.copy.notexist":"ДА: Результат не существует",
"stats.copy.lengthdiffer":"ДА: Длина различается",
"stats.copy.unchecked":"ДА: CRC не проверялись",
"stats.copy.crcdiffer":"ДА: CRC различны",
"stats.copy.crcsame":"НЕТ: CRC одинаковы",
"stats.copy.older":"НЕТ: Источник более ранний",
"stats.copy.toself":"НЕТ: Источник и Результат - одинаковые файлы",
"fin":"fin"
}

View file

@ -29,8 +29,8 @@ class Serie extends Base {
public static function getCount() {
$nSeries = parent::getDb ()->query('select count(*) from series')->fetchColumn();
$entry = new Entry ("Series", self::ALL_SERIES_ID,
"Alphabetical index of the $nSeries series", "text",
$entry = new Entry (localize("series.title"), self::ALL_SERIES_ID,
str_format (localize("series.alphabetical"), $nSeries), "text",
array ( new LinkNavigation ("?page=".parent::PAGE_ALL_SERIES)));
return $entry;
}
@ -66,7 +66,7 @@ order by series.sort');
{
$serie = new Serie ($post->id, $post->sort);
array_push ($entryArray, new Entry ($serie->name, $serie->getEntryId (),
"$post->count books", "text",
str_format (localize("bookword.many"), $post->count), "text",
array ( new LinkNavigation ($serie->getUri ()))));
}
return $entryArray;

View file

@ -29,8 +29,8 @@ class tag extends Base {
public static function getCount() {
$nTags = parent::getDb ()->query('select count(*) from tags')->fetchColumn();
$entry = new Entry ("Tags", self::ALL_TAGS_ID,
"Alphabetical index of the $nTags tags", "text",
$entry = new Entry (localize("tags.title"), self::ALL_TAGS_ID,
str_format (localize("tags.alphabetical"), $nTags), "text",
array ( new LinkNavigation ("?page=".parent::PAGE_ALL_TAGS)));
return $entry;
}
@ -55,7 +55,7 @@ order by tags.name');
{
$tag = new Tag ($post->id, $post->name);
array_push ($entryArray, new Entry ($tag->name, $tag->getEntryId (),
"$post->count books", "text",
str_format (localize("bookword.many"), $post->count), "text",
array ( new LinkNavigation ($tag->getUri ()))));
}
return $entryArray;