diff --git a/README b/README index bbe7bbb..b6ec17d 100644 --- a/README +++ b/README @@ -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) Sbastien Lucas diff --git a/author.php b/author.php index 7412486..a0b53cc 100644 --- a/author.php +++ b/author.php @@ -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; diff --git a/base.php b/base.php index bc485ca..0c02fd7 100644 --- a/base.php +++ b/base.php @@ -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); } } diff --git a/book.php b/book.php index 2725807..6d8bde3 100644 --- a/book.php +++ b/book.php @@ -121,7 +121,7 @@ class Book extends Base { $addition = ""; $se = $this->getSerie (); if (!is_null ($se)) { - $addition = $addition . "Series : Book $this->seriesIndex in $se->name
\n"; + $addition = $addition . "" . localize("content.series") . "" . str_format (localize ("content.series.data"), $this->seriesIndex, $se->name) . "
\n"; } return $addition . strip_tags ($this->comment, '
'); } @@ -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; diff --git a/lang/Localization_de.json b/lang/Localization_de.json new file mode 100644 index 0000000..2b26722 --- /dev/null +++ b/lang/Localization_de.json @@ -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" +} diff --git a/lang/Localization_en.json b/lang/Localization_en.json new file mode 100644 index 0000000..1dc5a7f --- /dev/null +++ b/lang/Localization_en.json @@ -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" +} diff --git a/lang/Localization_es.json b/lang/Localization_es.json new file mode 100644 index 0000000..2e92835 --- /dev/null +++ b/lang/Localization_es.json @@ -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" +} diff --git a/lang/Localization_fr.json b/lang/Localization_fr.json new file mode 100644 index 0000000..8e8abe5 --- /dev/null +++ b/lang/Localization_fr.json @@ -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" +} diff --git a/lang/Localization_it.json b/lang/Localization_it.json new file mode 100644 index 0000000..5f08939 --- /dev/null +++ b/lang/Localization_it.json @@ -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" +} diff --git a/lang/Localization_ru.json b/lang/Localization_ru.json new file mode 100644 index 0000000..ed932e2 --- /dev/null +++ b/lang/Localization_ru.json @@ -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" +} diff --git a/serie.php b/serie.php index 1de7c3a..e9b51ab 100644 --- a/serie.php +++ b/serie.php @@ -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; diff --git a/tag.php b/tag.php index 15a9e86..ce6b6d7 100644 --- a/tag.php +++ b/tag.php @@ -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;