diff --git a/ChangeLog b/ChangeLog index 63b55de..d51e8f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,84 @@ +2009-09-26 Robby Stephenson + + * Updated Amazon fetcher to use authentication. + * Released Tellico 1.3.6 + +2009-02-14 Robby Stephenson + + * Released Tellico 1.3.5. + +2009-02-04 Robby Stephenson + + * Reverted change from 2007 that merged entries by combining all values in multiple-value fields. + +2009-02-02 Robby Stephenson + + * Fixed the CueCat decoder to work for ISBN searches, as well as UPC. + +2009-01-30 Robby Stephenson + + * Updated Deliciour Library 1 importer to handle movies and games. + * Fixed Ubuntu bug#317822, don't mark collection modified when image is found in local data directory. + * Fixed query bug with z39.50 ISBN search. + +2008-12-07 Robby Stephenson + + * Updated it.po, thanks to Valerio Ricci. + +2008-10-23 Robby Stephenson + + * Added date, time, and username as available params for the XSLT export. + +2008-09-13 Robby Stephenson + + * Released Tellico 1.3.4. + +2008-09-04 Robby Stephenson + + * Fixed error with consecutive tabs in CSV import. + +2008-08-26 Robby Stephenson + + * Fixed bug with image links in reports not being linked correctly. + +2008-08-20 Robby Stephenson + + * Added minimal searching for board games from Amazon. + +2008-08-07 Robby Stephenson + + * Changed Choice fields to sort by position in list. + +2008-07-25 Robby Stephenson + + * Added ESC key for clearing quick filter. + * Improved drag/drop to match on file extension after checking mimetype. + +2008-07-22 Robby Stephenson + + * Updated IMDb plot regexp. + +2008-07-09 Robby Stephenson + + * Fixed EntryView to honor copy() command properly, for clipboard. + * Released Tellico 1.3.3. + +2008-06-24 Robby Stephenson + + * Updated Porbase URL in z39.50 server list. + +2008-06-13 Robby Stephenson + + * Updated drag-and-drop to allow HTTP urls. + +2008-06-12 Robby Stephenson + + * Changed Arxiv fetcher to remove ID version number for results. + +2008-06-07 Robby Stephenson + + * Fixed bug with merging file catalogs, to properly match on URL. + 2008-05-24 Robby Stephenson * Released Tellico 1.3.2.1. diff --git a/config.h.in b/config.h.in index 73c4c11..d76161c 100644 --- a/config.h.in +++ b/config.h.in @@ -66,6 +66,9 @@ /* Define if you have libz */ #undef HAVE_LIBZ +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_VIDEODEV_H + /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H @@ -174,6 +177,9 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION +/* Define to 1 if the XML loader should use SAX */ +#undef SAX_SUPPORT + /* The size of `char', as computed by sizeof. */ #undef SIZEOF_CHAR diff --git a/configure.in b/configure.in index 8b6a1bf..388fbfa 100644 --- a/configure.in +++ b/configure.in @@ -40,7 +40,7 @@ dnl Perform program name transformation AC_ARG_PROGRAM dnl Automake doc recommends to do this only here. (Janos) -AM_INIT_AUTOMAKE(tellico, 1.3.2.1) dnl searches for some needed programs +AM_INIT_AUTOMAKE(tellico, 1.3.6) dnl searches for some needed programs KDE_SET_PREFIX @@ -491,7 +491,8 @@ AC_ARG_WITH([ooo-dir], AC_HELP_STRING([--with-ooo-dir=DIR], [where the OpenOffice.org program files are installed]), [ac_ooo_libdir="${withval}/program" - ac_ooo_datadir="${withval}/program"]) + ac_ooo_datadir="${withval}/program" + ac_ooo_basisdir="${withval}/basis3.0"]) AC_ARG_WITH([ooo-libdir], AC_HELP_STRING([--with-ooo-libdir=DIR], [where the OpenOffice.org program libraries are installed (/program)]), @@ -542,6 +543,13 @@ AC_CHECK_FILE([$ac_ooo_datadir/types.rdb], [OFFICE_registry="$ac_ooo_datadir"/types.rdb], AC_MSG_ERROR([[types.rdb not found, try '--with-ooo-dir=OpenOffice.org_installation_path']])) +AC_FIND_FILE([offapi.rdb], + [$ac_ooo_basisdir/program $ac_ooo_libdir $ac_ooo_datadir], + offapi_dir) +if test "$offapi_dir" != "NO"; then + OFFICE_registry="$OFFICE_registry $offapi_dir/offapi.rdb" +fi + dnl Substitute the values AC_SUBST(OFFICE_SDK_includes) AC_SUBST(OFFICE_libadd) @@ -562,7 +570,7 @@ AC_ARG_ENABLE(exempi, ) if test x$enable_libexempi = xyes; then - KDE_PKG_CHECK_MODULES(EXEMPI, + KDE_PKG_CHECK_MODULES(EXEMPI, [exempi-2.0 >= 1.99.0], [have_exempi=yes], [have_exempi=no]) @@ -586,8 +594,8 @@ AC_ARG_ENABLE(poppler, ) if test x$enable_libpoppler = xyes; then - KDE_PKG_CHECK_MODULES(POPPLER, - [poppler-qt >= 0.5], + KDE_PKG_CHECK_MODULES(POPPLER, + [poppler-tqt >= 0.5], [have_poppler=yes], [have_poppler=no]) AC_SUBST(POPPLER_LIBS) @@ -609,12 +617,32 @@ AC_ARG_ENABLE(webcam, [enable_webcam=no] ) +if test x$enable_webcam = xyes; then + KDE_CHECK_HEADERS([linux/videodev.h], + [], + [enable_webcam="no"]) +fi + AM_CONDITIONAL(ENABLE_WEBCAM, test $enable_webcam = yes) if test x$enable_webcam = xyes; then AC_DEFINE(ENABLE_WEBCAM, 1, [Define to 1 if webcam support is enabled]) fi dnl ---------- END WEBCAM CHECK ---------- + +dnl ---------- SAX CHECK ---------- + +AC_ARG_ENABLE(sax, + AC_HELP_STRING([--enable-sax], [enable SAX document loading (experimental), default=disable]), + [enable_sax=$enableval], + [enable_sax=no] +) + +if test x$enable_sax = xyes; then + AC_DEFINE(SAX_SUPPORT, 1, [Define to 1 if the XML loader should use SAX]) +fi + +dnl ---------- END SAX CHECK ---------- KDE_CREATE_SUBDIRSLIST AC_CONFIG_FILES([ Makefile ]) AC_CONFIG_FILES([ doc/Makefile ]) diff --git a/configure.in.in b/configure.in.in index 8283d0d..c9fa660 100644 --- a/configure.in.in +++ b/configure.in.in @@ -2,7 +2,7 @@ KDE_ENABLE_HIDDEN_VISIBILITY -AM_INIT_AUTOMAKE(tellico,1.3.2.1) +AM_INIT_AUTOMAKE(tellico,1.3.6) dnl AM_KDE_MIN_VERSION(MIN-VERSION-MAJOR, MIN-VERSION-MINOR, MIN-VERSION-MICRO) dnl (taken from KMyMoney2) @@ -428,7 +428,8 @@ AC_ARG_WITH([ooo-dir], AC_HELP_STRING([--with-ooo-dir=DIR], [where the OpenOffice.org program files are installed]), [ac_ooo_libdir="${withval}/program" - ac_ooo_datadir="${withval}/program"]) + ac_ooo_datadir="${withval}/program" + ac_ooo_basisdir="${withval}/basis3.0"]) AC_ARG_WITH([ooo-libdir], AC_HELP_STRING([--with-ooo-libdir=DIR], [where the OpenOffice.org program libraries are installed (/program)]), @@ -479,6 +480,13 @@ AC_CHECK_FILE([$ac_ooo_datadir/types.rdb], [OFFICE_registry="$ac_ooo_datadir"/types.rdb], AC_MSG_ERROR([[types.rdb not found, try '--with-ooo-dir=OpenOffice.org_installation_path']])) +AC_FIND_FILE([offapi.rdb], + [$ac_ooo_basisdir/program $ac_ooo_libdir $ac_ooo_datadir], + offapi_dir) +if test "$offapi_dir" != "NO"; then + OFFICE_registry="$OFFICE_registry $offapi_dir/offapi.rdb" +fi + dnl Substitute the values AC_SUBST(OFFICE_SDK_includes) AC_SUBST(OFFICE_libadd) @@ -499,7 +507,7 @@ AC_ARG_ENABLE(exempi, ) if test x$enable_libexempi = xyes; then - KDE_PKG_CHECK_MODULES(EXEMPI, + KDE_PKG_CHECK_MODULES(EXEMPI, [exempi-2.0 >= 1.99.0], [have_exempi=yes], [have_exempi=no]) @@ -523,8 +531,8 @@ AC_ARG_ENABLE(poppler, ) if test x$enable_libpoppler = xyes; then - KDE_PKG_CHECK_MODULES(POPPLER, - [poppler-qt >= 0.5], + KDE_PKG_CHECK_MODULES(POPPLER, + [poppler-tqt >= 0.5], [have_poppler=yes], [have_poppler=no]) AC_SUBST(POPPLER_LIBS) @@ -546,9 +554,36 @@ AC_ARG_ENABLE(webcam, [enable_webcam=no] ) +if test x$enable_webcam = xyes; then + KDE_CHECK_HEADERS([linux/videodev.h], + [], + [enable_webcam="no"]) +fi + AM_CONDITIONAL(ENABLE_WEBCAM, test $enable_webcam = yes) if test x$enable_webcam = xyes; then AC_DEFINE(ENABLE_WEBCAM, 1, [Define to 1 if webcam support is enabled]) fi dnl ---------- END WEBCAM CHECK ---------- + +dnl ---------- SAX CHECK ---------- + +AC_ARG_ENABLE(sax, + AC_HELP_STRING([--enable-sax], [enable SAX document loading (experimental), default=disable]), + [enable_sax=$enableval], + [enable_sax=no] +) + +if test x$enable_sax = xyes; then + AC_DEFINE(SAX_SUPPORT, 1, [Define to 1 if the XML loader should use SAX]) +fi + +dnl ---------- END SAX CHECK ---------- + +dnl -------- fix TQTDCOPIDLNG --------- +if test "$kde_cv_tqt" = "no"; then + if test -z "$TQTDCOPIDLNG"; then + KDE_FIND_PATH(dcopidlng, TQTDCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)]) + fi +fi diff --git a/po/README b/po/README index 29c6eff..f277363 100644 --- a/po/README +++ b/po/README @@ -2,4 +2,22 @@ To regenerate the message strings, type make package-messages -from the top-level directory +from the top-level directory. + +Please note that you need a special for KDE patched version of xgettext. You +can obtain it from http://packages.ubuntu.com/de/edgy/gettext-kde. Don't forget +to make this binary available as xgettext (instead of kde-xgettext) by e.g. +creating a link in your search path. + +If you don't do this, code such as i18n("Comic Book Illustrator", "Artist") +would correspond to two separate strings "Comic Book Illustrator" and +"Artist" instead of a combined entry from which only the second one has to be +translated: + +msgid "" +"_: Comic Book Illustrator\n" +"Artist" +msgstr "Künstler" + +You also need the tool extractrc. In Debian it is available in the package +tdesdk-scripts. diff --git a/po/de.po b/po/de.po index e7264ef..e90efc5 100644 --- a/po/de.po +++ b/po/de.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: de\n" "POT-Creation-Date: 2008-01-26 10:52-0800\n" -"PO-Revision-Date: 2008-01-25 10:34+0100\n" +"PO-Revision-Date: 2008-05-24 22:47+0200\n" "Last-Translator: Jens Seidel \n" "Language-Team: german \n" "MIME-Version: 1.0\n" @@ -1094,7 +1094,7 @@ msgstr "Mechanismus" #: collections/boardgamecollection.cpp:66 msgid "Designer" -msgstr "" +msgstr "Designer" #: collections/boardgamecollection.cpp:72 msgid "Number of Players" @@ -1792,7 +1792,7 @@ msgstr "" #: fetch/discogsfetcher.cpp:718 msgid "Discogs Link" -msgstr "" +msgstr "Discogs-Link" #: newstuff/dialog.cpp:94 msgid "Get Hot New Stuff" @@ -1986,9 +1986,8 @@ msgid "Scanning audio files..." msgstr "Taste Audio-Dateien ab ..." #: translators/audiofileimporter.cpp:129 -#, fuzzy msgid "Bitrate" -msgstr "Bibtex" +msgstr "Bitrate" #: translators/audiofileimporter.cpp:160 translators/audiofileimporter.cpp:170 msgid "Tracks (Disc %1)" @@ -2023,14 +2022,12 @@ msgstr "" #: translators/audiofileimporter.cpp:352 msgid "Include &bitrate" -msgstr "" +msgstr "&Bitrate inkludieren" #: translators/audiofileimporter.cpp:353 -#, fuzzy msgid "If checked, the bitrate for each track is added to the entries." msgstr "" -"Wenn markiert, werden die Datei-Namen für jede Spur zu den Einträgen " -"hinzugefügt." +"Wenn markiert, wird die Bitrate für jede Spur zu den Einträgen hinzugefügt." #: translators/csvexporter.cpp:40 msgid "CSV" @@ -5369,7 +5366,7 @@ msgstr "Copac (Großbritannien und Irland)" #: scripts.cpp:2 msgid "BoardGameGeek" -msgstr "" +msgstr "BoardGameGeek" #: scripts.cpp:4 msgid "Dark Horse Comics" diff --git a/po/it.po b/po/it.po index 98d695d..5543d35 100644 --- a/po/it.po +++ b/po/it.po @@ -1,33 +1,35 @@ -# translation of it.po to Italiano +# translation of v0.9_edited_it.po to Italiano # Copyright (C) 2001-2002, Robby Stephenson # This file is distributed under the same license as the Tellico package. +# # First translation by FaUsT , 2002, 2003, 2004. # Lorenzo Novaro , 2004, 2005. -# +# Pompa , 2008. msgid "" msgstr "" -"Project-Id-Version: it\n" +"Project-Id-Version: v0.9_edited_it\n" "POT-Creation-Date: 2008-01-26 10:52-0800\n" -"PO-Revision-Date: 2005-10-12 18:20+0200\n" -"Last-Translator: Lorenzo Novaro \n" -"Language-Team: Italiano \n" +"PO-Revision-Date: 2008-12-08 18:06+0900\n" +"Last-Translator: Pompa \n" +"Language-Team: Italiano \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" -"X-Generator: KBabel 1.10.2\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #: cite/lyxpipe.cpp:50 msgid "Tellico is unable to write to the server pipe at %1." -msgstr "Tellico non riesce a scrivere sulla server pipe in %1." +msgstr "Tellico non è riuscito a scrivere sulla server pipe in %1." #: cite/openoffice.cpp:82 msgid "Connecting to OpenOffice.org..." -msgstr "" +msgstr "Connessione a OpenOffice.org..." #: cite/openoffice.cpp:165 cite/openoffice.cpp:186 msgid "OpenOffice.org Connection" -msgstr "" +msgstr "Connessione a OpenOffice.org" #: cite/openoffice.cpp:179 msgid "" @@ -35,72 +37,72 @@ msgid "" "connection settings below, and that OpenOffice.org Writer is currently " "running." msgstr "" +"Tellico non è stato in grado di connettersi ad OpenOffice.org. Per favore " +"verifica i parametri di connessione sottostanti, e che OpenOffice.org Word " +"Processor sia in esecuzione." #: cite/openoffice.cpp:191 -#, fuzzy msgid "Pipe" -msgstr "Gente" +msgstr "Pipe" #: cite/openoffice.cpp:193 msgid "TCP/IP" -msgstr "" +msgstr "TCP/IP" #: gui/tablefieldwidget.cpp:181 #, fuzzy msgid "Rename Column" -msgstr "Rinomina Collezione" +msgstr "Rinomina Colonna" #: gui/tablefieldwidget.cpp:181 #, fuzzy msgid "New column name:" -msgstr "Nuovo nome della collezione:" +msgstr "Nome della nuova colonna:" #: gui/tablefieldwidget.cpp:206 -#, fuzzy, c-format +#, c-format msgid "Column %1" -msgstr "Colonna:" +msgstr "Colonna %1" #: gui/tablefieldwidget.cpp:241 gui/tablefieldwidget.cpp:289 #, fuzzy msgid "Rename Column..." -msgstr "&Rinomina Collezione ..." +msgstr "Rinomina Colonna..." #: gui/tablefieldwidget.cpp:274 msgid "Insert Row" -msgstr "" +msgstr "Inserisci Riga" #: gui/tablefieldwidget.cpp:276 #, fuzzy msgid "Remove Row" -msgstr "Rimuo&vi" +msgstr "Rimuovi Riga" #: gui/tablefieldwidget.cpp:278 msgid "Move Row Up" -msgstr "" +msgstr "Sposta Riga in alto" #: gui/tablefieldwidget.cpp:283 msgid "Move Row Down" -msgstr "" +msgstr "Sposta Riga in basso" #: gui/tablefieldwidget.cpp:295 -#, fuzzy msgid "Clear Table" -msgstr "Cancella filtro" +msgstr "Pulisci tabella" #: gui/previewdialog.cpp:27 -#, fuzzy msgid "Template Preview" -msgstr "Template" +msgstr "Anteprima template" #: gui/stringmapdialog.cpp:57 msgid "&Set" -msgstr "&Set" +msgstr "&Configura" #: gui/fieldwidget.cpp:101 gui/fieldwidget.cpp:195 msgid "" "_: Edit Label\n" "%1:" -msgstr "" +msgstr "%1:" #: gui/kwidgetlister.cpp:58 msgid "" @@ -118,38 +120,38 @@ msgstr "Meno" msgid "" "_: clear widgets\n" "Clear" -msgstr "Cancella" +msgstr "Pulisci" #: gui/imagewidget.cpp:57 msgid "Select Image..." -msgstr "Seleziona immagine ..." +msgstr "Seleziona immagine..." #: gui/imagewidget.cpp:63 msgid "Save link only" -msgstr "" +msgstr "Salva solo collegamento" #: gui/imagewidget.cpp:162 msgid "Saving a link is only possible for newly added images." -msgstr "" +msgstr "Salvare il collegamento è possibile soltanto per le immagini aggiunte successivamente" #: commands/modifyentries.cpp:73 commands/updateentries.cpp:50 -#, fuzzy, c-format +#, c-format msgid "" "_: Modify (Entry Title)\n" "Modify %1" -msgstr "Salva %1" +msgstr "Modifica %1" #: commands/collectioncommand.cpp:110 msgid "Append Collection" -msgstr "Collega Collezione" +msgstr "Collega collezione" #: commands/collectioncommand.cpp:112 msgid "Merge Collection" -msgstr "Incorpora Collezione" +msgstr "Incorpora collezione" #: commands/collectioncommand.cpp:114 msgid "Replace Collection" -msgstr "Rimpiazza Collezione" +msgstr "Rimpiazza collezione" #: commands/modifyentries.cpp:72 entryeditdialog.cpp:365 #, fuzzy @@ -158,27 +160,26 @@ msgstr "Modifica elementi" #: commands/fieldcommand.cpp:104 msgid "Add %1 Field" -msgstr "Aggiungi %1 campo" +msgstr "Aggiungi il campo %1" #: commands/fieldcommand.cpp:106 msgid "Modify %1 Field" -msgstr "Modifica %1 campo" +msgstr "Modifica il campo %1" #: commands/fieldcommand.cpp:108 msgid "Delete %1 Field" -msgstr "Cancella %1 campo" +msgstr "Cancella il campo %1" #: commands/addentries.cpp:50 -#, fuzzy msgid "Add Entries" -msgstr "Modifica elementi" +msgstr "Aggiungi elementi" #: commands/addentries.cpp:51 -#, fuzzy, c-format +#, c-format msgid "" "_: Add (Entry Title)\n" "Add %1" -msgstr "Salva %1" +msgstr "Aggiungi %1" #: commands/renamecollection.cpp:45 tellico_kernel.cpp:323 msgid "Rename Collection" @@ -198,18 +199,18 @@ msgstr "Modifica filtro" #: commands/filtercommand.cpp:102 filterview.cpp:70 msgid "Delete Filter" -msgstr "Cancella campo" +msgstr "Cancella filtro" #: commands/addloans.cpp:108 msgid "Check-out Items" -msgstr "Verifica oggetti" +msgstr "Presta oggetti" #: commands/addloans.cpp:109 #, c-format msgid "" "_: Check-out (Entry Title)\n" "Check-out %1" -msgstr "Verifica %1" +msgstr "Presta %1" #: commands/removeentries.cpp:48 msgid "Delete Entries" @@ -228,14 +229,14 @@ msgstr "Riordina campi" #: commands/removeloans.cpp:79 msgid "Check-in Entries" -msgstr "Registra elementi" +msgstr "Riconsegnato" #: commands/removeloans.cpp:80 #, c-format msgid "" "_: Check-in (Entry Title)\n" "Check-in %1" -msgstr "Registra %1" +msgstr "Riconsegna di %1" #: collectionfactory.cpp:83 collections/bibtexcollection.cpp:24 #: collections/bibtexcollection.cpp:58 collections/bibtexcollection.cpp:88 @@ -302,7 +303,7 @@ msgstr "Anno di emissione" #: collections/stampcollection.cpp:66 collections/videocollection.cpp:172 msgid "Color" -msgstr "A colori" +msgstr "Colore" #: collections/stampcollection.cpp:71 msgid "Scott#" @@ -312,22 +313,20 @@ msgstr "Scott#" msgid "" "_: Stamp grade levels - Superb,Extremely Fine,Very Fine,Fine,Average,Poor\n" "Superb,Extremely Fine,Very Fine,Fine,Average,Poor" -msgstr "" -"Mint,Near Mint,Molto soddisfacente,Soddisfacente,Molto " -"buono,Buono,Insomma,Cattivo" +msgstr "Superbo,Eccellente,Molto buono,Buono,Medio,Cattivo" #: collections/coincollection.cpp:88 collections/stampcollection.cpp:80 msgid "Grade" -msgstr "Grado" +msgstr "Stato" #: collections/stampcollection.cpp:85 msgid "Cancelled" -msgstr "Cancellato" +msgstr "Annullato" #. TRANSLATORS: See http://en.wikipedia.org/wiki/Stamp_hinge #: collections/stampcollection.cpp:90 msgid "Hinged" -msgstr "Incollato (Hinged)" +msgstr "Linguellato" #: collections/stampcollection.cpp:95 msgid "Centering" @@ -335,7 +334,7 @@ msgstr "Centratura" #: collections/stampcollection.cpp:100 msgid "Gummed" -msgstr "Adesivo" +msgstr "Gommato" #: collections/boardgamecollection.cpp:85 collections/bookcollection.cpp:64 #: collections/cardcollection.cpp:82 collections/coincollection.cpp:103 @@ -351,12 +350,12 @@ msgstr "Data di acquisto" #: collections/musiccollection.cpp:95 collections/stampcollection.cpp:110 #: collections/videocollection.cpp:199 collections/winecollection.cpp:84 msgid "Purchase Price" -msgstr "Prezzo" +msgstr "Prezzo d'acquisto" #: collections/cardcollection.cpp:91 collections/coincollection.cpp:112 #: collections/stampcollection.cpp:114 collections/winecollection.cpp:88 msgid "Location" -msgstr "Provenienza" +msgstr "Collocazione" #: collections/boardgamecollection.cpp:90 collections/bookcollection.cpp:155 #: collections/cardcollection.cpp:96 collections/coincollection.cpp:118 @@ -406,7 +405,7 @@ msgstr "Sceneggiatore" msgid "" "_: Comic Book Illustrator\n" "Artist" -msgstr "" +msgstr "Disegnatore" #: collections/bibtexcollection.cpp:200 collections/bookcollection.cpp:132 #: collections/cardcollection.cpp:71 collections/comicbookcollection.cpp:62 @@ -415,7 +414,7 @@ msgstr "Collana" #: collections/comicbookcollection.cpp:68 msgid "Issue" -msgstr "Serie" +msgstr "Numero" #: collections/bibtexcollection.cpp:120 collections/boardgamecollection.cpp:60 #: collections/bookcollection.cpp:73 collections/comicbookcollection.cpp:73 @@ -459,9 +458,7 @@ msgid "" "_: Comic book grade levels - Mint,Near Mint,Very Fine,Fine,Very " "Good,Good,Fair,Poor\n" "Mint,Near Mint,Very Fine,Fine,Very Good,Good,Fair,Poor" -msgstr "" -"Mint,Near Mint,Molto soddisfacente,Soddisfacente,Molto " -"buono,Buono,Insomma,Cattivo" +msgstr "Perfetto,Edicola,Ottimo,Buono/Ottimo,Buono,Discreto" #: collections/bookcollection.cpp:147 collections/comicbookcollection.cpp:135 msgid "Signed" @@ -495,11 +492,11 @@ msgstr "Anno" #: collections/coincollection.cpp:61 msgid "Mint Mark" -msgstr "Mint" +msgstr "Segno di zecca" #: collections/coincollection.cpp:73 msgid "Coin Set" -msgstr "Set di monete" +msgstr "Serie" #: collections/coincollection.cpp:83 msgid "" @@ -509,10 +506,7 @@ msgid "" "Proof-65,Proof-60,Mint State-65,Mint State-60,Almost Uncirculated-55,Almost " "Uncirculated-50,Extremely Fine-40,Very Fine-30,Very Fine-20,Fine-12,Very " "Good-8,Good-4,Fair" -msgstr "" -"Fior di conio-65,Fior di conio-60,Fior di " -"conio-65,Splendida-60,Splendida-55,Splendida-50,Bellissima-40,Bellissima-30,M" -"olto bella-20,Molto bella-12,Bella-8,Bella-4,Fair" +msgstr "Fondo specchio (FS),Fior di conio (FDC),Splendido (SPL),Bellissimo (BB),Molto bello (MB),Bello (B),Discreto (D)" #: collections/coincollection.cpp:96 msgid "" @@ -522,15 +516,15 @@ msgstr "PCGS,NGC,ANACS,ICG,ASA,PCI" #: collections/coincollection.cpp:98 msgid "Grading Service" -msgstr "SeErvizi di valutazione" +msgstr "Servizi di valutazione" #: collections/coincollection.cpp:122 msgid "Obverse" -msgstr "Osserva" +msgstr "Dritto (Recto)" #: collections/coincollection.cpp:125 msgid "Reverse" -msgstr "Seconda faccia" +msgstr "Rovescio (Verso)" #: collections/bookcollection.cpp:28 msgid "My Books" @@ -558,11 +552,11 @@ msgstr "E-Book" #: collections/bookcollection.cpp:58 msgid "Magazine" -msgstr "Rivista" +msgstr "Periodico" #: collections/bibtexcollection.cpp:157 collections/bookcollection.cpp:58 msgid "Journal" -msgstr "Giornale" +msgstr "Rivista" #: collections/bookcollection.cpp:59 msgid "Binding" @@ -575,24 +569,24 @@ msgstr "Copyright (anno)" #: collections/bibtexcollection.cpp:151 collections/bookcollection.cpp:95 #: translators/grs1importer.cpp:57 translators/risimporter.cpp:278 msgid "ISBN#" -msgstr "num. ISBN" +msgstr "Num. ISBN" #: collections/bibtexcollection.cpp:154 collections/bookcollection.cpp:97 #: translators/grs1importer.cpp:59 translators/risimporter.cpp:282 msgid "International Standard Book Number" -msgstr "Numero Standard Internazionale per i libri" +msgstr "Numero Standard Internazionale per i libri (International Standard Book Number)" #: collections/bookcollection.cpp:100 msgid "LCCN#" -msgstr "num. LCCN" +msgstr "Num. LCCN" #: collections/bookcollection.cpp:102 msgid "Library of Congress Control Number" -msgstr "Numero di Controllo della Biblioteca del Congresso" +msgstr "Numero di Controllo della Biblioteca del Congresso (Library of Congress Control Number)" #: collections/bookcollection.cpp:109 msgid "Translator" -msgstr "" +msgstr "Traduttore" #: collections/bookcollection.cpp:137 msgid "Series Number" @@ -619,7 +613,7 @@ msgstr "Voto" #: collections/filecatalog.cpp:25 #, fuzzy msgid "My Files" -msgstr "I miei vini" +msgstr "I miei File" #: borrowerdialog.cpp:49 collections/filecatalog.cpp:36 #: newstuff/dialog.cpp:113 @@ -639,45 +633,42 @@ msgstr "Volume" #: collections/filecatalog.cpp:55 #, fuzzy msgid "Folder" -msgstr "Filtro" +msgstr "Cartella" #: collections/filecatalog.cpp:60 msgid "Mimetype" -msgstr "" +msgstr "Tipo MIME" #: collections/filecatalog.cpp:65 #, fuzzy msgid "Size" -msgstr "Autografato" +msgstr "Dimensioni" #: collections/filecatalog.cpp:69 #, fuzzy msgid "Permissions" -msgstr "Persona" +msgstr "Permessi" #: collections/filecatalog.cpp:74 #, fuzzy msgid "Owner" -msgstr "Altro" +msgstr "Proprietario" #: collections/filecatalog.cpp:79 -#, fuzzy msgid "Group" -msgstr "Raggruppa per:" +msgstr "Gruppo" #: collections/filecatalog.cpp:85 -#, fuzzy msgid "Created" -msgstr "Finito" +msgstr "Data creazione" #: collections/filecatalog.cpp:89 -#, fuzzy msgid "Modified" -msgstr "Modifica campi" +msgstr "Ultima modifica" #: collections/filecatalog.cpp:93 msgid "Meta Info" -msgstr "" +msgstr "Meta informazioni" #: collectionfieldsdialog.cpp:873 collections/filecatalog.cpp:95 msgid "Property" @@ -688,9 +679,8 @@ msgid "Value" msgstr "Valore" #: collections/filecatalog.cpp:99 -#, fuzzy msgid "Icon" -msgstr "Icone" +msgstr "Icona" #: collections/winecollection.cpp:26 msgid "My Wines" @@ -702,7 +692,7 @@ msgstr "Produttore" #: collections/winecollection.cpp:49 msgid "Appellation" -msgstr "Denominazione " +msgstr "Denominazione" #: collections/winecollection.cpp:55 msgid "Varietal" @@ -730,7 +720,7 @@ msgstr "Quantità" #: collections/winecollection.cpp:97 msgid "Drink By" -msgstr "Da bere" +msgstr "Da bere per" #: collections/winecollection.cpp:111 msgid "Label Image" @@ -742,7 +732,7 @@ msgstr "Altre persone" #: collections/videocollection.cpp:21 fetch/animenfofetcher.cpp:271 msgid "Features" -msgstr "Features" +msgstr "Caratteristiche" #: collections/videocollection.cpp:28 msgid "My Videos" @@ -766,12 +756,12 @@ msgstr "DivX" #: collections/videocollection.cpp:46 fetch/amazonfetcher.cpp:823 msgid "Blu-ray" -msgstr "" +msgstr "Blu-ray" #: collections/videocollection.cpp:46 fetch/amazonfetcher.cpp:826 #, fuzzy msgid "HD DVD" -msgstr "DVD" +msgstr "HD DVD" #: collections/musiccollection.cpp:45 collections/videocollection.cpp:47 msgid "Medium" @@ -785,13 +775,11 @@ msgstr "Anno di produzione" msgid "" "_: Movie ratings - G (USA),PG (USA),PG-13 (USA),R (USA), U (USA)\n" "G (USA),PG (USA),PG-13 (USA),R (USA), U (USA)" -msgstr "" -"Per tutti -G (USA),Da vedere con un adulto -PG (USA),Vietato ai minori di 13 " -"anni -PG-13 (USA),Vietato ai minori di 17 anni -R (USA)" +msgstr "T,V.M. 14,V.M. 16,V.M. 18" #: collections/videocollection.cpp:62 msgid "Certification" -msgstr "Certificazione" +msgstr "Visto censura" #: collections/videocollection.cpp:74 msgid "Region 1" @@ -855,16 +843,16 @@ msgstr "Cast" #: collections/videocollection.cpp:102 translators/tellicoimporter.cpp:443 msgid "Actor/Actress" -msgstr "" +msgstr "Attore/Attrice" #: collections/videocollection.cpp:103 translators/tellicoimporter.cpp:444 #, fuzzy msgid "Role" -msgstr "Volume" +msgstr "Ruolo" #: collections/videocollection.cpp:106 msgid "A table for the cast members, along with the roles they play" -msgstr "Una tabella comprendente gli attori del cast con i ruoli interpretati" +msgstr "Una tabella per gli attori che compongono il cast con i ruoli che interpretano" #: collections/videocollection.cpp:109 msgid "Director" @@ -880,7 +868,7 @@ msgstr "Studio" #: collections/videocollection.cpp:139 msgid "Language Tracks" -msgstr "Lingue del sonoro" +msgstr "Lingue audio" #: collections/videocollection.cpp:145 msgid "Subtitle Languages" @@ -896,7 +884,7 @@ msgstr "Durata" #: collections/videocollection.cpp:159 msgid "The running time of the video (in minutes)" -msgstr "La durata del video in minuti" +msgstr "La durata del video (in minuti)" #: collections/videocollection.cpp:162 msgid "Aspect Ratio" @@ -905,7 +893,7 @@ msgstr "Tipo di visualizzazione" #: collections/videocollection.cpp:167 fetch/amazonfetcher.cpp:815 #: translators/tellicoimporter.cpp:958 msgid "Widescreen" -msgstr "Grande schermo" +msgstr "Widescreen" #: collections/videocollection.cpp:172 msgid "Black & White" @@ -913,7 +901,7 @@ msgstr "Bianco e nero" #: collections/videocollection.cpp:173 msgid "Color Mode" -msgstr "Modalità a colori" +msgstr "Colori" #: collections/videocollection.cpp:178 fetch/amazonfetcher.cpp:830 msgid "Director's Cut" @@ -939,7 +927,7 @@ msgstr "I miei giochi" #: collections/gamecollection.cpp:44 #, fuzzy msgid "Xbox 360" -msgstr "Xbox" +msgstr "Xbox 360" #: collections/gamecollection.cpp:44 msgid "Xbox" @@ -948,7 +936,7 @@ msgstr "Xbox" #: collections/gamecollection.cpp:45 #, fuzzy msgid "PlayStation3" -msgstr "PlayStation" +msgstr "PlayStation3" #: collections/gamecollection.cpp:45 msgid "PlayStation2" @@ -967,7 +955,7 @@ msgstr "PSP" #: collections/gamecollection.cpp:46 #, fuzzy msgid "Nintendo Wii" -msgstr "Regione" +msgstr "Nintendo Wii" #: collections/gamecollection.cpp:46 msgid "Nintendo DS" @@ -1005,7 +993,7 @@ msgstr "Mac OS" #: collections/gamecollection.cpp:48 msgid "Linux" -msgstr "" +msgstr "Linux" #: collections/gamecollection.cpp:49 msgid "Platform" @@ -1013,13 +1001,13 @@ msgstr "Piattaforma" #: collections/boardgamecollection.cpp:55 collections/gamecollection.cpp:60 msgid "Release Year" -msgstr "Anno di pubblicazione" +msgstr "Anno" #: collections/gamecollection.cpp:65 msgid "" "_: Games - Publisher\n" "Publisher" -msgstr "Casa editrice" +msgstr "Produttore" #: collections/gamecollection.cpp:71 msgid "Developer" @@ -1031,12 +1019,12 @@ msgid "" "Childhood, Pending\n" "Unrated, Adults Only, Mature, Teen, Everyone, Early Childhood, Pending" msgstr "" -"Non classificato, Pubblico Adulto, Teenager, Per tutti, Per bambini, " +"Non classificato,Pubblico Adulto,Adolescenti,Per tutti,Per bambini," "Classificazione in corso" #: collections/gamecollection.cpp:82 msgid "ESRB Rating" -msgstr "ESRB Rating" +msgstr "Classificazione ESRB" #: collections/gamecollection.cpp:95 msgid "Completed" @@ -1064,7 +1052,7 @@ msgstr "Numero della carta" #: collections/cardcollection.cpp:77 msgid "Card Type" -msgstr "Tipo della carta" +msgstr "Tipo di carta" #: collections/cardcollection.cpp:109 msgid "Front Image" @@ -1077,20 +1065,20 @@ msgstr "Immagine posteriore" #: collections/boardgamecollection.cpp:26 #, fuzzy msgid "My Board Games" -msgstr "I miei giochi" +msgstr "I miei giochi da tavolo" #: collections/boardgamecollection.cpp:49 msgid "Mechanism" -msgstr "" +msgstr "Meccanismo" #: collections/boardgamecollection.cpp:66 msgid "Designer" -msgstr "" +msgstr "Ideatore" #: collections/boardgamecollection.cpp:72 #, fuzzy msgid "Number of Players" -msgstr "Elementi totali: %1" +msgstr "Numero di giocatori" #: collectionfactory.cpp:125 collections/bibtexcollection.cpp:30 msgid "Bibliography" @@ -1129,11 +1117,11 @@ msgstr "Indirizzo" #: collections/bibtexcollection.cpp:164 fetch/fetchmanager.cpp:73 msgid "DOI" -msgstr "" +msgstr "DOI" #: collections/bibtexcollection.cpp:167 msgid "Digital Object Identifier" -msgstr "" +msgstr "Digital Object Identifier" #: collections/bibtexcollection.cpp:172 msgid "Month" @@ -1202,13 +1190,13 @@ msgstr "Tracce" #: collections/musiccollection.cpp:78 translators/audiofileimporter.cpp:166 #: translators/tellicoimporter.cpp:441 msgid "Length" -msgstr "" +msgstr "Durata" #: core/tellico_config.cpp:134 msgid "" "a,an,and,as,at,but,by,for,from,in,into,nor,of,off,on,onto,or,out,over,the,to," "up,with" -msgstr "uno,un,una,un',in,di,del,della,il,la,lo,a" +msgstr "uno,un,una,un',in,di,del,della,il,la,lo,a,i,gli,le" #: core/tellico_config.cpp:137 msgid "the" @@ -1224,7 +1212,7 @@ msgstr "de,De,di,Di,van,der,van der,von,mc" #: fetch/isbndbfetcher.cpp:54 msgid "ISBNdb.com" -msgstr "" +msgstr "ISBNdb.com" #: fetch/amazonfetcher.cpp:192 fetch/animenfofetcher.cpp:75 #: fetch/arxivfetcher.cpp:83 fetch/bibsonomyfetcher.cpp:66 @@ -1250,9 +1238,8 @@ msgid "Entrez Database" msgstr "Database Entrez" #: fetch/entrezfetcher.cpp:485 -#, fuzzy msgid "Institution" -msgstr "Condizioni" +msgstr "Istituzione" #: fetch/z3950connection.cpp:132 msgid "Query error!" @@ -1260,7 +1247,7 @@ msgstr "Errore nella query!" #: fetch/z3950connection.cpp:173 msgid "Connection search error %1: %2" -msgstr "Connection search error %1: %2" +msgstr "Errore di connessione %1: %2" #: fetch/z3950connection.cpp:250 msgid "Record syntax error" @@ -1268,12 +1255,11 @@ msgstr "Errore nella sintassi dell'elemento" #: fetch/z3950connection.cpp:345 msgid "Connection error %1: %2" -msgstr "Errore nella connessione %1: %2" +msgstr "Errore di connessione %1: %2" #: fetch/srufetcher.cpp:72 -#, fuzzy msgid "SRU Server" -msgstr "Ripristinare" +msgstr "Server SRU" #: fetch/srufetcher.cpp:405 z3950.cpp:2 msgid "Library of Congress (US)" @@ -1295,20 +1281,17 @@ msgid "&Port: " msgstr "&Porta: " #: fetch/srufetcher.cpp:445 fetch/z3950fetcher.cpp:520 -#, fuzzy, c-format +#, c-format msgid "Enter the port number of the server. The default is %1." -msgstr "" -"Inserisci il numero della porta del server z39.50. La porta di default è %1." +msgstr "Inserisci il numero della porta del server. La porta di default è %1." #: fetch/srufetcher.cpp:450 -#, fuzzy msgid "Path: " -msgstr "&Porta: " +msgstr "Path:" #: fetch/srufetcher.cpp:455 -#, fuzzy msgid "Enter the path to the database used by the server." -msgstr "Inserisci il nome del database usato dal server z39.50." +msgstr "Inserisci il nome del database usato dal server" #: fetch/srufetcher.cpp:460 #, fuzzy @@ -1316,23 +1299,21 @@ msgid "Format: " msgstr "Formato" #: fetch/srufetcher.cpp:468 -#, fuzzy msgid "Enter the result format used by the server." -msgstr "Inserisci il nome del database usato dal server z39.50." +msgstr "Scegli il formato usato dal server." #: fetch/yahoofetcher.cpp:54 msgid "Yahoo! Audio Search" -msgstr "" +msgstr "Yahoo! Audio Search" #: fetch/amazonfetcher.cpp:730 fetch/discogsfetcher.cpp:539 #: fetch/yahoofetcher.cpp:242 msgid "The cover image could not be loaded." -msgstr "Immagine di copertina non caricata." +msgstr "L'immagine di copertina non è stata caricata." #: fetch/amazonfetcher.cpp:53 -#, fuzzy msgid "Amazon Link" -msgstr "Amazon (Giappone)" +msgstr "Link Amazon" #: fetch/amazonfetcher.cpp:62 msgid "Amazon (US)" @@ -1424,38 +1405,36 @@ msgid "" "The cover image may be downloaded as well. However, too many large images in " "the collection may degrade performance." msgstr "" -"L'immagine di copertina può essere scaricata. Inserire troppe immagini " -"grandi nella collezione può però peggiorare le performance." +"L'immagine di copertina può essere scaricata comunque. Inserire troppe immagini " +"grandi nella collezione può però peggiorare le prestazioni." #: fetch/amazonfetcher.cpp:881 msgid "&Associate's ID: " -msgstr "ID del &socio: " +msgstr "ID &utente: " #: fetch/amazonfetcher.cpp:886 msgid "" "The associate's id identifies the person accessing the Amazon.com Web " "Services, and is included in any links to the Amazon.com site." msgstr "" -"L'ID del socio identifica la persona che accede ai servizi di Amazon.com ed " -"incluso in tutti i link al sito Amazon.com." +"L'ID utente identifica la persona che accede ai servizi di Amazon.com ed " +"incluso in tutti i link al sito." #: fetch/z3950fetcher.cpp:79 fetch/z3950fetcher.cpp:755 -#, fuzzy msgid "z39.50 Server" -msgstr "z39.50" +msgstr "Server z39.50" #: fetch/z3950fetcher.cpp:494 msgid "Use preset &server:" -msgstr "" +msgstr "Usa &server predefinito:" #: fetch/z3950fetcher.cpp:525 msgid "&Database: " msgstr "&Database: " #: fetch/z3950fetcher.cpp:530 -#, fuzzy msgid "Enter the database name used by the server." -msgstr "Inserisci il nome del database usato dal server z39.50." +msgstr "Inserisci il nome del database usato dal server." #: fetch/z3950fetcher.cpp:535 msgid "Ch&aracter set: " @@ -1465,9 +1444,7 @@ msgstr "Set di c&aratteri: " msgid "" "Enter the character set encoding used by the z39.50 server. The most likely " "choice is MARC-8, although ISO-8859-1 is common as well." -msgstr "" -"Inserisci il set di caratteri utilizzato dal server z39.50. La scelta più " -"probabile è MARC-8, anche se ISO-8859-1 è altrettanto comune." +msgstr "Inserisci il set di caratteri utilizzato dal server z39.50. Generalmente i server utilizzano MARC-8. Anche ISO-8859-1 è piuttosto comune." #: fetch/z3950fetcher.cpp:550 #, fuzzy @@ -1476,13 +1453,16 @@ msgstr "Formato" #: fetch/z3950fetcher.cpp:553 msgid "Auto-detect" -msgstr "" +msgstr "Rileva automaticamente" #: fetch/z3950fetcher.cpp:561 msgid "" "Enter the data format used by the z39.50 server. Tellico will attempt to " "automatically detect the best setting if auto-detect is selected." msgstr "" +"Inserisci il formato dati del server z39.50. Se è stato selezionato " +"rileva automaticamente Tellico cercherà automaticamente di rilevare le " +"migliori impostazioni." #: fetch/z3950fetcher.cpp:567 msgid "&User: " @@ -1497,7 +1477,7 @@ msgid "" "Enter the authentication user name used by the z39.50 database. Most servers " "do not need one." msgstr "" -"Inserisci lo username per l'autenticazione nel database z39.50. Per molti " +"Inserisci il nome utente per l'autenticazione nel database z39.50. Per molti " "server non è necessario." #: fetch/z3950fetcher.cpp:579 @@ -1512,11 +1492,12 @@ msgid "" "configuration file." msgstr "" "Inserisci la password di autenticazione utilizzata dal database z39.50. Per " -"molti server non è necessario." +"molti server non è necessario. La password verrà salvata in chiaro nel file " +"di configurazione di Tellico." #: fetch/z3950fetcher.cpp:670 msgid "Illustrator" -msgstr "" +msgstr "Illustrator" #: fetch/execexternalfetcher.cpp:82 msgid "External Application" @@ -1528,24 +1509,20 @@ msgid "Collection &type:" msgstr "&Tipo di collezione:" #: fetch/execexternalfetcher.cpp:351 -msgid "" -"Set the collection type of the data returned from the external application." -msgstr "" -"Seleziona il tipo di collezione per i dati forniti dal programma esterno." +msgid "Set the collection type of the data returned from the external application." +msgstr "Seleziona il tipo di collezione per i dati forniti dal programma esterno." #: fetch/execexternalfetcher.cpp:356 msgid "&Result type: " -msgstr "" +msgstr "Tipo di &risultato:" #: fetch/execexternalfetcher.cpp:365 -#, fuzzy msgid "Set the result type of the data returned from the external application." -msgstr "" -"Seleziona il tipo di collezione per i dati forniti dal programma esterno." +msgstr "Seleziona il tipo di risultato per i dati forniti dal programma esterno." #: fetch/execexternalfetcher.cpp:370 msgid "Application &path: " -msgstr "&path del programma: " +msgstr "&Path del programma: " #: fetch/execexternalfetcher.cpp:375 msgid "" @@ -1557,7 +1534,7 @@ msgstr "" #: fetch/execexternalfetcher.cpp:380 msgid "Select the search keys supported by the data source." -msgstr "" +msgstr "Seleziona le chiavi di ricerca supportate dalla fonte dei dati." #: fetch/execexternalfetcher.cpp:381 msgid "" @@ -1568,14 +1545,12 @@ msgstr "" "ricercate." #: fetch/execexternalfetcher.cpp:382 -#, fuzzy msgid "Arguments" -msgstr "&Argomenti: " +msgstr "&Argomenti" #: fetch/execexternalfetcher.cpp:415 newstuff/dialog.cpp:152 -#, fuzzy msgid "Update" -msgstr "&Cita elemento" +msgstr "&Aggiorna" #. TRANSLATORS: Do not translate %{author}. #: fetch/execexternalfetcher.cpp:423 @@ -1585,6 +1560,10 @@ msgid "" "where field values are contained inside braces, such as %{author}. " "See the documentation for details.

" msgstr "" +"

Inserisci gli argomenti da usare per ricercare gli aggiornamenti disponibili per " +"un elemento.

Il formato è lo stesso dei campi Dipendenti, in cui " +"il valore di un campo è racchiuso fra parentesi, come ad esempio %{author}. " +"Leggi la documentazione per ulteriori dettagli.

" #: fetch/configwidget.cpp:29 msgid "Source Options" @@ -1604,8 +1583,7 @@ msgid "Select IMDB Result" msgstr "Seleziona il risultato IMDB" #: fetch/imdbfetcher.cpp:581 -msgid "" -"Your search returned multiple matches. Please select one below." +msgid "Your search returned multiple matches. Please select one below." msgstr "" "La tua ricerca ha dato più di un risultato. Seleziona uno dei " "seguenti." @@ -1616,7 +1594,7 @@ msgstr "Seleziona un risultato." #: fetch/imdbfetcher.cpp:688 fetch/imdbfetcher.cpp:1185 msgid "IMDB Link" -msgstr "" +msgstr "Link IMDB" #: fetch/animenfofetcher.cpp:260 fetch/imdbfetcher.cpp:746 #: fetch/imdbfetcher.cpp:1187 @@ -1624,9 +1602,8 @@ msgid "Alternative Titles" msgstr "Titoli alternativi" #: fetch/imdbfetcher.cpp:947 fetch/imdbfetcher.cpp:1186 -#, fuzzy msgid "IMDB Rating" -msgstr "ESRB Rating" +msgstr "Valutazione IMDB" #: fetch/imdbfetcher.cpp:1065 fetch/imdbfetcher.cpp:1188 msgid "Certifications" @@ -1641,24 +1618,24 @@ msgstr "" "usare." #: fetch/imdbfetcher.cpp:1132 -#, fuzzy msgid "&Maximum cast: " -msgstr "Larghezza massima delle immagini:" +msgstr "Numero &massimo attori:" #: fetch/imdbfetcher.cpp:1137 msgid "" "The list of cast members may include many people. Set the maximum number " "returned from the search." msgstr "" +"La lista dei componenti del cast potrebbe includere molte persone. Scegli " +"un numero massimo per i risultati della ricerca." #: fetch/discogsfetcher.cpp:679 fetch/imdbfetcher.cpp:1142 -#, fuzzy msgid "Download cover &image" -msgstr "Scarica l'immagine di copertina" +msgstr "Scarica l'&immagine di copertina" #: fetch/ibsfetcher.cpp:47 msgid "Internet Bookshop (ibs.it)" -msgstr "" +msgstr "Internet Bookshop (ibs.it)" #: fetch/fetchmanager.cpp:69 msgid "Person" @@ -1670,7 +1647,7 @@ msgstr "ISBN" #: fetch/fetchmanager.cpp:71 msgid "UPC/EAN" -msgstr "" +msgstr "UPC/EAN" #: fetch/fetchmanager.cpp:72 msgid "Keyword" @@ -1678,11 +1655,11 @@ msgstr "Parola chiave" #: fetch/fetchmanager.cpp:74 translators/pdfimporter.cpp:173 msgid "arXiv ID" -msgstr "" +msgstr "arXiv ID" #: fetch/fetchmanager.cpp:75 msgid "Pubmed ID" -msgstr "" +msgstr "Pubmed ID" #: fetch/fetchmanager.cpp:76 msgid "Raw Query" @@ -1690,24 +1667,24 @@ msgstr "Query in modalità Raw" #: fetch/animenfofetcher.cpp:257 msgid "Original Title" -msgstr "" +msgstr "Titolo originale" #: fetch/animenfofetcher.cpp:264 #, fuzzy msgid "Distributor" -msgstr "Regista" +msgstr "Distributore" #: fetch/animenfofetcher.cpp:270 msgid "Episodes" -msgstr "" +msgstr "Episodi" #: fetch/arxivfetcher.cpp:53 msgid "arXiv.org" -msgstr "" +msgstr "arXiv.org" #: fetch/crossreffetcher.cpp:83 msgid "%1 requires a username and password." -msgstr "" +msgstr "%1 richiede un username e password." #: fetch/crossreffetcher.cpp:332 msgid "" @@ -1715,11 +1692,13 @@ msgid "" "conditions and request an " "account. Enter your OpenURL account information below." msgstr "" +"CrossRef richiede un account per accedere. Per favore leggi termini e condizioni " +"e richiedi un " +"account. Inserisci i tuoi dati OpenURL qui sotto." #: fetch/crossreffetcher.cpp:343 -#, fuzzy msgid "&Username: " -msgstr "&Utente: " +msgstr "Nome &Utente: " #: fetch/crossreffetcher.cpp:348 #, fuzzy @@ -1727,8 +1706,8 @@ msgid "" "A username and password is required to access the CrossRef service. The " "password is stored as plain text in the Tellico configuration file." msgstr "" -"Inserisci la password di autenticazione utilizzata dal database z39.50. Per " -"molti server non è necessario." +"Nome utente e password sono necessari per accedere ai servizi CrossRef. " +"La password verrà salvata in chiaro nel file di configurazione di Tellico." #: fetch/crossreffetcher.cpp:354 #, fuzzy @@ -1736,59 +1715,57 @@ msgid "&Password: " msgstr "Pass&word: " #: fetch/gcstarpluginfetcher.cpp:190 -#, fuzzy msgid "GCstar Plugin" -msgstr "GCstar" +msgstr "Plugin GCstar" #: fetch/gcstarpluginfetcher.cpp:404 -#, fuzzy msgid "Set the collection type of the data returned from the plugin." -msgstr "" -"Seleziona il tipo di collezione per i dati forniti dal programma esterno." +msgstr "Seleziona il tipo di collezione per i dati forniti dal plugin." #: fetch/gcstarpluginfetcher.cpp:409 msgid "&Plugin: " -msgstr "" +msgstr "&Plugin: " #: fetch/gcstarpluginfetcher.cpp:415 msgid "Select the GCstar plugin used for the data source." -msgstr "" +msgstr "Seleziona il plugin GCstar da usare per questa fonte" #: fetch/gcstarpluginfetcher.cpp:420 -#, fuzzy msgid "Author: " -msgstr "Autore" +msgstr "Autore: " #: fetch/discogsfetcher.cpp:58 msgid "Discogs Audio Search" -msgstr "" +msgstr "Ricerca Audio Discogs" #: fetch/discogsfetcher.cpp:668 msgid "API &key: " -msgstr "" +msgstr "API &key: " #: fetch/discogsfetcher.cpp:674 msgid "" "With your discogs.com account you receive an API key for the usage of their " "XML-based interface (See http://www.discogs.com/help/api)." msgstr "" +"Con il tuo account discogs.com riceverai un 'API key' da usare per l'interfaccia " +"XML (Vedi http://www.discogs.com/help/api)." #: fetch/discogsfetcher.cpp:718 msgid "Discogs Link" -msgstr "" +msgstr "Link Discogs" #: newstuff/dialog.cpp:94 msgid "Get Hot New Stuff" -msgstr "" +msgstr "Scarica le ultime novità" #: newstuff/dialog.cpp:114 #, fuzzy msgid "Version" -msgstr "Persona" +msgstr "Versione" #: newstuff/dialog.cpp:116 msgid "Downloads" -msgstr "" +msgstr "Download" #: newstuff/dialog.cpp:117 #, fuzzy @@ -1801,40 +1778,41 @@ msgid "" "items have a checkmark icon, while items with new version available have an " "update icon" msgstr "" +"Questa è una lista di tutti gli oggetti disponibili per il download. Quelli " +"già istallati hanno il segno di spunta, mentre quelli per cui è disponibile una " +"nuova versione hanno l'icona di aggiornamento" #: newstuff/dialog.cpp:137 #, fuzzy msgid "The name and license of the selected item" -msgstr "Registra gli elementi selezionati" +msgstr "Nome e licenza degli elementi selezionati" #: newstuff/dialog.cpp:140 #, fuzzy msgid "The author of the selected item" -msgstr "Controlla gli elementi selezionati" +msgstr "Autore degli elementi selezionati" #: newstuff/dialog.cpp:142 newstuff/dialog.cpp:396 msgid "Install" -msgstr "" +msgstr "Installa" #: newstuff/dialog.cpp:161 msgid "Download and install the selected template." -msgstr "" +msgstr "Scarica e installa il template selezionato." #: newstuff/dialog.cpp:164 msgid "" "Download and install the selected script. Some scripts may need to be " "configured after being installed." -msgstr "" +msgstr "Scarica e installa lo script selezionato. Alcuni script potrebbero necessitare di una configurazione successiva." #: newstuff/dialog.cpp:194 -#, fuzzy msgid "A description of the selected item is shown here." -msgstr "Registra gli elementi selezionati" +msgstr "Una descrizione degli elementi selezionati viene mostrata qui." #: newstuff/dialog.cpp:224 -#, fuzzy msgid "Downloading information..." -msgstr "Importa le informazioni CDAudio da FreeDB" +msgstr "Dowload delle informazioni..." #: controller.cpp:135 fetchdialog.cpp:226 fetchdialog.cpp:333 #: fetchdialog.cpp:451 fetchdialog.cpp:506 newstuff/dialog.cpp:297 @@ -1846,17 +1824,15 @@ msgstr "Pronto." msgid "" "_: Update Stuff\n" "Update" -msgstr "" +msgstr "Aggiorna" #: newstuff/dialog.cpp:413 -#, fuzzy msgid "Installing item..." -msgstr "Sto salvando il file ..." +msgstr "Installazione oggetto..." #: translators/bibteximporter.cpp:79 -#, fuzzy msgid "No valid bibtex entries were found" -msgstr "Non è stato trovato alcun elemento Bibtex valido nel file - %1" +msgstr "Non è stato trovato alcun elemento Bibtex valido." #: translators/bibteximporter.cpp:96 #, c-format @@ -1883,9 +1859,8 @@ msgid "Use user locale (%1) encoding" msgstr "Codifica secondo le impostazioni dell'utente (%1)" #: translators/bibteximporter.cpp:293 -#, fuzzy msgid "Read the imported file in the local encoding." -msgstr "Codifica il file esportato secondo l'impostazione locale." +msgstr "Leggi il file importato usando la codifica locale." #: translators/tellicozipexporter.cpp:35 msgid "Tellico Zip File" @@ -1926,11 +1901,11 @@ msgstr "C'è un errore di parsing HTML nella linea %1, colonna %2." #: filehandler.cpp:143 translators/tellicoimporter.cpp:115 #: translators/xmlimporter.cpp:45 translators/xmlimporter.cpp:62 msgid "The error message from Qt is:" -msgstr "Il messaggio di errore Qt è:" +msgstr "Il messaggio di errore di Qt è:" #: translators/tellicoimporter.cpp:152 msgid "It is from a future version of Tellico." -msgstr "Il file sembra appartenere ad una versione futura di Tellico." +msgstr "Il file sembra appartenere ad una versione successiva di Tellico." #: translators/tellicoimporter.cpp:162 msgid "" @@ -1973,16 +1948,15 @@ msgstr "Preferiti" #: translators/audiofileimporter.cpp:69 msgid "Scanning audio files..." -msgstr "Scansione dei file audio ..." +msgstr "Scansione dei file audio..." #: translators/audiofileimporter.cpp:129 -#, fuzzy msgid "Bitrate" -msgstr "Bibtex" +msgstr "Bitrate" #: translators/audiofileimporter.cpp:160 translators/audiofileimporter.cpp:170 msgid "Tracks (Disc %1)" -msgstr "" +msgstr "Tracce (Disco %1)" #: translators/audiofileimporter.cpp:189 xslt.cpp:4 msgid "(Various)" @@ -1994,33 +1968,29 @@ msgstr "Opzioni file audio" #: translators/audiofileimporter.cpp:342 msgid "Recursive &folder search" -msgstr "Ricerca ricorsiva" +msgstr "Ricerca &ricorsiva" #: translators/audiofileimporter.cpp:343 msgid "If checked, folders are recursively searched for audio files." msgstr "" -"Se selezionato, i file audio verranno ricercati ricorsivamente all'interno " +"Se selezionato, i file verranno ricercati ricorsivamente all'interno " "delle cartelle." #: translators/audiofileimporter.cpp:347 msgid "Include file &location" -msgstr "" +msgstr "Includi &percorso file" #: translators/audiofileimporter.cpp:348 -#, fuzzy msgid "If checked, the file names for each track are added to the entries." -msgstr "" -"Se selezionato, i nomi di campo saranno stampati come headers della tabella." +msgstr "Se selezionato, i nomi di campo saranno stampati come intestazioni della tabella." #: translators/audiofileimporter.cpp:352 msgid "Include &bitrate" -msgstr "" +msgstr "Includi &bitrate" #: translators/audiofileimporter.cpp:353 -#, fuzzy msgid "If checked, the bitrate for each track is added to the entries." -msgstr "" -"Se selezionato, i nomi di campo saranno stampati come headers della tabella." +msgstr "Se selezionato,il bitrate dei brani verrà aggiunto agli elementi." #: translators/csvexporter.cpp:40 msgid "CSV" @@ -2036,7 +2006,7 @@ msgstr "Opzioni CSV" #: translators/csvexporter.cpp:112 msgid "Include field titles as column headers" -msgstr "Includi i titoli degli elementi com header della colonna" +msgstr "Includi i titoli degli elementi come intestazione della colonna" #: translators/csvexporter.cpp:114 msgid "If checked, a header row will be added with the field titles." @@ -2095,12 +2065,11 @@ msgstr "" #: translators/filelistingimporter.cpp:63 #, fuzzy msgid "Scanning files..." -msgstr "Scansione dei file audio ..." +msgstr "Scansione dei file..." #: translators/filelistingimporter.cpp:191 -#, fuzzy msgid "File Listing Options" -msgstr "Opzioni di stampa" +msgstr "Opzioni di indicizzazione dei file" #: translators/filelistingimporter.cpp:193 #, fuzzy @@ -2108,22 +2077,22 @@ msgid "Recursive folder search" msgstr "Ricerca ricorsiva" #: translators/filelistingimporter.cpp:194 -#, fuzzy msgid "If checked, folders are recursively searched for all files." msgstr "" -"Se selezionato, i file audio verranno ricercati ricorsivamente all'interno " +"Se selezionato, i file verranno ricercati ricorsivamente all'interno " "delle cartelle." #: translators/filelistingimporter.cpp:198 -#, fuzzy msgid "Generate file previews" -msgstr "&Genera resoconti ..." +msgstr "&Genera anteprime dei file" #: translators/filelistingimporter.cpp:199 msgid "" "If checked, previews of the file contents are generated, which can slow down " "the folder listing." msgstr "" +"Se selezionato verranno generate anteprime del contenuto dei file. Questo " +"può rallentare il processo." #: translators/onixexporter.cpp:63 msgid "ONIX Archive" @@ -2156,28 +2125,24 @@ msgstr "" "%1." #: translators/freedbimporter.cpp:196 -#, fuzzy msgid "Select CDDB Entry" -msgstr "Cancella Elemento" +msgstr "Seleziona elemento CDDB" #: translators/freedbimporter.cpp:197 -#, fuzzy msgid "Select a CDDB entry:" -msgstr "Seleziona il risultato IMDB" +msgstr "Selezionare un elemento IMDB" #: translators/freedbimporter.cpp:220 -#, fuzzy msgid "No records were found to match the CD." -msgstr "No ho trovato elementi da confrontare con il CD." +msgstr "No sono stati trovati elementi corrispondenti al CD." #: translators/freedbimporter.cpp:238 msgid "Tellico was unable to complete the CD lookup." -msgstr "Tellico mnon ha potuto completare il controllo del CD." +msgstr "Tellico non ha potuto completare il controllo del CD." #: translators/freedbimporter.cpp:470 -#, fuzzy msgid "Various" -msgstr "(Varie)" +msgstr "Varie" #: translators/freedbimporter.cpp:489 msgid "Audio CD Options" @@ -2205,17 +2170,15 @@ msgstr "" #: translators/gcfilmsexporter.cpp:37 msgid "GCfilms" -msgstr "" +msgstr "GCfilms" #: importdialog.cpp:273 translators/gcfilmsexporter.cpp:41 -#, fuzzy msgid "*.gcf|GCfilms Data Files (*.gcf)" -msgstr "*.csv|file CSV (*.csv)" +msgstr "*.gcf|File dati GCfilms(*.gcf)" #: importdialog.cpp:272 translators/gcfilmsexporter.cpp:43 -#, fuzzy msgid "*.gcs|GCstar Data Files (*.gcs)" -msgstr "*.csv|file CSV (*.csv)" +msgstr "*.gcs|File dati GCstar(*.gcs)" #: translators/xsltexporter.cpp:37 msgid "XSLT" @@ -2238,9 +2201,8 @@ msgid "Alexandria Options" msgstr "Opzioni di Alexandria" #: translators/alexandriaimporter.cpp:195 -#, fuzzy msgid "&Library:" -msgstr "Biblioteca:" +msgstr "&Biblioteca:" #: translators/bibtexmlexporter.cpp:36 msgid "Bibtexml" @@ -2276,14 +2238,12 @@ msgstr "" "flusso XML come elementi codificati in base64." #: translators/importer.h:100 -#, fuzzy msgid "Loading data..." -msgstr "Sto importando i dati ..." +msgstr "Sto importando i dati..." #: translators/importer.h:100 -#, fuzzy msgid "Loading %1..." -msgstr "Passo in rassegna %1 ..." +msgstr "Caricamento di %1..." #: translators/bibtexexporter.cpp:48 msgid "Bibtex" @@ -2311,8 +2271,7 @@ msgstr "Usa il pacchetto URL" #: translators/bibtexexporter.cpp:210 msgid "If checked, any URL fields will be wrapped in a \\url declaration." -msgstr "" -"Se selezionato, qualsiasi campo URL verrà tradotto in un indirizzo \\url." +msgstr "Se selezionato, qualsiasi campo URL verrà tradotto in un indirizzo \\url." #: translators/bibtexexporter.cpp:213 msgid "Skip entries with empty citation keys" @@ -2329,11 +2288,11 @@ msgstr "Stile per le citazioni Bibtex:" #: translators/bibtexexporter.cpp:221 translators/bibtexexporter.cpp:228 #: translators/bibtexexporter.cpp:259 msgid "Braces" -msgstr "Sostegni" +msgstr "Parentesi" #: translators/bibtexexporter.cpp:222 translators/bibtexexporter.cpp:230 msgid "Quotes" -msgstr "Citazioni" +msgstr "Virgolette" #: translators/bibtexexporter.cpp:223 msgid "" @@ -2354,29 +2313,23 @@ msgstr "La prima riga contiene i titoli dei campi" #: translators/csvimporter.cpp:236 msgid "If checked, the first row is used as field titles." -msgstr "" -"Se selezionato, la prima riga verrà utilizzata per contenere i titoli dei " -"campi." +msgstr "Se selezionato, la prima riga verrà utilizzata come titolo dei campi" #: translators/csvimporter.cpp:248 -#, fuzzy msgid "&Comma" -msgstr "Virgola" +msgstr "&Virgola" #: translators/csvimporter.cpp:254 -#, fuzzy msgid "&Semicolon" -msgstr "Punto e virgola" +msgstr "Pun&to e virgola" #: translators/csvimporter.cpp:259 -#, fuzzy msgid "Ta&b" -msgstr "Tab" +msgstr "Ta&b" #: translators/csvimporter.cpp:264 -#, fuzzy msgid "Ot&her:" -msgstr "Altro:" +msgstr "&Altro:" #: translators/csvimporter.cpp:289 msgid "The table shows up to the first five lines of the CSV file." @@ -2393,25 +2346,24 @@ msgstr "" "selezionando una colonna e un campo e premendo il pulsante Set." #: translators/csvimporter.cpp:298 -#, fuzzy msgid "Co&lumn:" -msgstr "Colonna:" +msgstr "Co&lonna:" #: translators/csvimporter.cpp:307 -#, fuzzy msgid "&Data field in this column:" -msgstr "Campo di dati in questa colonna:" +msgstr "&Campo di dati in questa colonna:" #: translators/csvimporter.cpp:315 -#, fuzzy msgid "&Assign Field" -msgstr "Assegna campo" +msgstr "&Assegna campo" #: translators/csvimporter.cpp:347 msgid "" "At least one column must be assigned to a field. Only assigned columns will " "be imported." msgstr "" +"Almeno una colonna deve essere assegnata ad un campo. Solo le colonne assegnate " +"verranno importate." #: collectionfieldsdialog.cpp:409 collectionfieldsdialog.cpp:412 #: translators/csvimporter.cpp:396 translators/csvimporter.cpp:510 @@ -2444,9 +2396,8 @@ msgid "Set PDA backup flag for database" msgstr "Imposta la flag di backup del palmare per il database" #: translators/gcfilmsimporter.cpp:110 translators/gcfilmsimporter.cpp:255 -#, fuzzy msgid "The file is not a valid GCstar data file." -msgstr "Importa la lista dei numeri ISBN da un file di testo." +msgstr "Il file selezionato non è un file GCstar valido." #: mainwindow.cpp:1738 translators/gcfilmsimporter.cpp:248 #: translators/xsltimporter.cpp:76 @@ -2472,7 +2423,7 @@ msgstr "*.html|file HTML (*.html)" #: groupview.cpp:479 mainwindow.cpp:1591 mainwindow.cpp:1631 #: translators/htmlexporter.cpp:316 msgid "People" -msgstr "Gente" +msgstr "Persone" #: translators/htmlexporter.cpp:320 msgid "(grouped by %1)" @@ -2484,12 +2435,11 @@ msgstr "Opzioni HTML" #: translators/htmlexporter.cpp:468 msgid "Print field headers" -msgstr "Stampa i field headers" +msgstr "Stampa le intestazioni dei campi" #: configdialog.cpp:307 translators/htmlexporter.cpp:469 msgid "If checked, the field names will be printed as table headers." -msgstr "" -"Se selezionato, i nomi di campo saranno stampati come headers della tabella." +msgstr "Se selezionato, i nomi di campo saranno stampati come intestazioni della tabella." #: translators/htmlexporter.cpp:473 msgid "Group the entries" @@ -2510,9 +2460,8 @@ msgid "If checked, individual files will be created for each entry." msgstr "Se selezionato, verranno creati singoli file per ogni elemento." #: translators/pdfimporter.cpp:92 translators/pdfimporter.cpp:100 -#, fuzzy msgid "Tellico was unable to read any metadata from the PDF file." -msgstr "Impossibile caricare immagini dal file - %1." +msgstr "Tellico non è riuscito a leggere i metadati del file PDF." #: translators/pdfimporter.cpp:231 msgid "" @@ -2520,40 +2469,39 @@ msgid "" "CrossRef.org. However, you must create an CrossRef account and add a new " "data source with your account information." msgstr "" +"Tellico è in grado di scaricare le informazioni di elementi con un DOI da " +"CrossRef.org. Tuttavia per fare ciò è necessario creare un acocunt CrossRef " +"e aggiungerlo come fonte di dati." #: fetcherconfigdialog.cpp:39 fetcherconfigdialog.cpp:49 msgid "Data Source Properties" -msgstr "Proprietà della fonte dei fati" +msgstr "Proprietà della fonte dei dati" #: fetcherconfigdialog.cpp:77 msgid "&Source name: " msgstr "Nome della &fonte: " #: fetcherconfigdialog.cpp:79 -msgid "" -"The name identifies the data source and should be unique and informative." +msgid "The name identifies the data source and should be unique and informative." msgstr "" -"Il nome identifica òa fonte dei dati e dovrebbe essere univoco e " +"Il nome identifica la fonte dei dati e dovrebbe essere univoco e " "permetterne la facile identificazione." #: fetcherconfigdialog.cpp:90 fetcherconfigdialog.cpp:94 msgid "Source &type: " -msgstr "Tipo della fon&te: " +msgstr "&Tipo della fonte: " #: fetcherconfigdialog.cpp:97 msgid "Tellico supports several different data sources." -msgstr "" +msgstr "Tellico supporta molti tipi di fonti di dati." #: fetcherconfigdialog.cpp:111 msgid "Updating from source should overwrite user data" -msgstr "" +msgstr "Aggiornare dalla fonte scelta potrebbe sovrascrivere i dati attuali" #: fetcherconfigdialog.cpp:114 -#, fuzzy msgid "If checked, updating entries will overwrite any existing information." -msgstr "" -"Se selezionato, gli elementi verranno raggruppati secondo il campo " -"selezionato." +msgstr "Se selezionato, l'aggiornamento sovrascriverà i dati attuali." #: filterdialog.cpp:60 msgid "Any Field" @@ -2569,11 +2517,11 @@ msgstr "non contiene" #: filterdialog.cpp:70 msgid "equals" -msgstr "equivale" +msgstr "uguale a" #: filterdialog.cpp:71 msgid "does not equal" -msgstr "non è uguale" +msgstr "diverso da" #: filterdialog.cpp:72 msgid "matches regexp" @@ -2585,7 +2533,7 @@ msgstr "non corrisponde alla espressione regolare" #: filterdialog.cpp:90 msgid "Edit..." -msgstr "Modifica ..." +msgstr "Modifica..." #: filterdialog.cpp:282 msgid "Advanced Filter" @@ -2601,7 +2549,7 @@ msgstr "Verifica &tutti i criteri seguenti" #: filterdialog.cpp:301 msgid "Match an&y of the following" -msgstr "Verifica alme&no uno dei criteri seguenti" +msgstr "Verifica almeno &uno dei criteri seguenti" #: filterdialog.cpp:311 msgid "Filter name:" @@ -2640,42 +2588,40 @@ msgid "Date" msgstr "Data" #: entryupdater.cpp:81 -#, fuzzy msgid "Updating %1..." -msgstr "Passo in rassegna %1 ..." +msgstr "Aggiornamento di %1..." #: entryupdater.cpp:83 -#, fuzzy msgid "Updating entries..." -msgstr "&Modifica elementi ..." +msgstr "Aggiornamento elementi..." #: entryupdater.cpp:85 -#, fuzzy msgid "Update Entries" -msgstr "Modifica elementi" +msgstr "Aggiorna elementi" #: entryupdater.cpp:99 msgid "Updating %1..." -msgstr "" +msgstr "Aggiornamento %1..." #: entryupdater.cpp:209 -#, fuzzy msgid "Select Match" -msgstr "Seleziona il risultato IMDB" +msgstr "Seleziona il risultato" #: entryupdater.cpp:217 msgid "" "%1 returned multiple results which could match %2, the " "entry currently in the collection. Please select the correct match." msgstr "" +"%1 he restituito più risultati che potrebbero corrispondere a %2, " +"l'attuale elemento della collezione. Per favore seleziona il risultato corretto" #: groupview.cpp:252 msgid "Expand All Groups" -msgstr "Espandi elenco" +msgstr "Espandi tutti i gruppi" #: groupview.cpp:254 msgid "Collapse All Groups" -msgstr "Riduci elenco" +msgstr "Riduci tutti i gruppi" #: groupview.cpp:256 msgid "Filter by Group" @@ -2714,7 +2660,7 @@ msgid "" "Append the contents of the imported file to the current collection. This is " "only possible when the collection types match." msgstr "" -"Allega il contenuto del file importato alla collezione attuale. This è " +"Allega il contenuto del file importato alla collezione attuale. Questo è " "possibile solo se le collezioni sono dello stesso tipo." #: importdialog.cpp:69 @@ -2730,7 +2676,7 @@ msgid "" msgstr "" "Unifica i contenuti del file importato a quelli della collezione attuale. " "Questo è possibile solo quando le collezioni sono dello stesso tipo. Per " -"poter essere unificati tutti gli elementi devono corrispondere esattamente." +"poter essere unificati gli elementi devono corrispondere esattamente." #: importdialog.cpp:95 mainwindow.cpp:318 rc.cpp:9 #, no-c-format @@ -2742,19 +2688,16 @@ msgid "*.ris|RIS Files (*.ris)" msgstr "*.ris|file RIS (*.ris)" #: importdialog.cpp:277 -#, fuzzy msgid "*.amc|AMC Data Files (*.amc)" -msgstr "*.csv|file CSV (*.csv)" +msgstr "*.amc|AMC Data Files (*.amc)" #: importdialog.cpp:281 -#, fuzzy msgid "*.pdf|PDF Files (*.pdf)" -msgstr "*.pdb|File di database Pilot (*.pdb)" +msgstr "*.pdf|File PDF (*.pdf)" #: importdialog.cpp:285 -#, fuzzy msgid "*.reflib|Referencer Files (*.reflib)" -msgstr "*.ris|file RIS (*.ris)" +msgstr "*.reflib|File Referencer (*.reflib)" #: tellico_strings.cpp:18 #, c-format @@ -2769,7 +2712,7 @@ msgstr "Impossibile scrivere sul file - %1." #: tellico_strings.cpp:20 #, c-format msgid "Tellico is unable to upload the file - %1." -msgstr "Impossibile uploadare il file - %1." +msgstr "Impossibile aggiornare il file - %1." #: tellico_strings.cpp:21 msgid "" @@ -2795,7 +2738,7 @@ msgstr "Impossibile caricare immagini dal file - %1." #: entryiconview.cpp:287 #, fuzzy msgid "&Sort By" -msgstr "&Porta: " +msgstr "&Ordina per" #: loandialog.cpp:40 msgid "Loan Dialog" @@ -2803,15 +2746,15 @@ msgstr "Modulo per il prestito" #: loandialog.cpp:78 msgid "The following items are being checked out:" -msgstr "I seguenti oggetti sono stati controllati:" +msgstr "I seguenti oggetti sono stati dati in prestito:" #: loandialog.cpp:84 msgid "The following item is on-loan:" -msgstr "Il seguente oggetto è stato prestato:" +msgstr "Il seguente oggetto è in presito:" #: loandialog.cpp:94 msgid "&Lend to:" -msgstr "pr&esta a:" +msgstr "&Presta a:" #: loandialog.cpp:107 msgid "" @@ -2823,19 +2766,19 @@ msgstr "" #: loandialog.cpp:117 msgid "&Loan date:" -msgstr "Data del p&restito:" +msgstr "&Data del prestito:" #: loandialog.cpp:123 msgid "" "The check-out date is the date that you lent the items. By default, today's " "date is used." msgstr "" -"La dara in cui tu hai prestato gli oggetti. La data di default è quella di " +"La data in cui hai prestato gli oggetti. La data di default è quella di " "oggi." #: loandialog.cpp:132 msgid "D&ue date:" -msgstr "Data di restit&uzione:" +msgstr "Data di &restituzione:" #: loandialog.cpp:139 msgid "" @@ -2856,7 +2799,7 @@ msgstr "Puoi aggiungere delle note riguardanti il prestito." #: loandialog.cpp:154 msgid "&Add a reminder to the active calendar" -msgstr "&Aggiungi un memorandum al calendario" +msgstr "&Aggiungi un promemoria al calendario" #: loandialog.cpp:157 msgid "" @@ -2874,7 +2817,7 @@ msgstr "Crea una nuova collezione" #: mainwindow.cpp:192 msgid "New &Book Collection" -msgstr "Nuova Collez&ione di libri" +msgstr "Nuova Collezione di &libri" #: mainwindow.cpp:194 msgid "Create a new book collection" @@ -2882,15 +2825,15 @@ msgstr "Crea una nuova collezione di libri" #: mainwindow.cpp:200 msgid "New B&ibliography" -msgstr "Nuova B&ibliografia" +msgstr "Nuova &bibliografia" #: mainwindow.cpp:202 msgid "Create a new bibtex bibliography" -msgstr "Crea una nuova bibliografia bibtex" +msgstr "Crea una nuova bibliografia bibte&x" #: mainwindow.cpp:208 msgid "New &Comic Book Collection" -msgstr "Nuova &Collezione di fumetti" +msgstr "Nuova collezione di &fumetti" #: mainwindow.cpp:210 msgid "Create a new comic book collection" @@ -2898,7 +2841,7 @@ msgstr "Crea una nuova collezione di fumetti" #: mainwindow.cpp:216 msgid "New &Video Collection" -msgstr "Nuova collezione &Video" +msgstr "Nuova collezione &video" #: mainwindow.cpp:218 msgid "Create a new video collection" @@ -2906,7 +2849,7 @@ msgstr "Crea una nuova collezione di video" #: mainwindow.cpp:224 msgid "New &Music Collection" -msgstr "Nuova Collezione &Musicale" +msgstr "Nuova collezione &musicale" #: mainwindow.cpp:226 msgid "Create a new music collection" @@ -2938,7 +2881,7 @@ msgstr "Crea una nuova collezione di carte collezionabili" #: mainwindow.cpp:256 msgid "New &Wine Collection" -msgstr "Nuova collezione di &Vini" +msgstr "Nuova collezione di vi&ni" #: mainwindow.cpp:258 msgid "Create a new wine collection" @@ -2953,28 +2896,26 @@ msgid "Create a new game collection" msgstr "Crea una nuova collezione di giochi" #: mainwindow.cpp:272 -#, fuzzy msgid "New Boa&rd Game Collection" -msgstr "Nuova collezione di &giochi" +msgstr "Nuova collezione di giochi da tavolo" #: mainwindow.cpp:274 #, fuzzy msgid "Create a new board game collection" -msgstr "Crea una nuova collezione di giochi" +msgstr "Crea una nuova collezione di giochi da tavolo" #: mainwindow.cpp:280 -#, fuzzy msgid "New &File Catalog" -msgstr "Nuovo campo" +msgstr "Nuova collezione di &file" #: mainwindow.cpp:282 #, fuzzy msgid "Create a new file catalog" -msgstr "Crea una nuova collezione" +msgstr "Crea una nuova collezione di File" #: mainwindow.cpp:288 msgid "New C&ustom Collection" -msgstr "Nuova colle&zione personalizzata" +msgstr "Nuova collezione &personalizzata" #: mainwindow.cpp:290 msgid "Create a new custom collection" @@ -2994,15 +2935,15 @@ msgstr "Salva il documento" #: mainwindow.cpp:305 msgid "Save the document as a different file..." -msgstr "Salva il documento su un file diverso ..." +msgstr "Salva il documento come nuovo file..." #: mainwindow.cpp:307 msgid "Print the contents of the document..." -msgstr "Stampa il documento ..." +msgstr "Stampa il documento..." #: mainwindow.cpp:309 msgid "Quit the application" -msgstr "Chiudi il programma" +msgstr "Esci" #: mainwindow.cpp:320 msgid "Import collection data from other formats" @@ -3010,7 +2951,7 @@ msgstr "Importa i dati di una collezione da un formato diverso" #: mainwindow.cpp:324 msgid "Import Tellico Data..." -msgstr "Importa dati Tellico ..." +msgstr "Importa dati Tellico..." #: mainwindow.cpp:325 msgid "Import another Tellico data file" @@ -3018,7 +2959,7 @@ msgstr "Importa un altro file Tellico" #: mainwindow.cpp:331 msgid "Import CSV Data..." -msgstr "Importa dati CSV ..." +msgstr "Importa dati CSV..." #: mainwindow.cpp:332 msgid "Import a CSV file" @@ -3026,7 +2967,7 @@ msgstr "Importa un file CSV" #: mainwindow.cpp:338 msgid "Import MODS Data..." -msgstr "Importa dati MODS ..." +msgstr "Importa dati MODS..." #: mainwindow.cpp:339 msgid "Import a MODS data file" @@ -3034,7 +2975,7 @@ msgstr "Importa un file di dati MODS" #: mainwindow.cpp:345 msgid "Import Alexandria Data..." -msgstr "Importa dati Alexandria ..." +msgstr "Importa dati Alexandria..." #: mainwindow.cpp:346 msgid "Import data from the Alexandria book collection manager" @@ -3043,26 +2984,25 @@ msgstr "Importa dati dal gestore di collezioni Alexandria" #: mainwindow.cpp:352 #, fuzzy msgid "Import Delicious Library Data..." -msgstr "Importa dati Tellico ..." +msgstr "Importa dati Delicious Library..." #: mainwindow.cpp:353 #, fuzzy msgid "Import data from Delicious Library" -msgstr "Importa metadati dai file audio" +msgstr "Importa dati da Delicious Library" #: mainwindow.cpp:359 -#, fuzzy msgid "Import Referencer Data..." -msgstr "Importa dati RIS ..." +msgstr "Importa dati Referencer..." #: mainwindow.cpp:360 #, fuzzy msgid "Import data from Referencer" -msgstr "Importa un reference file RIS" +msgstr "Importa dati da Referencer" #: mainwindow.cpp:366 msgid "Import Bibtex Data..." -msgstr "Importa dati Bibtex ..." +msgstr "Importa dati Bibtex..." #: mainwindow.cpp:367 msgid "Import a bibtex bibliography file" @@ -3070,7 +3010,7 @@ msgstr "Importa un file di bibliografia Bibtex" #: mainwindow.cpp:373 msgid "Import Bibtexml Data..." -msgstr "Importa dati Bibtexml ..." +msgstr "Importa dati Bibtexml..." #: mainwindow.cpp:374 msgid "Import a Bibtexml bibliography file" @@ -3078,7 +3018,7 @@ msgstr "Importa un file di bibliografia Bibtexml" #: mainwindow.cpp:380 msgid "Import RIS Data..." -msgstr "Importa dati RIS ..." +msgstr "Importa dati RIS..." #: mainwindow.cpp:381 msgid "Import an RIS reference file" @@ -3087,16 +3027,16 @@ msgstr "Importa un reference file RIS" #: mainwindow.cpp:387 #, fuzzy msgid "Import PDF File..." -msgstr "Importa file" +msgstr "Importa file PDF..." #: mainwindow.cpp:388 #, fuzzy msgid "Import a PDF file" -msgstr "Importa un file CSV" +msgstr "Importa un file PDF" #: mainwindow.cpp:394 msgid "Import Audio File Metadata..." -msgstr "Importa metadati di un file audio ..." +msgstr "Importa metadati di un file audio..." #: mainwindow.cpp:395 msgid "Import meta-data from audio files" @@ -3104,55 +3044,52 @@ msgstr "Importa metadati dai file audio" #: mainwindow.cpp:404 msgid "Import Audio CD Data..." -msgstr "Importa dati CDAudio ..." +msgstr "Importa dati CDAudio..." #: mainwindow.cpp:405 -#, fuzzy msgid "Import audio CD information" -msgstr "Importa le informazioni CDAudio da FreeDB" +msgstr "Importa informazioni CDAudio" #: mainwindow.cpp:414 #, fuzzy msgid "Import GCstar Data..." -msgstr "Importa dati CSV ..." +msgstr "Importa dati GCstar..." #: mainwindow.cpp:415 #, fuzzy msgid "Import a GCstar data file" -msgstr "Importa un file di dati MODS" +msgstr "Importa un file GCstar" #: mainwindow.cpp:421 #, fuzzy msgid "Import Griffith Data..." -msgstr "Importa dati CSV ..." +msgstr "Importa dati Griffith..." #: mainwindow.cpp:422 #, fuzzy msgid "Import a Griffith database" -msgstr "Esporta in un database PilotDB" +msgstr "Importa un database Griffith" #: mainwindow.cpp:428 #, fuzzy msgid "Import Ant Movie Catalog Data..." -msgstr "Importa dati CDAudio ..." +msgstr "Importa dati da un Movie Catlog Ant..." #: mainwindow.cpp:429 -#, fuzzy msgid "Import an Ant Movie Catalog data file" -msgstr "Importa un altro file Tellico" +msgstr "Importa dati da un file Movie Catlog Ant" #: mainwindow.cpp:435 -#, fuzzy msgid "Import File Listing..." -msgstr "Importa file" +msgstr "Importa lista file..." #: mainwindow.cpp:436 msgid "Import information about files in a folder" -msgstr "" +msgstr "Importa le informazioni su un file in una cartella" #: mainwindow.cpp:442 msgid "Import XSL Transform..." -msgstr "Importa XSL Transform ..." +msgstr "Importa XSL Transform..." #: mainwindow.cpp:443 msgid "Import using an XSL Transform" @@ -3170,7 +3107,7 @@ msgstr "Esporta i dati della collezione in un altro formato" #: mainwindow.cpp:461 #, fuzzy msgid "Export to XML..." -msgstr "Esporta in HTML ..." +msgstr "Esporta in XML..." #: mainwindow.cpp:462 #, fuzzy @@ -3179,16 +3116,16 @@ msgstr "Esporta in un file XML di Tellico" #: mainwindow.cpp:468 msgid "Export to Zip..." -msgstr "Esporta in Zip ..." +msgstr "Esporta in Zip..." #: mainwindow.cpp:469 #, fuzzy msgid "Export to a Tellico Zip file" -msgstr "Esporta in un file XML di Tellico" +msgstr "Esporta in un file Zip di Tellico" #: mainwindow.cpp:475 msgid "Export to HTML..." -msgstr "Esporta in HTML ..." +msgstr "Esporta in HTML..." #: mainwindow.cpp:476 msgid "Export to an HTML file" @@ -3196,7 +3133,7 @@ msgstr "Esporta in un file HTML" #: mainwindow.cpp:482 msgid "Export to CSV..." -msgstr "Esporta in CSV ..." +msgstr "Esporta in CSV..." #: mainwindow.cpp:483 msgid "Export to a comma-separated values file" @@ -3204,7 +3141,7 @@ msgstr "Esporta su un file Comma-Separated Values" #: mainwindow.cpp:489 msgid "Export to PilotDB..." -msgstr "Esporta in PilotDB ..." +msgstr "Esporta in PilotDB..." #: mainwindow.cpp:490 msgid "Export to a PilotDB database" @@ -3212,7 +3149,7 @@ msgstr "Esporta in un database PilotDB" #: mainwindow.cpp:496 msgid "Export to Alexandria..." -msgstr "Esporta in Alexandria ..." +msgstr "Esporta in Alexandria..." #: mainwindow.cpp:497 msgid "Export to an Alexandria library" @@ -3220,7 +3157,7 @@ msgstr "Esporta in una biblioteca Alexandria" #: mainwindow.cpp:503 msgid "Export to Bibtex..." -msgstr "Esporta in Bibtex ..." +msgstr "Esporta in Bibtex..." #: mainwindow.cpp:504 msgid "Export to a bibtex file" @@ -3228,7 +3165,7 @@ msgstr "Esporta come file Bibtex" #: mainwindow.cpp:510 msgid "Export to Bibtexml..." -msgstr "Esporta in Bibtexml ..." +msgstr "Esporta in Bibtexml..." #: mainwindow.cpp:511 msgid "Export to a Bibtexml file" @@ -3236,7 +3173,7 @@ msgstr "Esporta come file Bibtexml" #: mainwindow.cpp:517 msgid "Export to ONIX..." -msgstr "Esporta in ONIX ..." +msgstr "Esporta in ONIX..." #: mainwindow.cpp:518 msgid "Export to an ONIX file" @@ -3245,26 +3182,26 @@ msgstr "Esporta in un file ONIX" #: mainwindow.cpp:524 #, fuzzy msgid "Export to GCfilms..." -msgstr "Esporta in CSV ..." +msgstr "Esporta in GCfilms..." #: mainwindow.cpp:525 #, fuzzy msgid "Export to a GCfilms data file" -msgstr "Esporta come file Bibtex" +msgstr "Esporta come file GCfilms" #: mainwindow.cpp:531 #, fuzzy msgid "Export to GCstar..." -msgstr "Esporta in CSV ..." +msgstr "Esporta in GCstar..." #: mainwindow.cpp:532 #, fuzzy msgid "Export to a GCstar data file" -msgstr "Esporta come file Bibtex" +msgstr "Esporta come file GCstar" #: mainwindow.cpp:536 msgid "Export XSL Transform..." -msgstr "Esporta XSL Transform ..." +msgstr "Esporta XSL Transform..." #: mainwindow.cpp:537 msgid "Export using an XSL Transform" @@ -3284,23 +3221,23 @@ msgstr "Incolla il contenuto degli appunti" #: mainwindow.cpp:552 msgid "Select all the entries in the collection" -msgstr "Seleziona tutti i campi della collezione" +msgstr "Seleziona tutti gli elementi della collezione" #: mainwindow.cpp:554 msgid "Deselect all the entries in the collection" -msgstr "Deseleziona tutti i campi della collezione" +msgstr "Deseleziona tutti gli elementi della collezione" #: mainwindow.cpp:556 msgid "Internet Search..." -msgstr "Ricerca su Internet ..." +msgstr "Cerca su Internet..." #: mainwindow.cpp:559 msgid "Search the internet..." -msgstr "Ricerca attraverso Internet ..." +msgstr "Ricerca attraverso Internet..." #: mainwindow.cpp:561 msgid "Advanced &Filter..." -msgstr "&Filtro avanzato ..." +msgstr "&Filtro avanzato..." #: mainwindow.cpp:564 mainwindow.cpp:719 msgid "Filter the collection" @@ -3308,7 +3245,7 @@ msgstr "Applica filtri" #: mainwindow.cpp:569 msgid "&New Entry..." -msgstr "&Nuovo Elemento ..." +msgstr "&Nuovo Elemento..." #: mainwindow.cpp:572 msgid "Create a new entry" @@ -3316,16 +3253,15 @@ msgstr "Crea un nuovo elemento" #: controller.cpp:620 mainwindow.cpp:573 msgid "&Edit Entry..." -msgstr "&Modifica elemento ..." +msgstr "&Modifica elemento..." #: mainwindow.cpp:576 msgid "Edit the selected entries" msgstr "Modifica gli elementi selezionati" #: controller.cpp:621 mainwindow.cpp:577 -#, fuzzy msgid "D&uplicate Entry" -msgstr "Duplica elemento" +msgstr "D&uplica elemento" #: mainwindow.cpp:580 msgid "Copy the selected entries" @@ -3342,16 +3278,16 @@ msgstr "Cancella gli elementi selezionati" #: mainwindow.cpp:585 #, fuzzy msgid "&Merge Entries" -msgstr "Cance&lla elementi" +msgstr "&Fondi elementi" #: mainwindow.cpp:588 #, fuzzy msgid "Merge the selected entries" -msgstr "Cancella gli elementi selezionati" +msgstr "Fondi gli elementi selezionati" #: mainwindow.cpp:591 msgid "&Generate Reports..." -msgstr "&Genera resoconti ..." +msgstr "&Genera resoconti..." #: mainwindow.cpp:594 msgid "Generate collection reports" @@ -3359,23 +3295,23 @@ msgstr "Genera resoconti sulla collezione" #: mainwindow.cpp:595 msgid "Check-&out..." -msgstr "&Verifica ..." +msgstr "&Presta..." #: mainwindow.cpp:598 msgid "Check-out the selected items" -msgstr "Controlla gli elementi selezionati" +msgstr "Presta gli elementi selezionati" #: mainwindow.cpp:599 msgid "Check-&in" -msgstr "Reg&istrazione" +msgstr "Riconsegnato" #: mainwindow.cpp:602 msgid "Check-in the selected items" -msgstr "Registra gli elementi selezionati" +msgstr "Segna come riconsegnati gli elementi selezionati" #: mainwindow.cpp:604 msgid "&Rename Collection..." -msgstr "&Rinomina Collezione ..." +msgstr "&Rinomina Collezione..." #: mainwindow.cpp:607 msgid "Rename the collection" @@ -3383,11 +3319,11 @@ msgstr "Rinomina la collezione" #: mainwindow.cpp:608 msgid "Collection &Fields..." -msgstr "Campi della colle&zione ..." +msgstr "Campi della colle&zione..." #: mainwindow.cpp:611 msgid "Modify the collection fields" -msgstr "Modifica i campi della tabella della collezione" +msgstr "Modifica i campi della collezione" #: mainwindow.cpp:612 msgid "Convert to &Bibliography" @@ -3399,26 +3335,26 @@ msgstr "Trasforma una collezione di libri in una bibliografia" #: mainwindow.cpp:616 msgid "String &Macros..." -msgstr "String &Macros..." +msgstr "Stringhe &Macro..." #: mainwindow.cpp:619 msgid "Edit the bibtex string macros" -msgstr "Edita le string macros Bibtex" +msgstr "Edita le stringhe macro Bibtex" #: mainwindow.cpp:626 #, fuzzy msgid "Copy Bibtex to Cli&pboard" -msgstr "Copia il testo selezionato negli appunti" +msgstr "Copia dati Bibtex negli appunti" #: mainwindow.cpp:627 #, fuzzy msgid "Copy bibtex citations to the clipboard" -msgstr "Copia il testo selezionato negli appunti" +msgstr "Copia le citazioni Bibtex negli appunti" #: mainwindow.cpp:632 #, fuzzy msgid "Cite Entry in &LyX" -msgstr "&Cita elemento" +msgstr "Cita elemento in &LyX" #: mainwindow.cpp:633 msgid "Cite the selected entries in LyX" @@ -3427,26 +3363,25 @@ msgstr "Cita l'elemento selezionato in LyX" #: mainwindow.cpp:638 #, fuzzy msgid "Ci&te Entry in OpenOffice.org" -msgstr "&Cita elemento" +msgstr "Cita elemento in &OpenOffice.org" #: mainwindow.cpp:639 -#, fuzzy msgid "Cite the selected entries in OpenOffice.org" -msgstr "Cita l'elemento selezionato in LyX" +msgstr "Cita gli elementi selezionato in OpenOffice.org" #: controller.cpp:622 mainwindow.cpp:647 rc.cpp:18 #, fuzzy, no-c-format msgid "&Update Entry" -msgstr "&Cita elemento" +msgstr "&Aggiorna elemento" #: mainwindow.cpp:652 #, fuzzy msgid "All Sources" -msgstr "Fonte" +msgstr "Tutte le fonti" #: mainwindow.cpp:653 msgid "Update entry data from all available sources" -msgstr "" +msgstr "Aggiorna l'elemento da tutte le fonti disponibili" #: mainwindow.cpp:665 msgid "Show Grou&p View" @@ -3494,7 +3429,7 @@ msgstr "Selezione di &gruppo" #: mainwindow.cpp:700 msgid "Change the grouping of the collection" -msgstr "Cambia il modo di raggruppamento" +msgstr "Cambia il modo di raggruppamento della collezione" #: filterview.cpp:33 filterview.cpp:85 mainwindow.cpp:702 mainwindow.cpp:717 msgid "Filter" @@ -3506,7 +3441,7 @@ msgstr "Cancella filtro" #: mainwindow.cpp:710 msgid "Filter here..." -msgstr "Filtra qui ..." +msgstr "Filtra qui..." #: mainwindow.cpp:768 msgid "Groups" @@ -3531,7 +3466,7 @@ msgstr "" #: mainwindow.cpp:831 #, fuzzy msgid "Welcome to the Tellico Collection Manager" -msgstr "Tellico - un gestore delle collezioni personali per KDE" +msgstr "Tellico - un gestore di collezioni personali per KDE" #: mainwindow.cpp:833 msgid "" @@ -3541,14 +3476,19 @@ msgid "" "by downloading data from various " "Internet sources." msgstr "" +"

Tellico è uno strumento di gestione di collezioni di libri, materiale video, " +"musica, e qualsiasi altra cosa tu voglia catalogare.

I nuovi elementi possono " +"essere aggiunti alla tua collezione manualmente " +"o recuperando i dati da diverse fonti su " +"internet.

" #: mainwindow.cpp:1066 msgid "Creating new document..." -msgstr "Creazione nuovo documento ..." +msgstr "Creazione nuovo documento..." #: mainwindow.cpp:1098 mainwindow.cpp:1117 mainwindow.cpp:1135 msgid "Opening file..." -msgstr "Sto aprendo il file ..." +msgstr "Apertura file..." #: mainwindow.cpp:1108 msgid "Open File" @@ -3556,7 +3496,7 @@ msgstr "Apri file" #: document.cpp:192 mainwindow.cpp:1215 msgid "Saving file..." -msgstr "Sto salvando il file ..." +msgstr "Salvataggio file..." #: mainwindow.cpp:1226 msgid "" @@ -3565,38 +3505,42 @@ msgid "" "data directory to improve performance?

Your choice can always be " "changed in the configuration dialog.

" msgstr "" +"

Stai savando un file con molte immagini, e questo può rallentare molto" +"Tellico. Vuoi salvare le immagini separatamente nella cartella dati di Tellico " +"per aumentare le prestazioni del programma?

Potrai sempre cambiare la tua " +"scelta nella finestra di configurazione.

" #: mainwindow.cpp:1231 msgid "Save Images Separately" -msgstr "" +msgstr "Salva immagini separatamente" #: mainwindow.cpp:1232 msgid "Save Images in File" -msgstr "" +msgstr "Salva immagini nel file" #: mainwindow.cpp:1265 msgid "Saving file with a new filename..." -msgstr "Sto salvando il file con un nuovo nome ..." +msgstr "Salvataggio file con un nuovo nome..." #: mainwindow.cpp:1303 mainwindow.cpp:1353 msgid "Printing..." -msgstr "In stampa ..." +msgstr "In stampa..." #: mainwindow.cpp:1312 msgid "" "The collection is currently being filtered to show a limited subset of the " "entries. Only the visible entries will be printed. Continue?" msgstr "" -"Sto filtrando la collezione per mostrare solo un numero ridotto di elementi. " +"La collezione è attualmente filtrata per mostrare solo un numero limitato di elementi. " "Solo gli elementi visibili saranno stampati. Continuare?" #: mainwindow.cpp:1337 msgid "Processing document..." -msgstr "Sto processando il documento ..." +msgstr "Analisi documento..." #: mainwindow.cpp:1360 msgid "Exiting..." -msgstr "Chiusura ..." +msgstr "Chiusura in corso..." #: mainwindow.cpp:1498 #, c-format @@ -3605,15 +3549,15 @@ msgstr "Elementi totali: %1" #: mainwindow.cpp:1505 msgid "(%1 filtered; %2 selected)" -msgstr "(%1 filtrato, %2 selezionato)" +msgstr "(%1 filtrati, %2 selezionati)" #: mainwindow.cpp:1508 msgid "(%1 filtered)" -msgstr "(%1 filtrato)" +msgstr "(%1 filtrati)" #: mainwindow.cpp:1511 msgid "(%1 selected)" -msgstr "(%1 selezionato)" +msgstr "(%1 selezionati)" #: mainwindow.cpp:1679 #, c-format @@ -3631,7 +3575,7 @@ msgstr "Controlla la tua installazione, grazie." #: mainwindow.cpp:1849 msgid "Importing data..." -msgstr "Sto importando i dati ..." +msgstr "Sto importando i dati..." #: mainwindow.cpp:1858 msgid "Import File" @@ -3640,11 +3584,11 @@ msgstr "Importa file" #: mainwindow.cpp:1864 #, fuzzy msgid "Import Directory" -msgstr "Importatore" +msgstr "Importa directory" #: mainwindow.cpp:1885 msgid "Exporting data..." -msgstr "Sto esportando i dati ..." +msgstr "Sto esportando i dati..." #: mainwindow.cpp:1907 msgid "Export As" @@ -3665,7 +3609,7 @@ msgstr "Stringa" #: mainwindow.cpp:1999 #, fuzzy msgid "Creating citations..." -msgstr "Sto tagliando ..." +msgstr "Creazione citazioni..." #: mainwindow.cpp:2104 msgid "Filters" @@ -3676,7 +3620,7 @@ msgid "" "The Filter View shows the entries which meet certain filter " "rules." msgstr "" -"La vista filtrata mostra gli elementi che soddisfano certi filtri " +"La vista filtrata mostra gli elementi che soddisfano i criteri del filtro " "di ricerca." #: mainwindow.cpp:2121 @@ -3694,13 +3638,15 @@ msgstr "" #: mainwindow.cpp:2255 #, c-format msgid "Update entry data from %1" -msgstr "" +msgstr "Aggiorna elemento da %1" #: mainwindow.cpp:2274 msgid "" "Tellico can only import one file of this type at a time. Only %1 will be " "imported." msgstr "" +"Tellico può importare un solo file alla volta di questo tipo. Solo " +"%1 verrà importato." #: filehandler.cpp:193 #, c-format @@ -3708,8 +3654,7 @@ msgid "Tellico is unable to load the image - %1." msgstr "Impossibile caricare l'immagine - %1." #: filehandler.cpp:207 -msgid "" -"A file named \"%1\" already exists. Are you sure you want to overwrite it?" +msgid "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "Il file \"%1\" esiste già. lo vuoi sovrascrivere?" #: filehandler.cpp:210 @@ -3738,25 +3683,24 @@ msgstr "Vuoi davvero cancellare questi elementi?" #: controller.cpp:443 msgid "Delete Multiple Entries" -msgstr "Cancella diversi elementi" +msgstr "Cancella più elementi" #: controller.cpp:626 msgid "&Edit Entries..." -msgstr "&Modifica elementi ..." +msgstr "&Modifica elementi..." #: controller.cpp:627 -#, fuzzy msgid "D&uplicate Entries" -msgstr "Duplica elemento" +msgstr "D&uplica elementi" #: controller.cpp:628 #, fuzzy msgid "&Update Entries" -msgstr "Modifica elementi" +msgstr "&Aggiorna elementi" #: controller.cpp:629 msgid "&Delete Entries" -msgstr "Cance&lla elementi" +msgstr "&Cancella elementi" #: controller.cpp:684 msgid "" @@ -3770,7 +3714,7 @@ msgstr "" #: calendarhandler.cpp:167 msgid "Default Calendar" -msgstr "Calendario di default" +msgstr "Calendario predefinito" #: calendarhandler.cpp:175 msgid "" @@ -3817,9 +3761,8 @@ msgid "File to open" msgstr "File da aprire" #: main.cpp:42 -#, fuzzy msgid "Data source scripts" -msgstr "Opzioni della fonte dei dati" +msgstr "Script della fonte di dati" #: main.cpp:44 msgid "Icons" @@ -3831,17 +3774,16 @@ msgstr "Autore della libreria btparse" #: main.cpp:48 msgid "Code examples and general inspiration" -msgstr "" +msgstr "Esempi di codice e ispirazioni in generale" #: main.cpp:50 -#, fuzzy msgid "Author of libcsv library" -msgstr "Autore della libreria btparse" +msgstr "Autore della libreria libcsv" #: main.cpp:52 #, fuzzy msgid "Author of rtf2html library" -msgstr "Autore della libreria btparse" +msgstr "Autore della libreria rtf2html" #: collectionfieldsdialog.cpp:56 msgid "Collection Fields" @@ -3865,7 +3807,7 @@ msgstr "Aggiungi un campo alla collezione" msgid "" "_: Delete Field\n" "&Delete" -msgstr "Cance&lla" +msgstr "&Cancella" #: collectionfieldsdialog.cpp:89 msgid "Remove a field from the collection" @@ -3944,8 +3886,7 @@ msgid "An Image field holds a picture. " msgstr "Un campo Immagine contiene immagini. " #: collectionfieldsdialog.cpp:144 -msgid "" -"A Date field can be used for values with a day, month, and year. " +msgid "A Date field can be used for values with a day, month, and year. " msgstr "" "In un campo Data si possono inserire valori comprensivi di giorno, " "mese e anno. " @@ -3997,18 +3938,17 @@ msgstr "" "sostituiti nella stringa." #: collectionfieldsdialog.cpp:193 -#, fuzzy msgid "&Default value:" -msgstr "Calendario di default" +msgstr "Predefiniti" #: collectionfieldsdialog.cpp:198 msgid "A default value can be set for new entries." -msgstr "" +msgstr "Si può inserire un valore di default per i nuovi elementi." #: collectionfieldsdialog.cpp:203 #, fuzzy msgid "A&llowed values:" -msgstr "A&mmessi:" +msgstr "Valori a&mmessi:" #: collectionfieldsdialog.cpp:208 #, fuzzy @@ -4018,7 +3958,8 @@ msgid "" "semi-colon, for example: \"dog; cat; mouse\"" msgstr "" "Per i campi di tipo Scelta, questi sono gli unici valori ammessi. " -"Vengono inseriti in una combo box." +"Vengono inseriti in menù a tendina. I valori inseriti devo essere separati da " +" un punto e vigola, ad esempio: \"gatto; cane; topo\"" #: collectionfieldsdialog.cpp:215 msgid "Extended &properties:" @@ -4026,7 +3967,7 @@ msgstr "Pro&prietà estese:" #: collectionfieldsdialog.cpp:217 msgid "&Set..." -msgstr "Impo&sta ..." +msgstr "Impo&sta..." #: collectionfieldsdialog.cpp:221 msgid "" @@ -4054,11 +3995,10 @@ msgstr "" #: collectionfieldsdialog.cpp:230 msgid "Allow auto-capitalization only" -msgstr "Permetti il maiuscolo automatico" +msgstr "Permetti solo il maiuscolo automatico" #: collectionfieldsdialog.cpp:231 -msgid "" -"This option allows the field to be capitalized, but not specially formatted." +msgid "This option allows the field to be capitalized, but not specially formatted." msgstr "" "Questa opzione permette che gli elementi del campo vengano automaticamente " "resi maiuscoli, senza però cambiare la formattazione." @@ -4113,23 +4053,21 @@ msgid "" "separated by a semi-colon." msgstr "" "Se selezionato, Tellico analizzerà i valori del campo cercando valori " -"multipli, i valori devono essere diviso da un punto e virgola." +"multipli, i valori devono essere divisi da un punto e virgola." #: collectionfieldsdialog.cpp:248 msgid "Allow grouping" msgstr "Ammetti il raggruppamento" #: collectionfieldsdialog.cpp:249 -msgid "" -"If checked, this field may be used to group the entries in the group view." +msgid "If checked, this field may be used to group the entries in the group view." msgstr "" "Se selezionato, il campo può essere usato per ragruppare gli elementi nella " "vista di gruppo." #: collectionfieldsdialog.cpp:263 msgid "Revert the selected field's properties to the default values." -msgstr "" -"Ripristina le proprietà dei campi selezionati secondo i valori predefiniti." +msgstr "Ripristina le proprietà dei campi selezionati secondo i valori predefiniti." #: collectionfieldsdialog.cpp:306 msgid "Modify Fields" @@ -4151,7 +4089,7 @@ msgstr "Usa i valori modificati" #: collectionfieldsdialog.cpp:745 msgid "Revert Field Properties" -msgstr "Inverti le proprietà del campo" +msgstr "Ripristina valori predefiniti" #: collectionfieldsdialog.cpp:746 msgid "" @@ -4163,7 +4101,7 @@ msgstr "" #: collectionfieldsdialog.cpp:749 msgid "Revert" -msgstr "Ripristinare" +msgstr "Ripristina" #: collectionfieldsdialog.cpp:872 msgid "Extended Field Properties" @@ -4175,7 +4113,7 @@ msgstr "Esiste già un campo con questo titolo. Inserisci un titolo diverso." #: collectionfieldsdialog.cpp:909 msgid "The category may not be empty. Please enter a category." -msgstr "La categoria non può essere nulla, Inserisci una categoria. " +msgstr "La categoria non può essere vuota. Inserisci una categoria." #: collectionfieldsdialog.cpp:917 msgid "" @@ -4183,16 +4121,15 @@ msgid "" "Table or Image field. Please enter a different " "category." msgstr "" -"Un campo potrebbe non essere nella stessa categoria del campo " -"Paragrafo, Tabella o Immagine. Inserisci un'altra " -"categoria." +"Alcuni tipi di campo non possono essere nella stessa categoria dei campi " +"Paragrafo, Tabella o Immagine. Inseriscili in un'altra categoria." #: collectionfieldsdialog.cpp:925 msgid "" "A field's title may not be the same as an existing category. Please enter a " "different title." msgstr "" -"Il titolo non un campo non può essere uguale al nome di una categoria. " +"Il titolo di un campo non può essere uguale al nome di una categoria. " "Inserisci un altro titolo." #: collectionfieldsdialog.cpp:937 @@ -4203,19 +4140,18 @@ msgid "" msgstr "" "Il valore di un campo di valutazione dev'essere compreso tra 1 e 10 e il " "limite minimo dev'essere necessariamente inferiore a quello massimo. " -"Inserisci proprietà alte e basse differenti." +"Inserisci valori diversi per minimo e massimo." #: collectionfieldsdialog.cpp:952 -#, fuzzy msgid "Tables are limited to a maximum of ten columns." -msgstr "Le tabelle hanno un limite massimo di cinque colonne." +msgstr "Le tabelle hanno un limite massimo di dieci colonne." #: document.cpp:158 msgid "" "The current file has been modified.\n" "Do you want to save it?" msgstr "" -"Il file attuale �stato modificato.\n" +"Il file attuale è stato modificato.\n" "Lo vuoi salvare?" #: document.cpp:160 entryeditdialog.cpp:660 @@ -4224,7 +4160,7 @@ msgstr "Modifiche non salvate" #: borrowerdialog.cpp:42 msgid "Select Borrower" -msgstr "Seleziona a chi hai fatto il prestito " +msgstr "Seleziona la persona a cui hai fatto il prestito" #: configdialog.cpp:103 msgid "Configure Tellico" @@ -4243,7 +4179,7 @@ msgstr "Riapri il file all'avvio" msgid "" "If checked, the file that was last open will be re-opened at program " "start-up." -msgstr "Se selezionato, l'ultimo file aperto dev'essere riaperto all'avvio." +msgstr "Se selezionato, l'ultimo file usato verrà riaperto all'avvio." #: configdialog.cpp:207 #, fuzzy @@ -4259,7 +4195,7 @@ msgstr "" #: configdialog.cpp:213 #, fuzzy msgid "Image Storage Options" -msgstr "Opzioni dell'immagine" +msgstr "Opzioni di salvataggio delle immagini" #: configdialog.cpp:214 #, fuzzy @@ -4268,11 +4204,11 @@ msgstr "Includi immagini nell'archivio" #: configdialog.cpp:215 msgid "Store images in common application directory" -msgstr "" +msgstr "Salva le immagini nella cartella dell'apllicazione" #: configdialog.cpp:216 msgid "Store images in directory relative to data file" -msgstr "" +msgstr "Salva le immagini in una cartella relativa al file della collezione" #: configdialog.cpp:217 msgid "" @@ -4280,20 +4216,21 @@ msgid "" "slowly, stored in the Tellico application directory, or stored in a " "directory in the same location as the data file." msgstr "" +"Le immagini possono essere salvate nel file della collezione, con la possibilità " +"di rallentare l'esecuzione del programma, oppure nella cartella di Tellico o in " +"una cartella nello stesso percorso del file dati." #: configdialog.cpp:224 configdialog.cpp:299 msgid "Formatting Options" msgstr "Opzioni di formattazione" #: configdialog.cpp:227 -#, fuzzy msgid "Auto capitalize &titles and names" -msgstr "Maiuscolo automatico in titoli e nomi" +msgstr "Maiuscolo automatico per titoli e nomi" #: configdialog.cpp:228 msgid "If checked, titles and names will be automatically capitalized." -msgstr "" -"Se selezionato, i titoli e gli autori diventeranno automaticamente maiuscoli." +msgstr "Se selezionato, titoli e nomi diventeranno automaticamente maiuscoli." #: configdialog.cpp:232 #, fuzzy @@ -4302,7 +4239,7 @@ msgstr "Formattazione automatica di titoli e nomi" #: configdialog.cpp:233 configdialog.cpp:303 msgid "If checked, titles and names will be automatically formatted." -msgstr "Se selezionato, titoli e nomi verranno ordinati automaticamente." +msgstr "Se selezionato, titoli e nomi verranno formattati automaticamente." #: configdialog.cpp:240 #, fuzzy @@ -4315,8 +4252,8 @@ msgid "" "A list of words which should not be capitalized. Multiple values should " "be separated by a semi-colon." msgstr "" -"Una lista di prefissi, separati da punto e virgola, da usare nei " -"cognomi." +"Una lista di prefissi, separati da punto e virgola, che non verranno resi " +"in maiuscolo." #: configdialog.cpp:249 #, fuzzy @@ -4343,7 +4280,7 @@ msgid "" "values should be separated by a semi-colon." msgstr "" "Una lista di suffissi ,separati da punto e virgola, da usare nei nomi di " -"persona" +"persona." #: configdialog.cpp:268 #, fuzzy @@ -4372,9 +4309,8 @@ msgid "&Format titles and names" msgstr "Formatta titoli e nomi" #: configdialog.cpp:306 -#, fuzzy msgid "&Print field headers" -msgstr "Stampa i field headers" +msgstr "Stampa le intestazioni dei campi" #: configdialog.cpp:310 msgid "Grouping Options" @@ -4387,7 +4323,7 @@ msgstr "Raggruppa gli elementi" #: configdialog.cpp:317 msgid "Image Options" -msgstr "Opzioni dell'immagine" +msgstr "Opzioni immagini" #: configdialog.cpp:323 #, fuzzy @@ -4411,8 +4347,7 @@ msgstr "Altezza massima delle immagini:" msgid "" "The maximum height of the images in the printout. The aspect ration is " "preserved." -msgstr "" -"L'altezza massima delle immagini in stampa. Le proporzioni sono rispettate." +msgstr "L'altezza massima delle immagini in stampa. Le proporzioni sono rispettate." #: configdialog.cpp:355 msgid "Templates" @@ -4432,91 +4367,87 @@ msgid "" "Select the template to use for the current type of collections. Not all " "templates will use the font and color settings." msgstr "" +"Seleziona il template da usare per questo tipo di collezione. Non tutti " +"i template hanno impostazioni per font e colori." #: configdialog.cpp:380 -#, fuzzy msgid "&Preview..." -msgstr "&Nuovo ..." +msgstr "&Anteprima..." #: configdialog.cpp:381 msgid "Show a preview of the template" -msgstr "" +msgstr "Mostra anteprima template" #: configdialog.cpp:398 -#, fuzzy msgid "Font Options" -msgstr "Opzioni di formattazione" +msgstr "Opzioni carattere" #: configdialog.cpp:405 -#, fuzzy msgid "Font:" -msgstr "Mese" +msgstr "Carattere:" #: configdialog.cpp:411 msgid "This font is passed to the template used in the Entry View." -msgstr "" +msgstr "Questo font sarà usato nel template per la vista degli elementi." #: configdialog.cpp:415 #, fuzzy msgid "Size:" -msgstr "Autografato" +msgstr "Dimensione:" #: configdialog.cpp:425 #, fuzzy msgid "Color Options" -msgstr "Opzioni CSV" +msgstr "Opzioni colore" #: configdialog.cpp:432 msgid "Background color:" -msgstr "" +msgstr "Colore di sfondo:" #: configdialog.cpp:438 msgid "This color is passed to the template used in the Entry View." -msgstr "" +msgstr "Questo colore sarà usato nel template per la vista degli elementi." #: configdialog.cpp:442 msgid "Text color:" -msgstr "" +msgstr "Colore testo:" #: configdialog.cpp:451 msgid "Highlight color:" -msgstr "" +msgstr "Colore evidenziatore" #: configdialog.cpp:460 msgid "Highlighted text color:" -msgstr "" +msgstr "Colore del testo evidenziato" #: configdialog.cpp:469 #, fuzzy msgid "Manage Templates" -msgstr "Template" +msgstr "Gestisci Template" #: configdialog.cpp:475 msgid "Install..." -msgstr "" +msgstr "Installa..." #: configdialog.cpp:478 msgid "Click to install a new template directly." -msgstr "" +msgstr "Fare click per installare direttamente un nuovo template." #: configdialog.cpp:481 configdialog.cpp:537 msgid "Download..." -msgstr "" +msgstr "Download..." #: configdialog.cpp:484 -#, fuzzy msgid "Click to download additional templates via the Internet." -msgstr "" -"Clicca per aprire una casella in cui inserire o modificare i valori ISBN." +msgstr "Fare click per scaricare altri template via internet." #: configdialog.cpp:487 -#, fuzzy msgid "Delete..." -msgstr "Seleziona immagine ..." +msgstr "Rimuovi..." #: configdialog.cpp:490 msgid "Click to select and remove installed templates." -msgstr "" +msgstr "Fare click per selezionare e rimuovere i template installati." #: configdialog.cpp:501 msgid "Data Sources" @@ -4524,7 +4455,7 @@ msgstr "Fonti dei dati" #: configdialog.cpp:501 msgid "Data Source Options" -msgstr "Opzioni della fonte dei dati" +msgstr "Opzioni fonti di dati" #: configdialog.cpp:506 fetchdialog.cpp:171 msgid "Source" @@ -4532,72 +4463,71 @@ msgstr "Fonte" #: configdialog.cpp:517 msgid "Move &Up" -msgstr "" +msgstr "Movi &su" #: configdialog.cpp:519 configdialog.cpp:523 msgid "" "The order of the data sources sets the order that Tellico uses when entries " "are automatically updated." msgstr "" +"L'ordine delle fonti di dati sarà quello usato da Tellico quando si aggiorna " +"automaticamente un elemento." #: configdialog.cpp:521 #, fuzzy msgid "Move &Down" -msgstr "Rimuo&vi" +msgstr "Muovi &giù" #: configdialog.cpp:528 msgid "&New..." -msgstr "&Nuovo ..." +msgstr "&Nuovo..." #: configdialog.cpp:530 msgid "Click to add a new data source." -msgstr "" +msgstr "Aggiunge una nuova fonte di dati." #: configdialog.cpp:531 msgid "&Modify..." -msgstr "&Modifica ..." +msgstr "&Modifica..." #: configdialog.cpp:533 -#, fuzzy msgid "Click to modify the selected data source." -msgstr "Controlla gli elementi selezionati" +msgstr "Modifica la fonte selezionata." #: configdialog.cpp:536 -#, fuzzy msgid "Click to delete the selected data source." -msgstr "Cancella gli elementi selezionati" +msgstr "Cancella la fonte selezionata" #: configdialog.cpp:539 #, fuzzy msgid "Click to download additional data sources via the Internet." -msgstr "" -"Clicca per aprire una casella in cui inserire o modificare i valori ISBN." +msgstr "Scarica ulteriori fonti da internet" #: configdialog.cpp:1016 msgid "*.tar.gz *.tgz|Template Packages (*.tar.gz)" -msgstr "" +msgstr "*.tar.gz *.tgz|Pacchetti template (*.tar.gz)" #: configdialog.cpp:1049 #, fuzzy msgid "Delete Template" -msgstr "Cancella campo" +msgstr "Cancella template" #: configdialog.cpp:1050 #, fuzzy msgid "Select template to delete:" -msgstr "Seleziona il database per la ricerca" +msgstr "Seleziona il template da cancellare" #: loanview.cpp:33 loanview.cpp:91 xslt.cpp:26 msgid "Borrower" -msgstr "A chi hai fatto il prestito " +msgstr "A chi hai fatto il prestito" #: loanview.cpp:74 msgid "Check-in" -msgstr "Registrazione" +msgstr "Riconsegna" #: loanview.cpp:76 msgid "Modify Loan..." -msgstr "Modifica prestito ..." +msgstr "Modifica prestito..." #: loanview.cpp:93 msgid "Borrower (Sort by Count)" @@ -4613,7 +4543,7 @@ msgstr "Collezione di libri" #: collectionfactory.cpp:126 msgid "Comic Book Collection" -msgstr "Collezione difumetti" +msgstr "Collezione di fumetti" #: collectionfactory.cpp:127 msgid "Video Collection" @@ -4629,7 +4559,7 @@ msgstr "Collezione di monete" #: collectionfactory.cpp:130 msgid "Stamp Collection" -msgstr "Collezione di cartoline" +msgstr "Collezione di francobolli" #: collectionfactory.cpp:131 msgid "Wine Collection" @@ -4637,7 +4567,7 @@ msgstr "Collezione di vini" #: collectionfactory.cpp:132 msgid "Card Collection" -msgstr "Collection di carte" +msgstr "Collezione di carte" #: collectionfactory.cpp:133 msgid "Game Collection" @@ -4645,12 +4575,12 @@ msgstr "Collezione di giochi" #: collectionfactory.cpp:134 msgid "File Catalog" -msgstr "" +msgstr "Catalogo di file" #: collectionfactory.cpp:135 #, fuzzy msgid "Board Game Collection" -msgstr "Collezione di giochi" +msgstr "Collezione di giochi da tavolo" #: collectionfactory.cpp:136 msgid "Custom Collection" @@ -4661,8 +4591,8 @@ msgid "" "The Entry View shows a formatted view of the entry's " "contents." msgstr "" -"La vista per elementi riordina la vista secondo i contenuti degli " -"elementi." +"La vista per elementi mostra il contenuto degli " +"elementi formattato secondo il template scelto." #: viewstack.cpp:31 msgid "" @@ -4691,7 +4621,7 @@ msgid "" "according to their format type." msgstr "" "Se selezionato, i valori nei campi saranno automaticamente formattati " -"secondo il tipo di formattazione." +"secondo il tipo di formato." #: exportdialog.cpp:59 msgid "Export selected entries only" @@ -4732,18 +4662,17 @@ msgstr "&Stop" #: fetchdialog.cpp:86 msgid "Internet Search" -msgstr "Ricerca Internet" +msgstr "Ricerca su Internet" #: fetchdialog.cpp:94 -#, fuzzy msgid "Search Query" -msgstr "Search Query" +msgstr "Query di ricerca" #: fetchdialog.cpp:100 msgid "" "_: Start the search\n" "S&earch:" -msgstr "Ric&erca:" +msgstr "C&erca:" #: fetchdialog.cpp:104 msgid "Enter a search value. An ISBN search must include the full ISBN." @@ -4762,23 +4691,21 @@ msgstr "Clicca per cominciare o fermare la ricerca" #: fetchdialog.cpp:134 #, fuzzy msgid "&Multiple ISBN/UPC search" -msgstr "Ricerca di ISBN &Multipli" +msgstr "Ricerca di ISBN/UPC &Multipli" #: fetchdialog.cpp:135 #, fuzzy msgid "Check this box to search for multiple ISBN or UPC values." -msgstr "Seleziona questa casella per ricercare diversi valori ISBN." +msgstr "Seleziona questa casella per ricercare diversi valori ISBN o UPC." #: fetchdialog.cpp:138 #, fuzzy msgid "Edit List..." -msgstr "Modifica la lista degli &ISBN ..." +msgstr "Modifica lista..." #: fetchdialog.cpp:140 -msgid "" -"Click to open a text edit box for entering or editing multiple ISBN values." -msgstr "" -"Clicca per aprire una casella in cui inserire o modificare i valori ISBN." +msgid "Click to open a text edit box for entering or editing multiple ISBN values." +msgstr "Clicca per aprire una casella in cui inserire o modificare i valori ISBN." #: fetchdialog.cpp:146 msgid "Search s&ource:" @@ -4802,7 +4729,7 @@ msgid "" "selecting it in the list above" msgstr "" "Un elemento può essere visualizzato qui prima di aggiungerlo alla " -"colelzione attuale selezionando dalla lista sopra. " +"collezione attuale selezionandolo dalla lista sopra." #: fetchdialog.cpp:192 msgid "&Add Entry" @@ -4810,16 +4737,16 @@ msgstr "&Aggiungi elemento" #: fetchdialog.cpp:196 msgid "Add the selected entry to the current collection" -msgstr "Aggiungi l'elemento selezionato alla collezione attuale" +msgstr "Aggiungi l'elemento selezionato alla collezione." #: fetchdialog.cpp:198 #, fuzzy msgid "Get More Results" -msgstr "Seleziona il risultato IMDB" +msgstr "Ottieni più risultati" #: fetchdialog.cpp:201 msgid "Fetch more results from the current data source" -msgstr "" +msgstr "Ottieni più risultati dalla fonte attuale" #: fetchdialog.cpp:205 msgid "Clear all search fields and results" @@ -4827,11 +4754,11 @@ msgstr "Pulisci tutti i campi di ricerca e i risultati" #: fetchdialog.cpp:298 msgid "Cancelling the search..." -msgstr "Ripulisco la ricerca ..." +msgstr "Ripulisco la ricerca..." #: fetchdialog.cpp:313 fetchdialog.cpp:472 msgid "Searching..." -msgstr "Ricerca in corso ..." +msgstr "Ricerca in corso..." #: fetchdialog.cpp:368 msgid "The search returned no items." @@ -4842,50 +4769,45 @@ msgstr "La ricerca non ha dato risultati." msgid "" "_n: The search returned 1 item.\n" "The search returned %n items." -msgstr "" -"La ricerca ha trovato 1 oggetto.\n" -"La ricerca ha trovato %n oggetti." +msgstr "La ricerca ha trovato %n oggetti." #: fetchdialog.cpp:412 -#, fuzzy msgid "No results were found for the following ISBN values:" -msgstr "Non ho trovato voci per i seguenti valori ISBN:" +msgstr "Non ho trovato voci per i seguenti valori ISBN:" #: fetchdialog.cpp:443 fetchdialog.cpp:495 msgid "Fetching %1..." -msgstr "Passo in rassegna %1 ..." +msgstr "Passo in rassegna %1..." #: fetchdialog.cpp:528 fetchdialog.cpp:708 msgid "No Internet sources are available for your current collection type." -msgstr "" -"Non sono disponibili su Internet fonti adatte a questo tipo di collezione." +msgstr "Non sono disponibili su Internet fonti adatte a questo tipo di collezione." #: fetchdialog.cpp:594 #, fuzzy msgid "Edit ISBN/UPC Values" -msgstr "Modifica i valori ISBN" +msgstr "Modifica i valori ISBN/UPC" #: fetchdialog.cpp:598 -#, fuzzy msgid "Enter the ISBN or UPC values, one per line." -msgstr "Inserisci i valori ISBN, uno per riga." +msgstr "Inserisci i valori ISBN. Uno per riga." #: fetchdialog.cpp:604 msgid "&Load From File..." -msgstr "&Carica da file ..." +msgstr "&Carica da file..." #: fetchdialog.cpp:605 #, fuzzy msgid "Load the list from a text file." -msgstr "Importa la lista dei numeri ISBN da un file di testo." +msgstr "Importa lista da un file di testo." #: fetchdialog.cpp:624 msgid "" "An ISBN search can contain a maximum of 100 ISBN values. Only the first " "100 values in your list will be used." msgstr "" -"Una ricerca ISBN può contenere al massimo 100 valori ISBN.Verranno " -"utilizzat solo i primi cento numeri della tua lista." +"Una ricerca ISBN può contenere al massimo 100 valori ISBN. Solo i primi " +"cento numeri della tua lista verranno utilizzati." #: entryeditdialog.cpp:51 entryeditdialog.cpp:382 entryeditdialog.cpp:406 #: entryeditdialog.cpp:512 @@ -4902,14 +4824,12 @@ msgid "Sa&ve Entry" msgstr "Sal&va elemento" #: entryeditdialog.cpp:77 -#, fuzzy msgid "Go to the previous entry in the collection" -msgstr "Trova la pecedente corrispondenza nella collezione" +msgstr "Vai al precedente elemento della collezione" #: entryeditdialog.cpp:82 -#, fuzzy msgid "Go to the next entry in the collection" -msgstr "Seleziona tutti i campi della collezione" +msgstr "Vai all'elemento successivo della collezione" #: entryeditdialog.cpp:315 msgid "Do you really want to modify these entries?" @@ -4917,11 +4837,11 @@ msgstr "Vuoi davvero modificare questi elementi?" #: entryeditdialog.cpp:317 msgid "Modify Multiple Entries" -msgstr "Modifica vari elementi" +msgstr "Modifica più elementi" #: entryeditdialog.cpp:359 msgid "A value is required for the following fields. Do you want to continue?" -msgstr "" +msgstr "È necessario inserire un valore per i seguenti campi. Vuoi continuare?" #: entryeditdialog.cpp:456 msgid "Edit Entries" @@ -4960,15 +4880,14 @@ msgid "Select a report template and click Generate." msgstr "Seleziona un template per il resoconto e clicca su Genera." #: reportdialog.cpp:108 -msgid "" -"Some reports may take several seconds to generate for large collections." +msgid "Some reports may take several seconds to generate for large collections." msgstr "" "Per generare i resoconti di grandi collezioni possono essere necessari " "diversi secondi." #: tellico_kernel.cpp:285 msgid "Do you really want to delete this filter?" -msgstr "Vuoi davvero cancellare questo elemento?" +msgstr "Vuoi davvero cancellare questo filtro?" #: tellico_kernel.cpp:287 msgid "Delete Filter?" @@ -4981,34 +4900,34 @@ msgstr "Nuovo nome della collezione:" #: tellico_kernel.cpp:377 #, fuzzy msgid "Entry 1" -msgstr "Elemento" +msgstr "Elemento 1" #: tellico_kernel.cpp:378 #, fuzzy msgid "Entry 2" -msgstr "Elemento" +msgstr "Elemento 2" #: tellico_kernel.cpp:387 msgid "Conflicting values for %1 were found while merging entries." -msgstr "" +msgstr "I due elementi hanno valori diversi per %1 " #: tellico_kernel.cpp:393 msgid "Please choose which value to keep." -msgstr "" +msgstr "Scegli quale conservare." #: entrymerger.cpp:33 tellico_kernel.cpp:398 #, fuzzy msgid "Merge Entries" -msgstr "Cancella elementi" +msgstr "Fondi elementi" #: tellico_kernel.cpp:399 tellico_kernel.cpp:400 #, c-format msgid "Select value from %1" -msgstr "" +msgstr "Seleziona valore da %1" #: entryview.cpp:186 msgid "Tellico is unable to locate the default entry stylesheet." -msgstr "Tellico non è in grado di trovare il foglio di stile di default." +msgstr "Tellico non riesce a trovare il foglio di stile predefinito." #: rc.cpp:6 #, no-c-format @@ -5023,29 +4942,32 @@ msgstr "&Collezione" #: rc.cpp:24 #, no-c-format msgid "Collection Toolbar" -msgstr "Barra degli strumenti-collezione" +msgstr "Barra degli strumenti Collezione" #: _translatorinfo.cpp:1 msgid "" "_: NAME OF TRANSLATORS\n" "Your names" -msgstr "Lorenzo Novaro" +msgstr "" +"Lorenzo Novaro" +"Valerio Ricci" #: _translatorinfo.cpp:3 msgid "" "_: EMAIL OF TRANSLATORS\n" "Your emails" -msgstr "novalore@inwind.it" +msgstr "" +"novalore@inwind.it" +"pompafi@hotmail.it" #: entrymerger.cpp:35 #, fuzzy msgid "Merging entries..." -msgstr "&Modifica elementi ..." +msgstr "&Fusione elementi..." #: entrymerger.cpp:49 -#, fuzzy msgid "Total merged/scanned entries: %1/%2" -msgstr "Elementi totali: %1" +msgstr "Elementi Fusi/Scansionati: %1/%2" #: tips.cpp:3 msgid "" @@ -5055,8 +4977,7 @@ msgid "" "

Any other field which allows multiple values should be entered the\n" "same way, with a semi-colon (;) separating each value.

\n" msgstr "" -"

... che se un libro ha più di un autore, dovresti separare i diversi " -"nomi \n" +"

... che se un libro ha più di un autore, dovresti separare i diversi nomi \n" "usando un punto e virgola, cosicché Tellico possa suddividerli \n" "ed usarli separatamente.

\n" "

Qualsiasi campo che ammetta valori multipli riconoscerà i diversi \n" @@ -5102,7 +5023,7 @@ msgstr "" "il pulsante Verifica tutti i criteri seguenti, imposta la prima\n" "regola così: \"Genere\" \"contiene\" \"Fantascienza\" (non usare le " "virgolette)\n" -"e la seconda regola così: \"Letto\" \"non contiene\" |\"vero\"\n" +"e la seconda regola così: \"Letto\" \"non contiene\" |\"true\"\n" "(anche qui non usare le virgolette).

\n" #: tips.cpp:33 @@ -5112,7 +5033,7 @@ msgid "" "

To show only books which are by Weber or Bujold, for example, then\n" "type \"weber|bujold\" (no quotes) in the filter box.

\n" msgstr "" -"

.. che se nel filtro rapido inserisci un carattere diverso da una " +"

... che se nel filtro rapido inserisci un carattere diverso da una " "lettera, il testo\n" "verrà interpretato come una espressione regolare (regexp).

\n" "

Per mostrare solo i libri di Vidal o Weber, per esempio, digita \n" @@ -5212,6 +5133,15 @@ msgid "" "types by respecting proper sorting at the same time. Consider for example\n" "a number field followed by a text subfield with entries 3b, 14a.

\n" msgstr "" +"

...che puoi usare i campi dipendenti per combinare più campi singoli\n" +"in un unico campo derivato. Per fare ciò seleziona il campo dipendente e usa\n" +"una descrizione del tipo \"%{campoa}%{campob}\" in cui tra le graffe %{ } " +"va indicato il nome del campo nella collezione. Il risultato sarà un campo derivato " +"che contiene i valori di entrambi i campi singoli.\n" +"Questa operazione può tornare utile per raggruppare più valori in un unico\n" +"campo, per un raggruppamento migliore, e per combinare campi di tipi \n" +"diversi senza influire sull'ordinamento. Ad esempio un campo numerico \n" +"seguito da un sottocampo testuale.

\n" #: xslt.cpp:2 msgid "" @@ -5222,7 +5152,7 @@ msgstr "Album" #: xslt.cpp:3 #, fuzzy msgid "This template is meant for music collections only." -msgstr "Crea una nuova collezione di musica" +msgstr "Questo template è solo per collezioni di musica." #: xslt.cpp:5 #, fuzzy @@ -5256,7 +5186,7 @@ msgstr "Video" #: xslt.cpp:14 xslt.cpp:43 #, fuzzy msgid "This template is meant for video collections only." -msgstr "Crea una nuova collezione di video" +msgstr "Questo template è solo per collezioni di video." #: xslt.cpp:16 msgid "" @@ -5279,7 +5209,7 @@ msgstr "Numero totale di elementi:" #: xslt.cpp:20 xslt.cpp:32 xslt.cpp:46 #, fuzzy msgid "Generated by Tellico" -msgstr "Generato da" +msgstr "Generato da Tellico" #: xslt.cpp:21 msgid "Distinct values: " @@ -5303,7 +5233,7 @@ msgstr "Data di prestito" #: xslt.cpp:28 xslt.cpp:31 msgid "Note" -msgstr "Nota" +msgstr "Note" #: xslt.cpp:30 msgid "Due Date" @@ -5338,7 +5268,7 @@ msgstr "Vista a colonne" msgid "" "_: Tri-Column XSL Template\n" "Tri-Column" -msgstr "Vista a colonne" +msgstr "Tre colonne" #: xslt.cpp:44 #, fuzzy @@ -5347,681 +5277,62 @@ msgstr "Cer&ca" #: z3950.cpp:4 msgid "The British Library" -msgstr "" +msgstr "The British Library" #: z3950.cpp:6 #, fuzzy msgid "Sudoc (France)" -msgstr "Amazon (Francia)" +msgstr "Sudoc (Francia)" #: z3950.cpp:8 msgid "BIBSYS (Norway)" -msgstr "" +msgstr "BIBSYS (Norvegia)" #: z3950.cpp:10 msgid "Italian National Library" -msgstr "" +msgstr "Biblioteca Nazionale Italiana" #: z3950.cpp:12 msgid "Portuguese National Library" -msgstr "" +msgstr "Biblioteca Nazionale Portoghese" #: z3950.cpp:14 msgid "National Library of Poland" -msgstr "" +msgstr "Biblioteca Nazionale Polacca" #: z3950.cpp:16 msgid "National Library of Canada" -msgstr "" +msgstr "Biblioteca Nazionale del Canada" #: z3950.cpp:18 msgid "Israel Union List" -msgstr "" +msgstr "Israel Union List" #: z3950.cpp:20 msgid "National Library of Australia" -msgstr "" +msgstr "Biblioteca Nazionale Australiana" #: z3950.cpp:22 msgid "National Library of Lithuania" -msgstr "" +msgstr "Biblioteca Nazionale Lituana" #: z3950.cpp:24 msgid "Copac (UK and Ireland)" -msgstr "" +msgstr "Copac (Regno Unito e Irlanda)" #: scripts.cpp:2 msgid "BoardGameGeek" -msgstr "" +msgstr "BoardGameGeek" #: scripts.cpp:4 msgid "Dark Horse Comics" -msgstr "" +msgstr "Dark Horse Comics" #: scripts.cpp:6 msgid "Allocine.fr" -msgstr "" +msgstr "Allocine.fr" #: scripts.cpp:8 msgid "Spanish Ministry of Culture" -msgstr "" - -#, fuzzy -#~ msgid "CrossRef" -#~ msgstr "Riferimento incrociato" - -#, fuzzy -#~ msgid "MODS" -#~ msgstr "Mac OS" - -#~ msgid "GCstar" -#~ msgstr "GCstar" - -#, fuzzy -#~ msgid "Griffith" -#~ msgstr "Regalo" - -#, fuzzy -#~ msgid "Referencer" -#~ msgstr "Riferimento incrociato" - -#~ msgid "Comics" -#~ msgstr "Fumetti" - -#~ msgid "Stamps" -#~ msgstr "Francobolli" - -#~ msgid "Coins" -#~ msgstr "Monete" - -#~ msgid "Books" -#~ msgstr "Libri" - -#~ msgid "Wines" -#~ msgstr "Vini" - -#~ msgid "Videos" -#~ msgstr "Video" - -#~ msgid "Games" -#~ msgstr "Giochi" - -#~ msgid "Cards" -#~ msgstr "Carte" - -#~ msgid "Entries" -#~ msgstr "Elementi" - -#~ msgid "Albums" -#~ msgstr "Album" - -#, fuzzy -#~ msgid "Copac" -#~ msgstr "Virgola" - -#~ msgid "Tellico" -#~ msgstr "Tellico" - -#~ msgid "&Copy Entry" -#~ msgstr "&Copia elemento" - -#~ msgid "&Copy Entries" -#~ msgstr "&Copia elementi" - -#, fuzzy -#~ msgid "Multiple records were found to match the CD." -#~ msgstr "Ho trovato diversi elementi da confrontare con il CD." - -#~ msgid "Remo&ve" -#~ msgstr "Rimuo&vi" - -#~ msgid "Scanning CDDB cache files..." -#~ msgstr "Scansione dei file di cache CDDB ..." - -#~ msgid "Collection &type: " -#~ msgstr "&tipo di collezione: " - -#~ msgid "Save Entries" -#~ msgstr "Salva elementi" - -#~ msgid "" -#~ "_: Save (Entry Title)\n" -#~ "Save %1" -#~ msgstr "Salva %1" - -#~ msgid "" -#~ "Tellico currently supports five source types: Amazon.com, IMDB, z39.50, " -#~ "Entrez, and external applications." -#~ msgstr "" -#~ "Tellico attualmente supporta cinque tipi di fonti: Amazon.com, IMDB, z39.50, " -#~ "Entrez e l'uso di programmi esterni." - -#~ msgid "Enable/disable the statusbar" -#~ msgstr "Abilita/disabilita la barra di stato" - -#~ msgid "" -#~ "The password will be saved in plain text in the Tellico configuration file." -#~ msgstr "" -#~ "La password verrà salvata in chiaro nel file di configurazione di Tellico." - -#, fuzzy -#~ msgid "Reading files..." -#~ msgstr "Sto salvando il file ..." - -#~ msgid "" -#~ "

...that you can rename a collection by right-clicking on\n" -#~ "the top collection item in the left column.

\n" -#~ msgstr "" -#~ "

... che puoi rinominare una collezione clickando con il tasto destro sul " -#~ "primo elemento\n" -#~ " in alto nella colonna di sinistra.

\n" - -#, fuzzy -#~ msgid "S&earch:" -#~ msgstr "Cerca in:" - -#, fuzzy -#~ msgid "Group by:" -#~ msgstr "Raggruppa per:" - -#, fuzzy -#~ msgid "Quick filter:" -#~ msgstr "Filtro rapido:" - -#~ msgid "Filter Entry" -#~ msgstr "Filtra elemento" - -#, fuzzy -#~ msgid "Tellico: %1 is due to return %2" -#~ msgstr "Impossibile leggere il file - %1." - -#~ msgid "Find Text" -#~ msgstr "Trova testo" - -#~ msgid "&Find" -#~ msgstr "&Trova" - -#, fuzzy -#~ msgid "Find" -#~ msgstr "&Trova" - -#~ msgid "&Text to find:" -#~ msgstr "Testo da trovare:" - -#~ msgid "The search string" -#~ msgstr "La stringa da ricercare" - -#~ msgid "As regular e&xpression" -#~ msgstr "Come Espressione &Regolare" - -#~ msgid "If checked, the search string is used as a regular expression." -#~ msgstr "" -#~ "Se selezionato, la stringa inserita viene cercata come espressione regolare." - -#, fuzzy -#~ msgid "&Edit Regular Expression..." -#~ msgstr "&Edita espressione regolare ..." - -#, fuzzy -#~ msgid "Field" -#~ msgstr "Campi" - -#~ msgid "Search in:" -#~ msgstr "Cerca in:" - -#~ msgid "Select which field should be searched." -#~ msgstr "Seleziona in quale campo eseguire la ricerca." - -#~ msgid "C&ase sensitive" -#~ msgstr "C&ase sensitive" - -#~ msgid "If checked, the search is case-sensitive." -#~ msgstr "Se selezionato, la ricerca distingue tra maiuscole e minuscole." - -#~ msgid "Find &backwards" -#~ msgstr "Trova &Indietro" - -#~ msgid "If checked, the document is searched in reverse." -#~ msgstr "" -#~ "Se selezionato, la ricerca procede dalla fine all'inizio del documento." - -#~ msgid "&Whole words only" -#~ msgstr "S&olo parole intere" - -#~ msgid "If checked, the search is limited to whole words." -#~ msgstr "Se selezionato, la ricerca si limita alle parole intere." - -#~ msgid "All Fields" -#~ msgstr "Tutti i campi" - -#~ msgid "Invalid regular expression." -#~ msgstr "Espressione regolare non valida." - -#~ msgid "5 - Best" -#~ msgstr "5 - Bellissimo" - -#~ msgid "4 - Good" -#~ msgstr "4 - Bello" - -#~ msgid "3 - Neutral" -#~ msgstr "3 - Insomma..." - -#~ msgid "2 - Bad" -#~ msgstr "2 - Brutto" - -#~ msgid "1 - Worst" -#~ msgstr "1 - Pessimo" - -#~ msgid "Table (2 Columns)" -#~ msgstr "Tabella (2 Colonne)" - -#, fuzzy -#~ msgid "Delete Entry?" -#~ msgstr "&Cancella Elemento" - -#~ msgid "Warning!" -#~ msgstr "Attenzione!" - -#~ msgid "(grouped by %1; sorted by %2)" -#~ msgstr "(Raggruppa per %1; ordinato per %2)" - -#~ msgid "(sorted by %1)" -#~ msgstr "(ordina per %1)" - -#~ msgid "" -#~ "

Do you really want to delete the %1 field? This action " -#~ "occurs immediately and can not be undone!

" -#~ msgstr "" -#~ "

Vuoi davvero cancellare il campo %1? Questa azione non può " -#~ "essere annullata!

" - -#~ msgid "Sort by Group, Ascending" -#~ msgstr "Ordine ascendente per gruppo, " - -#~ msgid "Sort by Group, Descending" -#~ msgstr "Ordine discendente per gruppo" - -#~ msgid "Sort by Count, Ascending" -#~ msgstr "Ordine ascendente per conteggio" - -#~ msgid "Sort by Count, Descending" -#~ msgstr "Ordine discendente per conteggio" - -#~ msgid "Search the collection" -#~ msgstr "Ricerca la collezione" - -#~ msgid "Find next match in the collection" -#~ msgstr "Trova la prossima corrispondenza nella collezione" - -#, fuzzy -#~ msgid "Reports" -#~ msgstr "&Esporta" - -#~ msgid "Show number of items in group" -#~ msgstr "Mostra il numero degli oggetti nel gruppo" - -#~ msgid "" -#~ "If checked, the number of items in the group will be appended to the group " -#~ "name." -#~ msgstr "" -#~ "Se selezionato, il numero di oggetti nel gruppo viene allegato al nome del " -#~ "gruppo." - -#~ msgid "Search string '%1' not found." -#~ msgstr "Stringa '%1' non trovata." - -#~ msgid "Video" -#~ msgstr "Video" - -#, fuzzy -#~ msgid "*.bc .tc|Tellico files (*.tc)" -#~ msgstr "*.tc *.bc|File di Tellico (*.tc)" - -#~ msgid "&From Beginning" -#~ msgstr "&Dall'inizio" - -#~ msgid "If checked, the document is searched from the beginning." -#~ msgstr "Se selezionato, la ricerca comincia dall'inizio del documento." - -#~ msgid "Path to LyX server:" -#~ msgstr "Percorso per il server LyX:" - -#~ msgid "" -#~ "The location of the LyX server for citing bibliographic entries. Also " -#~ "used by other applications such as Kile or Pybliographer. Do not include the " -#~ "trailing .in suffix." -#~ msgstr "" -#~ "L'ubicazione del server LyX per citare elementi bibliografici. È anche " -#~ "usata da altre applicazioni come Kile o Pybliographer. Non includere il " -#~ "suffisso .in" - -#, fuzzy -#~ msgid "Tellico was unable to open the CD-ROM device - %1." -#~ msgstr "" -#~ "Tellico non riesce a scrivere sulla server pipe in %1." - -#~ msgid "Do you really want to modify these books?" -#~ msgstr "Vuoi davvero modificare questi libri?" - -#~ msgid "*.ogg|Ogg files (*.ogg)" -#~ msgstr "*.ogg|file Ogg (*.ogg)" - -#~ msgid "" -#~ "The type of the field determines what values may be used. Simple " -#~ "Text is used for most fields. Paragraph is for large text blocks. " -#~ "Choice limits the field to certain values. Checkbox is for a " -#~ "simple yes/no value. Number indicates that the field contains a " -#~ "numerical value. URL is for fields which refer to URLs, including " -#~ "references to other files. Tables may be a single or double column of " -#~ "values, while Read Only is for internal values, possibly useful for " -#~ "import and export. A Dependent field depends on the values of other " -#~ "fields, and is formatted according to the field description. An Image " -#~ "holds a picture." -#~ msgstr "" -#~ "Il tipo di campo determina quali valori possono esservi inseriti. " -#~ "Testo semplice è utilizzato per la gran parte dei campi. " -#~ "Paragrafo è utilizzato per ampi blocchi di testo. Scelta " -#~ "Permette di inserire nel campo solo alcuni valori. Checkbox permette " -#~ "di inserire solo sì o no. Numero indica che il campo può contenere " -#~ "solo un valore numerico. URL serve per i campi che contengono " -#~ "riferimenti ipertestuali, inclusi riferimenti ad altri file. Tabella " -#~ "può essere uina colonna o una doppia colonna di valori, mentre Sola " -#~ "lettura serve per valori interni, utili per l'importazione e " -#~ "l'esportazione di file. Un campo Dipendente dipende dai valori di " -#~ "altri campi ed è creato secondo la descrizione del campo. Un campo " -#~ "Immagine contiene una figura" - -#, fuzzy -#~ msgid "Export images" -#~ msgstr "Esporta immagini" - -#~ msgid "List" -#~ msgstr "Lista" - -#~ msgid "(Requires restart)" -#~ msgstr "(�necessario riavviare il programma)" - -#~ msgid "" -#~ "A comma-separated list of suffixes which might be used in personal names." -#~ msgstr "" -#~ "Un elenco di parole separate da virgole da usare nei nomi di persona." - -#~ msgid "A comma-separated list of prefixes which might be used in surnames." -#~ msgstr "Un elenco di parole separate da virgole da usare nei cognomi." - -#~ msgid "Enable/disable the toolbar" -#~ msgstr "Abilita/disabilita la barra degli strumenti" - -#~ msgid "Show Co&llection ToolBar" -#~ msgstr "Mostra la barra degli strumenti-co&llezione" - -#~ msgid "Enable/disable the collection toolbar" -#~ msgstr "Abilita/disabilita la barra degli strumenti-collezione" - -#~ msgid "Tip of the &Day" -#~ msgstr "Consiglio &del giorno" - -#~ msgid "Show the \"Tip of the Day\" dialog..." -#~ msgstr "Mostra la finestra del \"consiglio del giorno\" ..." - -#~ msgid "*.bcz|Tellico files(*.bcz)" -#~ msgstr "*.bcz|File di Tellico (*.bcz)" - -#, fuzzy -#~ msgid "Good" -#~ msgstr "4 - Bello" - -#~ msgid "" -#~ "An article is from a journal or magazine. A book has an explicit publisher, " -#~ "while a booklet does not." -#~ msgstr "" -#~ "Un articolo è parte di una rivista o di un giornale. Un libro riporta " -#~ "l'indicazione di un editore, mentre un libretto no." - -#, fuzzy -#~ msgid "Mint" -#~ msgstr "Mese" - -#, fuzzy -#~ msgid "Fine" -#~ msgstr "Trova:" - -#, fuzzy -#~ msgid "New Entry" -#~ msgstr "&Nuovo Elemento" - -#~ msgid "Copying selection to clipboard..." -#~ msgstr "Sto copiando ..." - -#~ msgid "Inserting clipboard contents..." -#~ msgstr "Sto incollando ..." - -#~ msgid "Toggling toolbar..." -#~ msgstr "Sto modificando la barra degli strumenti ..." - -#~ msgid "Toggling collection toolbar..." -#~ msgstr "Sto modificando la barra degli strumenti-collezione ..." - -#~ msgid "Toggle the statusbar..." -#~ msgstr "Sto modificando la barra di stato ..." - -#~ msgid "Tellico is unable to find a required file - %1.\n" -#~ msgstr "Impossibile trovare un file necessario - %1.\n" - -#~ msgid "Editing string macros..." -#~ msgstr "Sto editando le string macros ..." - -#~ msgid "&New Collection" -#~ msgstr "&Nuova Collezione" - -#~ msgid "TextImporter" -#~ msgstr "TextImporter" - -#~ msgid "XSLTImporter" -#~ msgstr "XSLTImporter" - -#~ msgid "CSVImporter" -#~ msgstr "CSVImporter" - -#~ msgid "BibtexImporter" -#~ msgstr "BibtexImporter" - -#~ msgid "" -#~ "Both the macro and the string can be edited by triple-clicking the item." -#~ msgstr "" -#~ "Sia la macro che la stringa possono essere modificate con tre click " -#~ "sull'oggetto." - -#~ msgid "" -#~ "The description is useful reminder of what information is contained in the " -#~ "field." -#~ msgstr "" -#~ "La descrizione è utile per ricordare quale informazione è contenuta nei " -#~ "campi." - -#~ msgid "Bibtex Field Name:" -#~ msgstr "Campo Nome-Bibtex:" - -#~ msgid "" -#~ "The Bibtex field name determines the entry name for exporting to " -#~ "bibliogrgaphy files." -#~ msgstr "" -#~ "Il campo Nome-Bibtex determina i nomi degli lementi per l'esportazione su " -#~ "file di bibliografia." - -#, fuzzy -#~ msgid "Processing new entries..." -#~ msgstr "Sto processando il documento ..." - -#, fuzzy -#~ msgid "If checked, the first row is used as field headers." -#~ msgstr "" -#~ "Se selezionato, i nomi di campo saranno stampati come headers della tabella." - -#, fuzzy -#~ msgid "Collection Field in this Column:" -#~ msgstr "Opzioni per la collezione di audio" - -#~ msgid "Tellico is unable to find the file - %1." -#~ msgstr "Impossibile trovare il file - %1." - -#~ msgid "Tellico is unable to download the file - %1." -#~ msgstr "Impossibile scaricare il file - %1." - -#~ msgid "The collection is grouped by this field." -#~ msgstr "La collezione viene ordinata secondo questo campo" - -#~ msgid "These are the available fields in the collection." -#~ msgstr "Questi sono i campi disponibili per la collezione" - -#~ msgid "Selected Fields" -#~ msgstr "Campi selezionati" - -#, fuzzy -#~ msgid "Import..." -#~ msgstr "In stampa ..." - -#, fuzzy -#~ msgid "Read Only" -#~ msgstr "Pronto." - -#, fuzzy -#~ msgid "Text" -#~ msgstr "Trova testo" - -#, fuzzy -#~ msgid "Enoding Options" -#~ msgstr "Raggruppamento" - -#, fuzzy -#~ msgid "Edit Collection Fields..." -#~ msgstr "Chiusura ..." - -#, fuzzy -#~ msgid "&Create new collection" -#~ msgstr "Crea un nuovo documento" - -#, fuzzy -#~ msgid "*.txt|Text files (*.txt)" -#~ msgstr "*.xsl|file XSLT (*.xsl)" - -#~ msgid "New Book" -#~ msgstr "Nuovo libro" - -#, fuzzy -#~ msgid "Modify Books" -#~ msgstr "Modifica libro" - -#, fuzzy -#~ msgid "Delete Books" -#~ msgstr "Cancella libro" - -#~ msgid "Group Books By" -#~ msgstr "Raggruppa libri per" - -#~ msgid "Configure the options for the application..." -#~ msgstr "Configura le opzioni di Tellico ..." - -#~ msgid "Importing from Bibtex..." -#~ msgstr "Sto importando da bibtex ..." - -#~ msgid "Import from Bibtex..." -#~ msgstr "Sto importando da bibtex ..." - -#~ msgid "Importing from Bibtexml..." -#~ msgstr "Sto importando da bibtexml ..." - -#~ msgid "Song" -#~ msgstr "Canzone" - -#~ msgid "CD" -#~ msgstr "CD" - -#~ msgid "Clear Data" -#~ msgstr "Cancella dati" - -#~ msgid "" -#~ "*.tc *.bc|Tellico files (*.tc)\n" -#~ "*.xml|XML files (*.xml)\n" -#~ "*|All files" -#~ msgstr "" -#~ "*.tc *.bc|file di Tellico (*.tc)\n" -#~ "*.xml|file XML (*.xml)\n" -#~ "*|tutti i file" - -#, fuzzy -#~ msgid "Unable to upload file - %1." -#~ msgstr "Impossibile scaricare il file - %1." - -#, fuzzy -#~ msgid "Unable to write file - %1." -#~ msgstr "Impossibile leggere il file - %1." - -#~ msgid "" -#~ "Unable to find a file needed for printing - %1.\n" -#~ "Please check your installation." -#~ msgstr "" -#~ "Impossibile trovare un file necessario per la stampa - %1.\n" -#~ "Controlla la tua installazione, grazie." - -#, fuzzy -#~ msgid "Unable to find file - %1." -#~ msgstr "Impossibile aprire il file - %1." - -#~ msgid "Unable to download file - %1." -#~ msgstr "Impossibile scaricare il file - %1." - -#~ msgid "Unable to open file - %1." -#~ msgstr "Impossibile aprire il file - %1." - -#~ msgid "Unable to read file - %1." -#~ msgstr "Impossibile leggere il file - %1." - -#~ msgid "File is not in XML format - %1." -#~ msgstr "Il file non ha l'aspetto di un file XML -%1." - -#, fuzzy -#~ msgid "Unable to load file - %1." -#~ msgstr "Impossibile scaricare il file - %1." - -#, fuzzy -#~ msgid "File has no syntax version - %1." -#~ msgstr "Il file non ha l'aspetto di un file XML -%1." - -#~ msgid "8mm" -#~ msgstr "8mm" - -#~ msgid "LaserDisc" -#~ msgstr "LaserDisc" - -#~ msgid "Betamax" -#~ msgstr "Beta" - -#~ msgid "CDs" -#~ msgstr "CD" - -#~ msgid "%1 %2" -#~ msgstr "%1 %2" - -#, fuzzy -#~ msgid "" -#~ "Unable to find a required file - %1.\n" -#~ "Please check your installation." -#~ msgstr "" -#~ "Impossibile trovare un file necessario per la stampa - %1.\n" -#~ "Controlla la tua installazione, grazie." - -#~ msgid "(None)" -#~ msgstr "(Nessuno)" - -#~ msgid "Full Contents" -#~ msgstr "Intero contenuto" - -#~ msgid "Creates a full report" -#~ msgstr "Crea un report completo" - -#~ msgid "Unable to find %1 in standard KDE directories." -#~ msgstr "Impossibile trovare %1 nelle directory standard di KDE." +msgstr "Ministero della Cultura Spagnolo" -#~ msgid "Show Browse Toolbar" -#~ msgstr "Mostra la barra di navigazione" diff --git a/po/pt_BR.po b/po/pt_BR.po index 8d396f4..4b7878f 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -1,86 +1,86 @@ -# translation of pt_BR.po to Brazillian Portuguese +# translation of pt_BR.po to Brazilian Portuguese # Copyright (C) 2007 Robby Stephenson . # # Claudio Henrique Fortes Felix , 2006. +# Doutor Zero , 2008. msgid "" msgstr "" "Project-Id-Version: pt_BR\n" -"POT-Creation-Date: 2008-01-26 10:52-0800\n" -"PO-Revision-Date: 2006-12-25 01:47-0200\n" -"Last-Translator: Claudio Henrique Fortes Felix \n" -"Language-Team: Brazillian Portuguese\n" +"POT-Creation-Date: 2007-06-22 17:58-0700\n" +"PO-Revision-Date: 2008-11-01 09:36-0200\n" +"Last-Translator: Doutor Zero \n" +"Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: cite/lyxpipe.cpp:50 +#: cite/lyxpipe.cpp:49 msgid "Tellico is unable to write to the server pipe at %1." msgstr "" -"Tellico não conseguiu escrever para o 'pipe' do servidor em " -"%1." +"Tellico não conseguiu escrever para o 'pipe' do servidor em %1." -#: cite/openoffice.cpp:82 +#: cite/openoffice.cpp:81 msgid "Connecting to OpenOffice.org..." msgstr "Conectando ao OpenOffice.org..." -#: cite/openoffice.cpp:165 cite/openoffice.cpp:186 +#: cite/openoffice.cpp:164 cite/openoffice.cpp:185 msgid "OpenOffice.org Connection" msgstr "Conexão ao OpenOffice.org" -#: cite/openoffice.cpp:179 +#: cite/openoffice.cpp:178 msgid "" "Tellico was unable to connect to OpenOffice.org. Please verify the " "connection settings below, and that OpenOffice.org Writer is currently " "running." msgstr "" "Tellico não conseguiu se conectar ao OpenOffice.org. Por favor verifique as " -"opções de conexão abaixo e verifique se o OpenOffice.org Writer está " -"rodando." +"opções de conexão abaixo e verifique se o OpenOffice.org Writer está rodando." -#: cite/openoffice.cpp:191 +#: cite/openoffice.cpp:190 msgid "Pipe" msgstr "Pipe" -#: cite/openoffice.cpp:193 +#: cite/openoffice.cpp:192 msgid "TCP/IP" msgstr "TCP/IP" -#: gui/tablefieldwidget.cpp:181 +#: gui/tablefieldwidget.cpp:180 msgid "Rename Column" msgstr "Renomear Coluna" -#: gui/tablefieldwidget.cpp:181 +#: gui/tablefieldwidget.cpp:180 msgid "New column name:" msgstr "Novo nome da coluna:" -#: gui/tablefieldwidget.cpp:206 +#: gui/tablefieldwidget.cpp:205 #, c-format msgid "Column %1" msgstr "Coluna %1" -#: gui/tablefieldwidget.cpp:241 gui/tablefieldwidget.cpp:289 +#: gui/tablefieldwidget.cpp:240 gui/tablefieldwidget.cpp:288 msgid "Rename Column..." msgstr "Renomear Coluna..." -#: gui/tablefieldwidget.cpp:274 +#: gui/tablefieldwidget.cpp:273 msgid "Insert Row" msgstr "Inserir Linha " -#: gui/tablefieldwidget.cpp:276 +#: gui/tablefieldwidget.cpp:275 msgid "Remove Row" msgstr "Remover Linha " -#: gui/tablefieldwidget.cpp:278 +#: gui/tablefieldwidget.cpp:277 msgid "Move Row Up" msgstr "Mover Linha para Cima" -#: gui/tablefieldwidget.cpp:283 +#: gui/tablefieldwidget.cpp:282 msgid "Move Row Down" msgstr "Mover Linha para Baixo" -#: gui/tablefieldwidget.cpp:295 +#: gui/tablefieldwidget.cpp:294 msgid "Clear Table" msgstr "Limpar Tabela" @@ -116,18 +116,10 @@ msgid "" "Clear" msgstr "Limpar" -#: gui/imagewidget.cpp:57 +#: gui/imagewidget.cpp:53 msgid "Select Image..." msgstr "Selecionar Imagem..." -#: gui/imagewidget.cpp:63 -msgid "Save link only" -msgstr "" - -#: gui/imagewidget.cpp:162 -msgid "Saving a link is only possible for newly added images." -msgstr "" - #: commands/modifyentries.cpp:73 commands/updateentries.cpp:50 #, c-format msgid "" @@ -147,7 +139,7 @@ msgstr "Combinar Coleção" msgid "Replace Collection" msgstr "Substituir Coleção" -#: commands/modifyentries.cpp:72 entryeditdialog.cpp:365 +#: commands/modifyentries.cpp:72 msgid "Modify Entries" msgstr "Modificar Registros" @@ -231,267 +223,272 @@ msgid "" "Check-in %1" msgstr "Registrar entrada de %1" -#: collectionfactory.cpp:83 collections/bibtexcollection.cpp:24 -#: collections/bibtexcollection.cpp:58 collections/bibtexcollection.cpp:88 -#: collections/boardgamecollection.cpp:19 collections/bookcollection.cpp:19 -#: collections/bookcollection.cpp:40 collections/cardcollection.cpp:19 -#: collections/coincollection.cpp:19 collections/comicbookcollection.cpp:19 -#: collections/filecatalog.cpp:19 collections/gamecollection.cpp:19 -#: collections/musiccollection.cpp:19 collections/stampcollection.cpp:19 -#: collections/videocollection.cpp:19 collections/videocollection.cpp:40 -#: collections/winecollection.cpp:19 configdialog.cpp:198 -#: fetch/imdbfetcher.cpp:689 fetch/imdbfetcher.cpp:948 field.cpp:40 -#: field.cpp:72 translators/gcfilmsimporter.cpp:78 +#: collectionfactory.cpp:79 collections/bibtexcollection.cpp:24 +#: collections/bibtexcollection.cpp:59 collections/bibtexcollection.cpp:89 +#: collections/bookcollection.cpp:19 collections/bookcollection.cpp:41 +#: collections/cardcollection.cpp:19 collections/coincollection.cpp:19 +#: collections/comicbookcollection.cpp:19 collections/filecatalog.cpp:19 +#: collections/gamecollection.cpp:19 collections/musiccollection.cpp:19 +#: collections/stampcollection.cpp:19 collections/videocollection.cpp:19 +#: collections/videocollection.cpp:41 collections/winecollection.cpp:19 +#: configdialog.cpp:192 fetch/imdbfetcher.cpp:689 fetch/imdbfetcher.cpp:933 +#: field.cpp:40 field.cpp:72 translators/gcfilmsimporter.cpp:54 msgid "General" msgstr "Geral " -#: collections/bookcollection.cpp:143 collections/comicbookcollection.cpp:122 -#: collections/stampcollection.cpp:20 -msgid "Condition" -msgstr "Condição" - -#: collections/boardgamecollection.cpp:20 collections/bookcollection.cpp:22 -#: collections/cardcollection.cpp:20 collections/coincollection.cpp:20 -#: collections/comicbookcollection.cpp:22 collections/gamecollection.cpp:20 -#: collections/musiccollection.cpp:20 collections/stampcollection.cpp:21 -#: collections/videocollection.cpp:22 collections/winecollection.cpp:20 -#: document.cpp:468 -msgid "Personal" -msgstr "Pessoal" - -#: collections/stampcollection.cpp:27 -msgid "My Stamps" -msgstr "Meus Selos" - -#: collectionfactory.cpp:82 collections/bibtexcollection.cpp:56 -#: collections/boardgamecollection.cpp:37 collections/bookcollection.cpp:39 -#: collections/cardcollection.cpp:37 collections/coincollection.cpp:37 -#: collections/comicbookcollection.cpp:39 collections/gamecollection.cpp:37 -#: collections/musiccollection.cpp:76 collections/stampcollection.cpp:38 -#: collections/videocollection.cpp:39 collections/winecollection.cpp:37 -#: entryupdater.cpp:229 fetch/fetchmanager.cpp:68 fetchdialog.cpp:169 -#: translators/audiofileimporter.cpp:164 translators/tellicoimporter.cpp:439 -msgid "Title" -msgstr "Título" - -#: collections/boardgamecollection.cpp:77 collections/filecatalog.cpp:45 -#: collections/gamecollection.cpp:87 collections/stampcollection.cpp:44 -#: entryupdater.cpp:230 fetchdialog.cpp:170 -msgid "Description" -msgstr "Descrição" - -#. TRANSLATORS: denomination refers to the monetary value. -#: collections/coincollection.cpp:51 collections/stampcollection.cpp:50 -msgid "Denomination" -msgstr "Denominação" - -#: collections/coincollection.cpp:67 collections/comicbookcollection.cpp:94 -#: collections/stampcollection.cpp:55 collections/winecollection.cpp:73 -msgid "Country" -msgstr "País" - -#: collections/stampcollection.cpp:61 -msgid "Issue Year" -msgstr "Ano de Edição" - -#: collections/stampcollection.cpp:66 collections/videocollection.cpp:172 -msgid "Color" -msgstr "Cor" - -#: collections/stampcollection.cpp:71 -msgid "Scott#" -msgstr "Scott#" - -#: collections/stampcollection.cpp:78 -msgid "" -"_: Stamp grade levels - Superb,Extremely Fine,Very Fine,Fine,Average,Poor\n" -"Superb,Extremely Fine,Very Fine,Fine,Average,Poor" -msgstr "Soberbo,Excelente,Muito Bom,Bom,Regular,Ruim" - -#: collections/coincollection.cpp:88 collections/stampcollection.cpp:80 -msgid "Grade" -msgstr "Classificação" - -#: collections/stampcollection.cpp:85 -msgid "Cancelled" -msgstr "Cancelado" - -#. TRANSLATORS: See http://en.wikipedia.org/wiki/Stamp_hinge -#: collections/stampcollection.cpp:90 -msgid "Hinged" -msgstr "Articulado" - -#: collections/stampcollection.cpp:95 -msgid "Centering" -msgstr "Centrada" - -#: collections/stampcollection.cpp:100 -msgid "Gummed" -msgstr "Colado" - -#: collections/boardgamecollection.cpp:85 collections/bookcollection.cpp:64 -#: collections/cardcollection.cpp:82 collections/coincollection.cpp:103 -#: collections/comicbookcollection.cpp:126 collections/gamecollection.cpp:99 -#: collections/musiccollection.cpp:86 collections/stampcollection.cpp:105 -#: collections/videocollection.cpp:190 collections/winecollection.cpp:79 -msgid "Purchase Date" -msgstr "Data de compra" - -#: collections/boardgamecollection.cpp:94 collections/bookcollection.cpp:69 -#: collections/cardcollection.cpp:87 collections/coincollection.cpp:108 -#: collections/comicbookcollection.cpp:131 collections/gamecollection.cpp:108 -#: collections/musiccollection.cpp:95 collections/stampcollection.cpp:110 -#: collections/videocollection.cpp:199 collections/winecollection.cpp:84 -msgid "Purchase Price" -msgstr "Preço de compra" - -#: collections/cardcollection.cpp:91 collections/coincollection.cpp:112 -#: collections/stampcollection.cpp:114 collections/winecollection.cpp:88 -msgid "Location" -msgstr "Localização" - -#: collections/boardgamecollection.cpp:90 collections/bookcollection.cpp:155 -#: collections/cardcollection.cpp:96 collections/coincollection.cpp:118 -#: collections/comicbookcollection.cpp:139 collections/gamecollection.cpp:104 -#: collections/musiccollection.cpp:91 collections/stampcollection.cpp:120 -#: collections/videocollection.cpp:195 collections/winecollection.cpp:107 -msgid "Gift" -msgstr "Presente" - -#: collections/stampcollection.cpp:124 field.cpp:497 -msgid "Image" -msgstr "Imagem " - -#: collections/boardgamecollection.cpp:105 collections/bookcollection.cpp:171 -#: collections/cardcollection.cpp:115 collections/coincollection.cpp:128 -#: collections/comicbookcollection.cpp:150 collections/gamecollection.cpp:119 -#: collections/musiccollection.cpp:111 collections/stampcollection.cpp:127 -#: collections/videocollection.cpp:210 collections/winecollection.cpp:114 -msgid "Comments" -msgstr "Comentários" - #: collections/bibtexcollection.cpp:25 collections/bookcollection.cpp:20 #: collections/comicbookcollection.cpp:20 translators/grs1importer.cpp:58 -#: translators/grs1importer.cpp:68 translators/pdfimporter.cpp:174 -#: translators/risimporter.cpp:281 +#: translators/grs1importer.cpp:68 translators/risimporter.cpp:258 msgid "Publishing" msgstr "Publicação" #: collections/bookcollection.cpp:21 collections/comicbookcollection.cpp:21 -#: translators/grs1importer.cpp:63 translators/risimporter.cpp:275 +#: translators/grs1importer.cpp:63 translators/risimporter.cpp:252 msgid "Classification" msgstr "Classificação" +#: collections/bookcollection.cpp:22 collections/cardcollection.cpp:20 +#: collections/coincollection.cpp:20 collections/comicbookcollection.cpp:22 +#: collections/gamecollection.cpp:20 collections/musiccollection.cpp:20 +#: collections/stampcollection.cpp:21 collections/videocollection.cpp:22 +#: collections/winecollection.cpp:20 document.cpp:464 +msgid "Personal" +msgstr "Pessoal" + #: collections/comicbookcollection.cpp:28 +msgid "Comics" +msgstr "Revistas em Quadrinhos" + +#: collections/comicbookcollection.cpp:29 msgid "My Comic Books" msgstr "Minhas Revistas em Quadrinhos" -#: collections/bookcollection.cpp:45 collections/comicbookcollection.cpp:45 +#: collectionfactory.cpp:78 collections/bibtexcollection.cpp:57 +#: collections/bookcollection.cpp:40 collections/cardcollection.cpp:38 +#: collections/coincollection.cpp:38 collections/comicbookcollection.cpp:40 +#: collections/gamecollection.cpp:38 collections/musiccollection.cpp:77 +#: collections/stampcollection.cpp:39 collections/videocollection.cpp:40 +#: collections/winecollection.cpp:38 entryupdater.cpp:231 +#: fetch/fetchmanager.cpp:62 fetchdialog.cpp:159 +#: translators/audiofileimporter.cpp:150 translators/tellicoimporter.cpp:405 +msgid "Title" +msgstr "Título" + +#: collections/bookcollection.cpp:46 collections/comicbookcollection.cpp:46 msgid "Subtitle" msgstr "Sub-Título" -#: collections/comicbookcollection.cpp:50 collections/videocollection.cpp:121 +#: collections/comicbookcollection.cpp:51 collections/videocollection.cpp:122 msgid "Writer" msgstr "Escritor" -#: collections/comicbookcollection.cpp:56 +#: collections/comicbookcollection.cpp:57 msgid "" "_: Comic Book Illustrator\n" "Artist" msgstr "Artista Gráfico" -#: collections/bibtexcollection.cpp:200 collections/bookcollection.cpp:132 -#: collections/cardcollection.cpp:71 collections/comicbookcollection.cpp:62 +#: collections/bibtexcollection.cpp:195 collections/bookcollection.cpp:127 +#: collections/cardcollection.cpp:72 collections/comicbookcollection.cpp:63 msgid "Series" msgstr "Série" -#: collections/comicbookcollection.cpp:68 +#: collections/comicbookcollection.cpp:69 msgid "Issue" msgstr "Número" -#: collections/bibtexcollection.cpp:120 collections/boardgamecollection.cpp:60 -#: collections/bookcollection.cpp:73 collections/comicbookcollection.cpp:73 +#: collections/bibtexcollection.cpp:121 collections/bookcollection.cpp:74 +#: collections/comicbookcollection.cpp:74 msgid "Publisher" msgstr "Editora" -#: collections/bibtexcollection.cpp:133 collections/bookcollection.cpp:79 -#: collections/comicbookcollection.cpp:79 +#: collections/bibtexcollection.cpp:134 collections/bookcollection.cpp:80 +#: collections/comicbookcollection.cpp:80 msgid "Edition" msgstr "Edição" -#: collections/bookcollection.cpp:90 collections/comicbookcollection.cpp:85 +#: collections/bookcollection.cpp:91 collections/comicbookcollection.cpp:86 msgid "Publication Year" msgstr "Ano de Publicação" -#: collections/bibtexcollection.cpp:140 collections/bookcollection.cpp:105 -#: collections/comicbookcollection.cpp:90 +#: collections/bibtexcollection.cpp:141 collections/bookcollection.cpp:106 +#: collections/comicbookcollection.cpp:91 msgid "Pages" msgstr "Páginas" -#: collections/bookcollection.cpp:115 collections/comicbookcollection.cpp:100 +#: collections/coincollection.cpp:68 collections/comicbookcollection.cpp:95 +#: collections/stampcollection.cpp:56 collections/winecollection.cpp:74 +msgid "Country" +msgstr "País" + +#: collections/bookcollection.cpp:110 collections/comicbookcollection.cpp:101 #: translators/grs1importer.cpp:67 msgid "Language" msgstr "Língua" -#: collections/boardgamecollection.cpp:43 collections/bookcollection.cpp:120 -#: collections/comicbookcollection.cpp:106 collections/gamecollection.cpp:54 -#: collections/musiccollection.cpp:67 collections/videocollection.cpp:67 +#: collections/bookcollection.cpp:115 collections/comicbookcollection.cpp:107 +#: collections/gamecollection.cpp:55 collections/musiccollection.cpp:68 +#: collections/videocollection.cpp:68 msgid "Genre" msgstr "Gênero" -#: collections/bibtexcollection.cpp:222 collections/bookcollection.cpp:127 -#: collections/cardcollection.cpp:100 collections/comicbookcollection.cpp:112 -#: collections/musiccollection.cpp:103 fetch/amazonfetcher.cpp:933 -#: translators/grs1importer.cpp:62 translators/risimporter.cpp:273 +#: collections/bibtexcollection.cpp:217 collections/bookcollection.cpp:122 +#: collections/cardcollection.cpp:101 collections/comicbookcollection.cpp:113 +#: collections/musiccollection.cpp:104 fetch/amazonfetcher.cpp:913 +#: translators/grs1importer.cpp:62 translators/risimporter.cpp:250 msgid "Keywords" msgstr "Palavras-chave" -#: collections/comicbookcollection.cpp:120 +#: collections/comicbookcollection.cpp:121 msgid "" -"_: Comic book grade levels - Mint,Near Mint,Very Fine,Fine,Very " -"Good,Good,Fair,Poor\n" +"_: Comic book grade levels - Mint,Near Mint,Very Fine,Fine,Very Good,Good," +"Fair,Poor\n" "Mint,Near Mint,Very Fine,Fine,Very Good,Good,Fair,Poor" msgstr "Novo,Quase novo,Excelente,Ótimo,Muito bom,Bom,Razoável,Ruim" -#: collections/bookcollection.cpp:147 collections/comicbookcollection.cpp:135 +#: collections/bookcollection.cpp:138 collections/comicbookcollection.cpp:123 +#: collections/stampcollection.cpp:20 +msgid "Condition" +msgstr "Condição" + +#: collections/bookcollection.cpp:65 collections/cardcollection.cpp:83 +#: collections/coincollection.cpp:104 collections/comicbookcollection.cpp:127 +#: collections/gamecollection.cpp:100 collections/musiccollection.cpp:87 +#: collections/stampcollection.cpp:106 collections/videocollection.cpp:191 +#: collections/winecollection.cpp:80 +msgid "Purchase Date" +msgstr "Data de compra" + +#: collections/bookcollection.cpp:70 collections/cardcollection.cpp:88 +#: collections/coincollection.cpp:109 collections/comicbookcollection.cpp:132 +#: collections/gamecollection.cpp:109 collections/musiccollection.cpp:96 +#: collections/stampcollection.cpp:111 collections/videocollection.cpp:200 +#: collections/winecollection.cpp:85 +msgid "Purchase Price" +msgstr "Preço de compra" + +#: collections/bookcollection.cpp:142 collections/comicbookcollection.cpp:136 msgid "Signed" msgstr "Autografado" -#: collections/boardgamecollection.cpp:98 collections/bookcollection.cpp:159 -#: collections/comicbookcollection.cpp:143 collections/gamecollection.cpp:112 -#: collections/musiccollection.cpp:99 collections/videocollection.cpp:203 -#: document.cpp:466 +#: collections/bookcollection.cpp:150 collections/cardcollection.cpp:97 +#: collections/coincollection.cpp:119 collections/comicbookcollection.cpp:140 +#: collections/gamecollection.cpp:105 collections/musiccollection.cpp:92 +#: collections/stampcollection.cpp:121 collections/videocollection.cpp:196 +#: collections/winecollection.cpp:108 +msgid "Gift" +msgstr "Presente" + +#: collections/bookcollection.cpp:154 collections/comicbookcollection.cpp:144 +#: collections/gamecollection.cpp:113 collections/musiccollection.cpp:100 +#: collections/videocollection.cpp:204 document.cpp:462 msgid "Loaned" msgstr "Emprestado" -#: collections/bookcollection.cpp:168 collections/comicbookcollection.cpp:147 -#: fetch/arxivfetcher.cpp:216 fetch/crossreffetcher.cpp:206 -#: translators/pdfimporter.cpp:204 translators/referencerimporter.cpp:48 +#: collections/bookcollection.cpp:163 collections/comicbookcollection.cpp:148 msgid "Front Cover" msgstr "Capa" +#: collections/bookcollection.cpp:166 collections/cardcollection.cpp:116 +#: collections/coincollection.cpp:129 collections/comicbookcollection.cpp:151 +#: collections/gamecollection.cpp:120 collections/musiccollection.cpp:112 +#: collections/stampcollection.cpp:128 collections/videocollection.cpp:211 +#: collections/winecollection.cpp:115 +msgid "Comments" +msgstr "Comentários" + +#: collections/stampcollection.cpp:27 +msgid "Stamps" +msgstr "Selos" + +#: collections/stampcollection.cpp:28 +msgid "My Stamps" +msgstr "Meus Selos" + +#: collections/filecatalog.cpp:46 collections/gamecollection.cpp:88 +#: collections/stampcollection.cpp:45 entryupdater.cpp:232 fetchdialog.cpp:160 +msgid "Description" +msgstr "Descrição" + +#. TRANSLATORS: denomination refers to the monetary value. +#: collections/coincollection.cpp:52 collections/stampcollection.cpp:51 +msgid "Denomination" +msgstr "Denominação" + +#: collections/stampcollection.cpp:62 +msgid "Issue Year" +msgstr "Ano de Edição" + +#: collections/stampcollection.cpp:67 collections/videocollection.cpp:173 +msgid "Color" +msgstr "Cor" + +#: collections/stampcollection.cpp:72 +msgid "Scott#" +msgstr "Scott#" + +#: collections/stampcollection.cpp:79 +msgid "" +"_: Stamp grade levels - Superb,Extremely Fine,Very Fine,Fine,Average,Poor\n" +"Superb,Extremely Fine,Very Fine,Fine,Average,Poor" +msgstr "Soberbo,Excelente,Muito Bom,Bom,Regular,Ruim" + +#: collections/coincollection.cpp:89 collections/stampcollection.cpp:81 +msgid "Grade" +msgstr "Classificação" + +#: collections/stampcollection.cpp:86 +msgid "Cancelled" +msgstr "Cancelado" + +#. TRANSLATORS: See http://en.wikipedia.org/wiki/Stamp_hinge +#: collections/stampcollection.cpp:91 +msgid "Hinged" +msgstr "Articulado" + +#: collections/stampcollection.cpp:96 +msgid "Centering" +msgstr "Centrada" + +#: collections/stampcollection.cpp:101 +msgid "Gummed" +msgstr "Colado" + +#: collections/cardcollection.cpp:92 collections/coincollection.cpp:113 +#: collections/stampcollection.cpp:115 collections/winecollection.cpp:89 +msgid "Location" +msgstr "Localização" + +#: collections/stampcollection.cpp:125 field.cpp:489 +msgid "Image" +msgstr "Imagem " + #: collections/coincollection.cpp:26 +msgid "Coins" +msgstr "Moedas" + +#: collections/coincollection.cpp:27 msgid "My Coins" msgstr "Minhas Moedas" -#: collections/coincollection.cpp:44 collections/winecollection.cpp:68 +#: collections/coincollection.cpp:45 collections/winecollection.cpp:69 msgid "Type" msgstr "Tipo" -#: collections/bibtexcollection.cpp:145 collections/cardcollection.cpp:66 -#: collections/coincollection.cpp:56 collections/musiccollection.cpp:62 +#: collections/bibtexcollection.cpp:146 collections/cardcollection.cpp:67 +#: collections/coincollection.cpp:57 collections/musiccollection.cpp:63 msgid "Year" msgstr "Ano" -#: collections/coincollection.cpp:61 +#: collections/coincollection.cpp:62 msgid "Mint Mark" msgstr "Marca da Casa Emissora" -#: collections/coincollection.cpp:73 +#: collections/coincollection.cpp:74 msgid "Coin Set" msgstr "Conjunto de Moedas" -#: collections/coincollection.cpp:83 +#: collections/coincollection.cpp:84 msgid "" "_: Coin grade levels - Proof-65,Proof-60,Mint State-65,Mint State-60,Almost " "Uncirculated-55,Almost Uncirculated-50,Extremely Fine-40,Very Fine-30,Very " @@ -500,221 +497,224 @@ msgid "" "Uncirculated-50,Extremely Fine-40,Very Fine-30,Very Fine-20,Fine-12,Very " "Good-8,Good-4,Fair" msgstr "" -"Proof-65,Proof-60,Mint-65,Mint-60,Quase não Circulada-55,Quase não " -"Circulada-50,Extremamente Rara-40,Muito Rara-30,Muito Rara-20,Rara-12,Muito " -"Boa-8,Boa-4,Razoável" +"Proof-65,Proof-60,Mint-65,Mint-60,Quase não Circulada-55,Quase não Circulada-" +"50,Extremamente Rara-40,Muito Rara-30,Muito Rara-20,Rara-12,Muito Boa-8,Boa-" +"4,Razoável" -#: collections/coincollection.cpp:96 +#: collections/coincollection.cpp:97 msgid "" "_: Coin grading services - PCGS,NGC,ANACS,ICG,ASA,PCI\n" "PCGS,NGC,ANACS,ICG,ASA,PCI" msgstr "PCGS,NGC,ANACS,ICG,ASA,PCI" -#: collections/coincollection.cpp:98 +#: collections/coincollection.cpp:99 msgid "Grading Service" msgstr "Serviços de Classificação" -#: collections/coincollection.cpp:122 +#: collections/coincollection.cpp:123 msgid "Obverse" msgstr "Observação" -#: collections/coincollection.cpp:125 +#: collections/coincollection.cpp:126 msgid "Reverse" msgstr "Verso" #: collections/bookcollection.cpp:28 +msgid "Books" +msgstr "Livros" + +#: collections/bookcollection.cpp:29 msgid "My Books" msgstr "Meus Livros" -#: collections/bibtexcollection.cpp:79 collections/bookcollection.cpp:50 +#: collections/bibtexcollection.cpp:80 collections/bookcollection.cpp:51 msgid "Author" msgstr "Autor" -#: collections/bookcollection.cpp:57 translators/alexandriaimporter.cpp:135 +#: collections/bookcollection.cpp:58 translators/alexandriaimporter.cpp:134 msgid "Hardback" msgstr "Capa Dura" -#: collections/bookcollection.cpp:57 +#: collections/bookcollection.cpp:58 msgid "Paperback" msgstr "Capa Flexível Econômica" -#: collections/bookcollection.cpp:57 +#: collections/bookcollection.cpp:58 msgid "Trade Paperback" msgstr "Capa Flexível" -#: collections/bookcollection.cpp:58 +#: collections/bookcollection.cpp:59 msgid "E-Book" msgstr "Livro Eletrônico" -#: collections/bookcollection.cpp:58 +#: collections/bookcollection.cpp:59 msgid "Magazine" msgstr "Revista" -#: collections/bibtexcollection.cpp:157 collections/bookcollection.cpp:58 +#: collections/bibtexcollection.cpp:158 collections/bookcollection.cpp:59 msgid "Journal" msgstr "Jornal" -#: collections/bookcollection.cpp:59 +#: collections/bookcollection.cpp:60 msgid "Binding" msgstr "Formato" -#: collections/bookcollection.cpp:85 +#: collections/bookcollection.cpp:86 msgid "Copyright Year" msgstr "Ano do Copyright" -#: collections/bibtexcollection.cpp:151 collections/bookcollection.cpp:95 -#: translators/grs1importer.cpp:57 translators/risimporter.cpp:278 +#: collections/bibtexcollection.cpp:152 collections/bookcollection.cpp:96 +#: translators/grs1importer.cpp:57 translators/risimporter.cpp:255 msgid "ISBN#" msgstr "ISBN#" -#: collections/bibtexcollection.cpp:154 collections/bookcollection.cpp:97 -#: translators/grs1importer.cpp:59 translators/risimporter.cpp:282 +#: collections/bibtexcollection.cpp:155 collections/bookcollection.cpp:98 +#: translators/grs1importer.cpp:59 translators/risimporter.cpp:259 msgid "International Standard Book Number" msgstr "Número Internacional Normalizado do Livro" -#: collections/bookcollection.cpp:100 +#: collections/bookcollection.cpp:101 msgid "LCCN#" msgstr "LCCN#" -#: collections/bookcollection.cpp:102 +#: collections/bookcollection.cpp:103 msgid "Library of Congress Control Number" msgstr "Número de Controlo da Biblioteca do Congresso" -#: collections/bookcollection.cpp:109 -msgid "Translator" -msgstr "" - -#: collections/bookcollection.cpp:137 +#: collections/bookcollection.cpp:132 msgid "Series Number" msgstr "Nº de série" -#: collections/bookcollection.cpp:142 mainwindow.cpp:185 +#: collections/bookcollection.cpp:137 mainwindow.cpp:192 msgid "New" msgstr "Novo " -#: collections/bookcollection.cpp:142 +#: collections/bookcollection.cpp:137 msgid "Used" msgstr "Usado" -#: collections/bookcollection.cpp:151 +#: collections/bookcollection.cpp:146 msgid "Read" msgstr "Lido" -#: collections/boardgamecollection.cpp:80 collections/bookcollection.cpp:163 -#: collections/musiccollection.cpp:81 collections/winecollection.cpp:102 -#: field.cpp:501 newstuff/dialog.cpp:115 +#: collections/bookcollection.cpp:158 collections/musiccollection.cpp:82 +#: collections/winecollection.cpp:103 field.cpp:493 newstuff/dialog.cpp:114 msgid "Rating" msgstr "Classificação " -#: collections/filecatalog.cpp:25 +#: collections/filecatalog.cpp:26 msgid "My Files" msgstr "Meus Arquivos" -#: borrowerdialog.cpp:49 collections/filecatalog.cpp:36 -#: newstuff/dialog.cpp:113 +#: borrowerdialog.cpp:49 collections/filecatalog.cpp:37 +#: newstuff/dialog.cpp:112 msgid "Name" msgstr "Nome" -#: collections/bibtexcollection.cpp:227 collections/filecatalog.cpp:41 -#: fetch/entrezfetcher.cpp:400 fetch/entrezfetcher.cpp:487 field.cpp:495 -#: translators/gcfilmsimporter.cpp:77 translators/risimporter.cpp:284 +#: collections/filecatalog.cpp:42 fetch/entrezfetcher.cpp:396 +#: fetch/entrezfetcher.cpp:465 field.cpp:487 +#: translators/gcfilmsimporter.cpp:53 translators/risimporter.cpp:261 msgid "URL" msgstr "URL" -#: collections/bibtexcollection.cpp:207 collections/filecatalog.cpp:50 +#: collections/bibtexcollection.cpp:202 collections/filecatalog.cpp:51 msgid "Volume" msgstr "Volume" -#: collections/filecatalog.cpp:55 +#: collections/filecatalog.cpp:56 msgid "Folder" msgstr "Pasta" -#: collections/filecatalog.cpp:60 +#: collections/filecatalog.cpp:61 msgid "Mimetype" msgstr "Tipo MIME" -#: collections/filecatalog.cpp:65 +#: collections/filecatalog.cpp:66 msgid "Size" msgstr "Tamanho" -#: collections/filecatalog.cpp:69 +#: collections/filecatalog.cpp:70 msgid "Permissions" msgstr "Permissões" -#: collections/filecatalog.cpp:74 +#: collections/filecatalog.cpp:75 msgid "Owner" msgstr "Dono" -#: collections/filecatalog.cpp:79 +#: collections/filecatalog.cpp:80 msgid "Group" msgstr "Grupo" -#: collections/filecatalog.cpp:85 +#: collections/filecatalog.cpp:86 msgid "Created" msgstr "Criado" -#: collections/filecatalog.cpp:89 +#: collections/filecatalog.cpp:90 msgid "Modified" msgstr "Modificado" -#: collections/filecatalog.cpp:93 +#: collections/filecatalog.cpp:94 msgid "Meta Info" msgstr "Meta-informação" -#: collectionfieldsdialog.cpp:873 collections/filecatalog.cpp:95 +#: collectionfieldsdialog.cpp:869 collections/filecatalog.cpp:96 msgid "Property" msgstr "Propriedade" -#: collectionfieldsdialog.cpp:873 collections/filecatalog.cpp:96 +#: collectionfieldsdialog.cpp:869 collections/filecatalog.cpp:97 msgid "Value" msgstr "Valor" -#: collections/filecatalog.cpp:99 +#: collections/filecatalog.cpp:100 msgid "Icon" msgstr "Ícone" #: collections/winecollection.cpp:26 +msgid "Wines" +msgstr "Vinhos" + +#: collections/winecollection.cpp:27 msgid "My Wines" msgstr "Meus Vinhos" -#: collections/videocollection.cpp:115 collections/winecollection.cpp:43 +#: collections/videocollection.cpp:116 collections/winecollection.cpp:44 msgid "Producer" msgstr "Produtor" -#: collections/winecollection.cpp:49 +#: collections/winecollection.cpp:50 msgid "Appellation" msgstr "Apelação" -#: collections/winecollection.cpp:55 +#: collections/winecollection.cpp:56 msgid "Varietal" msgstr "Variedade" # Não sei ainda qual a tradução correta -#: collections/winecollection.cpp:61 +#: collections/winecollection.cpp:62 msgid "Vintage" msgstr "Safra" -#: collections/winecollection.cpp:67 +#: collections/winecollection.cpp:68 msgid "Red Wine" msgstr "Vinho tinto" -#: collections/winecollection.cpp:67 +#: collections/winecollection.cpp:68 msgid "White Wine" msgstr "Vinho branco" -#: collections/winecollection.cpp:67 +#: collections/winecollection.cpp:68 msgid "Sparkling Wine" msgstr "Espumoso" -#: collections/cardcollection.cpp:105 collections/winecollection.cpp:93 +#: collections/cardcollection.cpp:106 collections/winecollection.cpp:94 msgid "Quantity" msgstr "Quantidade" -#: collections/winecollection.cpp:97 +#: collections/winecollection.cpp:98 msgid "Drink By" msgstr "Bebido Por" -#: collections/winecollection.cpp:111 +#: collections/winecollection.cpp:112 msgid "Label Image" msgstr "Etiqueta" @@ -727,282 +727,284 @@ msgid "Features" msgstr "Características" #: collections/videocollection.cpp:28 +msgid "Videos" +msgstr "Vídeos" + +#: collections/videocollection.cpp:29 msgid "My Videos" msgstr "Meus Vídeos" -#: collections/musiccollection.cpp:44 collections/videocollection.cpp:46 +#: collections/musiccollection.cpp:45 collections/videocollection.cpp:47 msgid "DVD" msgstr "DVD" -#: collections/videocollection.cpp:46 +#: collections/videocollection.cpp:47 msgid "VHS" msgstr "VHS" -#: collections/videocollection.cpp:46 +#: collections/videocollection.cpp:47 msgid "VCD" msgstr "VCD" -#: collections/videocollection.cpp:46 +#: collections/videocollection.cpp:47 msgid "DivX" msgstr "DivX" -#: collections/videocollection.cpp:46 fetch/amazonfetcher.cpp:823 +#: collections/videocollection.cpp:47 fetch/amazonfetcher.cpp:801 msgid "Blu-ray" -msgstr "" +msgstr "Blu-ray" -#: collections/videocollection.cpp:46 fetch/amazonfetcher.cpp:826 -#, fuzzy +#: collections/videocollection.cpp:47 fetch/amazonfetcher.cpp:804 msgid "HD DVD" -msgstr "DVD" +msgstr "HD DVD" -#: collections/musiccollection.cpp:45 collections/videocollection.cpp:47 +#: collections/musiccollection.cpp:46 collections/videocollection.cpp:48 msgid "Medium" msgstr "Mídia" -#: collections/videocollection.cpp:52 +#: collections/videocollection.cpp:53 msgid "Production Year" msgstr "Ano de Produção" -#: collections/videocollection.cpp:60 +#: collections/videocollection.cpp:61 msgid "" "_: Movie ratings - G (USA),PG (USA),PG-13 (USA),R (USA), U (USA)\n" "G (USA),PG (USA),PG-13 (USA),R (USA), U (USA)" msgstr "G (USA),PG (USA),PG-13 (USA),R (USA), U (USA)" -#: collections/videocollection.cpp:62 +#: collections/videocollection.cpp:63 msgid "Certification" msgstr "Certificação" -#: collections/videocollection.cpp:74 +#: collections/videocollection.cpp:75 msgid "Region 1" msgstr "Região 1" -#: collections/videocollection.cpp:75 +#: collections/videocollection.cpp:76 msgid "Region 2" msgstr "Região 2" -#: collections/videocollection.cpp:76 +#: collections/videocollection.cpp:77 msgid "Region 3" msgstr "Região 3" -#: collections/videocollection.cpp:77 +#: collections/videocollection.cpp:78 msgid "Region 4" msgstr "Região 4" -#: collections/videocollection.cpp:78 +#: collections/videocollection.cpp:79 msgid "Region 5" msgstr "Região 5" -#: collections/videocollection.cpp:79 +#: collections/videocollection.cpp:80 msgid "Region 6" msgstr "Região 6" -#: collections/videocollection.cpp:80 +#: collections/videocollection.cpp:81 msgid "Region 7" msgstr "Região 7" -#: collections/videocollection.cpp:81 +#: collections/videocollection.cpp:82 msgid "Region 8" msgstr "Região 8" -#: collections/videocollection.cpp:82 +#: collections/videocollection.cpp:83 msgid "Region" msgstr "Região" -#: collections/videocollection.cpp:87 +#: collections/videocollection.cpp:88 msgid "Nationality" msgstr "Nacionalidade" -#: collections/videocollection.cpp:94 +#: collections/videocollection.cpp:95 msgid "NTSC" msgstr "NTSC" -#: collections/videocollection.cpp:94 +#: collections/videocollection.cpp:95 msgid "PAL" msgstr "PAL" -#: collections/videocollection.cpp:94 +#: collections/videocollection.cpp:95 msgid "SECAM" msgstr "SECAM" -#: collections/videocollection.cpp:95 +#: collections/videocollection.cpp:96 msgid "Format" msgstr "Formato" -#: collections/videocollection.cpp:100 +#: collections/videocollection.cpp:101 msgid "Cast" msgstr "Elenco" -#: collections/videocollection.cpp:102 translators/tellicoimporter.cpp:443 +#: collections/videocollection.cpp:103 translators/tellicoimporter.cpp:409 msgid "Actor/Actress" msgstr "Ator/Atriz" -#: collections/videocollection.cpp:103 translators/tellicoimporter.cpp:444 +#: collections/videocollection.cpp:104 translators/tellicoimporter.cpp:410 msgid "Role" msgstr "Personagem" -#: collections/videocollection.cpp:106 +#: collections/videocollection.cpp:107 msgid "A table for the cast members, along with the roles they play" -msgstr "" -"Uma tabela para o elenco do filme, com o papel representado por cada um" +msgstr "Uma tabela para o elenco do filme, com o papel representado por cada um" -#: collections/videocollection.cpp:109 +#: collections/videocollection.cpp:110 msgid "Director" msgstr "Diretor" -#: collections/videocollection.cpp:127 +#: collections/videocollection.cpp:128 msgid "Composer" msgstr "Compositor" -#: collections/videocollection.cpp:133 +#: collections/videocollection.cpp:134 msgid "Studio" msgstr "Estúdio" -#: collections/videocollection.cpp:139 +#: collections/videocollection.cpp:140 msgid "Language Tracks" msgstr "Línguas disponíveis" -#: collections/videocollection.cpp:145 +#: collections/videocollection.cpp:146 msgid "Subtitle Languages" msgstr "Língua das Legendas" -#: collections/videocollection.cpp:151 +#: collections/videocollection.cpp:152 msgid "Audio Tracks" msgstr "Áudios Disponíveis" -#: collections/videocollection.cpp:157 +#: collections/videocollection.cpp:158 msgid "Running Time" msgstr "Duração" -#: collections/videocollection.cpp:159 +#: collections/videocollection.cpp:160 msgid "The running time of the video (in minutes)" msgstr "Duração do vídeo (em minutos)" -#: collections/videocollection.cpp:162 +#: collections/videocollection.cpp:163 msgid "Aspect Ratio" msgstr "Formato da Imagem" -#: collections/videocollection.cpp:167 fetch/amazonfetcher.cpp:815 -#: translators/tellicoimporter.cpp:958 +#: collections/videocollection.cpp:168 fetch/amazonfetcher.cpp:793 +#: translators/tellicoimporter.cpp:903 msgid "Widescreen" msgstr "Tela Larga" -#: collections/videocollection.cpp:172 +#: collections/videocollection.cpp:173 msgid "Black & White" msgstr "Preto & Branco" -#: collections/videocollection.cpp:173 +#: collections/videocollection.cpp:174 msgid "Color Mode" msgstr "Formato de Cor" -#: collections/videocollection.cpp:178 fetch/amazonfetcher.cpp:830 +#: collections/videocollection.cpp:179 fetch/amazonfetcher.cpp:808 msgid "Director's Cut" msgstr "Cortes do Diretor" -#: collections/videocollection.cpp:182 fetch/ibsfetcher.cpp:358 +#: collections/videocollection.cpp:183 fetch/ibsfetcher.cpp:358 msgid "Plot Summary" msgstr "Resumo da Ação" -#: collections/gamecollection.cpp:90 collections/videocollection.cpp:185 +#: collections/gamecollection.cpp:91 collections/videocollection.cpp:186 msgid "Personal Rating" msgstr "Nota Pessoal" -#: collections/boardgamecollection.cpp:102 collections/gamecollection.cpp:116 -#: collections/musiccollection.cpp:108 collections/videocollection.cpp:207 +#: collections/gamecollection.cpp:117 collections/musiccollection.cpp:109 +#: collections/videocollection.cpp:208 msgid "Cover" msgstr "Capa" #: collections/gamecollection.cpp:26 +msgid "Games" +msgstr "Jogos" + +#: collections/gamecollection.cpp:27 msgid "My Games" msgstr "Meus Jogos" -#: collections/gamecollection.cpp:44 +#: collections/gamecollection.cpp:45 msgid "Xbox 360" msgstr "Xbox 360" -#: collections/gamecollection.cpp:44 +#: collections/gamecollection.cpp:45 msgid "Xbox" msgstr "Xbox" -#: collections/gamecollection.cpp:45 +#: collections/gamecollection.cpp:46 msgid "PlayStation3" msgstr "PlayStation3" -#: collections/gamecollection.cpp:45 +#: collections/gamecollection.cpp:46 msgid "PlayStation2" msgstr "PlayStation2" -#: collections/gamecollection.cpp:45 +#: collections/gamecollection.cpp:46 msgid "PlayStation" msgstr "PlayStation" -#: collections/gamecollection.cpp:45 +#: collections/gamecollection.cpp:46 msgid "" "_: PlayStation Portable\n" "PSP" msgstr "PSP" -#: collections/gamecollection.cpp:46 +#: collections/gamecollection.cpp:47 msgid "Nintendo Wii" msgstr "Revolução" -#: collections/gamecollection.cpp:46 +#: collections/gamecollection.cpp:47 msgid "Nintendo DS" msgstr "Nintendo DS" -#: collections/gamecollection.cpp:46 +#: collections/gamecollection.cpp:47 msgid "GameCube" msgstr "GameCube" -#: collections/gamecollection.cpp:46 +#: collections/gamecollection.cpp:47 msgid "Dreamcast" msgstr "Dreamcast" -#: collections/gamecollection.cpp:47 +#: collections/gamecollection.cpp:48 msgid "Game Boy Advance" msgstr "Game Boy Advance" -#: collections/gamecollection.cpp:47 +#: collections/gamecollection.cpp:48 msgid "Game Boy Color" msgstr "Game Boy Color" -#: collections/gamecollection.cpp:47 +#: collections/gamecollection.cpp:48 msgid "Game Boy" msgstr "Game Boy" -#: collections/gamecollection.cpp:48 +#: collections/gamecollection.cpp:49 msgid "" "_: Windows Platform\n" "Windows" msgstr "Windows" -#: collections/gamecollection.cpp:48 +#: collections/gamecollection.cpp:49 msgid "Mac OS" msgstr "Mac OS" -#: collections/gamecollection.cpp:48 -msgid "Linux" -msgstr "" - -#: collections/gamecollection.cpp:49 +#: collections/gamecollection.cpp:50 msgid "Platform" msgstr "Platforma" -#: collections/boardgamecollection.cpp:55 collections/gamecollection.cpp:60 +#: collections/gamecollection.cpp:61 msgid "Release Year" msgstr "Ano de Lançamento" -#: collections/gamecollection.cpp:65 +#: collections/gamecollection.cpp:66 msgid "" "_: Games - Publisher\n" "Publisher" msgstr "Editora" -#: collections/gamecollection.cpp:71 +#: collections/gamecollection.cpp:72 msgid "Developer" msgstr "Desenvolvedor" -#: collections/gamecollection.cpp:80 +#: collections/gamecollection.cpp:81 msgid "" "_: Video game ratings - Unrated, Adults Only, Mature, Teen, Everyone, Early " "Childhood, Pending\n" @@ -1011,381 +1013,363 @@ msgstr "" "Não Classificado, Somente Adultos, Jovens, Adolescentes, Sem Censura, " "Infantil, Pendente" -#: collections/gamecollection.cpp:82 +#: collections/gamecollection.cpp:83 msgid "ESRB Rating" msgstr "Classificação da ESRB" -#: collections/gamecollection.cpp:95 +#: collections/gamecollection.cpp:96 msgid "Completed" msgstr "Completado" #: collections/cardcollection.cpp:26 +msgid "Cards" +msgstr "Cartões" + +#: collections/cardcollection.cpp:27 msgid "My Cards" msgstr "Meus Cartões" -#: collections/cardcollection.cpp:43 +#: collections/cardcollection.cpp:44 msgid "Player" msgstr "Jogador" -#: collections/cardcollection.cpp:49 +#: collections/cardcollection.cpp:50 msgid "Team" msgstr "Time" -#: collections/cardcollection.cpp:55 +#: collections/cardcollection.cpp:56 msgid "Brand" msgstr "Marca" -#: collections/cardcollection.cpp:62 +#: collections/cardcollection.cpp:63 msgid "Card Number" msgstr "Número do Cartão" -#: collections/cardcollection.cpp:77 +#: collections/cardcollection.cpp:78 msgid "Card Type" msgstr "Tipo do Cartão" -#: collections/cardcollection.cpp:109 +#: collections/cardcollection.cpp:110 msgid "Front Image" msgstr "Imagem Frontal" -#: collections/cardcollection.cpp:112 +#: collections/cardcollection.cpp:113 msgid "Back Image" msgstr "Imagem no Verso" -#: collections/boardgamecollection.cpp:26 -#, fuzzy -msgid "My Board Games" -msgstr "Meus Jogos" - -#: collections/boardgamecollection.cpp:49 -msgid "Mechanism" -msgstr "" - -#: collections/boardgamecollection.cpp:66 -msgid "Designer" -msgstr "" +#: collections/bibtexcollection.cpp:30 +msgid "Entries" +msgstr "Registros" -#: collections/boardgamecollection.cpp:72 -msgid "Number of Players" -msgstr "" - -#: collectionfactory.cpp:125 collections/bibtexcollection.cpp:30 +#: collectionfactory.cpp:119 collections/bibtexcollection.cpp:31 msgid "Bibliography" msgstr "Bibliografia" -#: collections/bibtexcollection.cpp:72 +#: collections/bibtexcollection.cpp:73 msgid "Entry Type" msgstr "Tipo de Registro" -#: collections/bibtexcollection.cpp:76 +#: collections/bibtexcollection.cpp:77 msgid "These entry types are specific to bibtex. See the bibtex documentation." msgstr "" "Estes tipos de registro são específicos para o BibTeX. Consulte a " "documentação do mesmo." -#: collections/bibtexcollection.cpp:86 +#: collections/bibtexcollection.cpp:87 msgid "Bibtex Key" msgstr "Chave do BibTeX" -#: collections/bibtexcollection.cpp:92 +#: collections/bibtexcollection.cpp:93 msgid "Book Title" msgstr "Título do livro" -#: collections/bibtexcollection.cpp:98 +#: collections/bibtexcollection.cpp:99 msgid "Editor" msgstr "Editor" -#: collections/bibtexcollection.cpp:105 +#: collections/bibtexcollection.cpp:106 msgid "Organization" msgstr "Organização" -#: collections/bibtexcollection.cpp:127 fetch/srufetcher.cpp:412 -#: fetch/z3950fetcher.cpp:668 +#: collections/bibtexcollection.cpp:128 fetch/srufetcher.cpp:434 +#: fetch/z3950fetcher.cpp:670 msgid "Address" msgstr "Endereço" -#: collections/bibtexcollection.cpp:164 fetch/fetchmanager.cpp:73 -msgid "DOI" -msgstr "" - #: collections/bibtexcollection.cpp:167 -msgid "Digital Object Identifier" -msgstr "" - -#: collections/bibtexcollection.cpp:172 msgid "Month" msgstr "Mês" -#: collections/bibtexcollection.cpp:178 field.cpp:494 +#: collections/bibtexcollection.cpp:173 field.cpp:486 msgid "Number" msgstr "Número " -#: collections/bibtexcollection.cpp:183 +#: collections/bibtexcollection.cpp:178 msgid "How Published" msgstr "Modo de publicação" -#: collections/bibtexcollection.cpp:195 +#: collections/bibtexcollection.cpp:190 msgid "Chapter" msgstr "Capítulo" -#: collections/bibtexcollection.cpp:212 +#: collections/bibtexcollection.cpp:207 msgid "Cross-Reference" msgstr "Referência cruzada" -#: collections/bibtexcollection.cpp:232 fetch/entrezfetcher.cpp:486 -#: fetch/srufetcher.cpp:413 fetch/z3950fetcher.cpp:669 -#: translators/risimporter.cpp:269 +#: collections/bibtexcollection.cpp:222 fetch/entrezfetcher.cpp:464 +#: fetch/srufetcher.cpp:435 fetch/z3950fetcher.cpp:671 +#: translators/risimporter.cpp:246 msgid "Abstract" msgstr "Resumo" -#: collections/bibtexcollection.cpp:236 +#: collections/bibtexcollection.cpp:226 msgid "Notes" msgstr "Notas" #: collections/musiccollection.cpp:26 +msgid "Albums" +msgstr "Álbuns" + +#: collections/musiccollection.cpp:27 msgid "My Music" msgstr "Minhas Músicas" -#: collections/musiccollection.cpp:37 +#: collections/musiccollection.cpp:38 msgid "Album" msgstr "Álbum" -#: collections/musiccollection.cpp:44 translators/freedbimporter.cpp:257 -#: translators/freedbimporter.cpp:375 translators/freedbimporter.cpp:446 +#: collections/musiccollection.cpp:45 translators/freedbimporter.cpp:257 +#: translators/freedbimporter.cpp:374 translators/freedbimporter.cpp:445 msgid "Compact Disc" msgstr "CD" -#: collections/musiccollection.cpp:44 +#: collections/musiccollection.cpp:45 msgid "Cassette" msgstr "Cassete" -#: collections/musiccollection.cpp:44 +#: collections/musiccollection.cpp:45 msgid "Vinyl" msgstr "Vinil" -#: collections/musiccollection.cpp:50 collections/musiccollection.cpp:77 -#: translators/audiofileimporter.cpp:165 translators/tellicoimporter.cpp:440 +#: collections/musiccollection.cpp:51 collections/musiccollection.cpp:78 +#: translators/audiofileimporter.cpp:151 translators/tellicoimporter.cpp:406 msgid "Artist" msgstr "Artista" -#: collections/musiccollection.cpp:56 +#: collections/musiccollection.cpp:57 msgid "Label" msgstr "Selo" -#: collections/musiccollection.cpp:73 +#: collections/musiccollection.cpp:74 translators/audiofileimporter.cpp:146 msgid "Tracks" msgstr "Pistas" -#: collections/musiccollection.cpp:78 translators/audiofileimporter.cpp:166 -#: translators/tellicoimporter.cpp:441 +#: collections/musiccollection.cpp:79 translators/audiofileimporter.cpp:152 +#: translators/tellicoimporter.cpp:407 msgid "Length" msgstr "Duração" -#: core/tellico_config.cpp:134 +#: core/tellico_config.cpp:118 msgid "" "a,an,and,as,at,but,by,for,from,in,into,nor,of,off,on,onto,or,out,over,the,to," "up,with" msgstr "um,uma,e,em,de,o,a " -#: core/tellico_config.cpp:137 +#: core/tellico_config.cpp:121 msgid "the" msgstr "o,a,os,as " -#: core/tellico_config.cpp:140 +#: core/tellico_config.cpp:124 msgid "jr.,jr,iii,iv" msgstr "jr.,jr,iii,iv " -#: core/tellico_config.cpp:143 +#: core/tellico_config.cpp:127 msgid "de,van,der,van der,von" msgstr "de,o,a " -#: fetch/isbndbfetcher.cpp:54 +#: fetch/isbndbfetcher.cpp:51 msgid "ISBNdb.com" msgstr "ISBNdb.com" #: fetch/amazonfetcher.cpp:192 fetch/animenfofetcher.cpp:75 -#: fetch/arxivfetcher.cpp:83 fetch/bibsonomyfetcher.cpp:66 -#: fetch/citebasefetcher.cpp:67 fetch/crossreffetcher.cpp:89 -#: fetch/discogsfetcher.cpp:102 fetch/ibsfetcher.cpp:72 -#: fetch/isbndbfetcher.cpp:79 fetch/yahoofetcher.cpp:94 +#: fetch/ibsfetcher.cpp:72 fetch/isbndbfetcher.cpp:76 +#: fetch/yahoofetcher.cpp:94 msgid "%1 does not allow searching for this collection type." msgstr "%1 não permite a pesquisa para este tipo de coleção." -#: fetch/amazonfetcher.cpp:562 fetch/isbndbfetcher.cpp:247 -msgid "Results from %1: %2/%3" -msgstr "Resultados de %1 : %2/%3" - -#: fetch/animenfofetcher.cpp:370 fetch/arxivfetcher.cpp:355 -#: fetch/bibsonomyfetcher.cpp:198 fetch/citebasefetcher.cpp:237 -#: fetch/entrezfetcher.cpp:466 fetch/ibsfetcher.cpp:407 -#: fetch/isbndbfetcher.cpp:342 fetch/yahoofetcher.cpp:392 +#: fetch/animenfofetcher.cpp:370 fetch/entrezfetcher.cpp:444 +#: fetch/ibsfetcher.cpp:407 fetch/isbndbfetcher.cpp:258 +#: fetch/yahoofetcher.cpp:393 msgid "This source has no options." -msgstr "Esta fonte não tem opções" +msgstr "Esta fonte não tem opções." -#: fetch/entrezfetcher.cpp:56 +#: fetch/entrezfetcher.cpp:55 msgid "Entrez Database" msgstr "Banco de Dados Entrez" -#: fetch/entrezfetcher.cpp:485 +#: fetch/entrezfetcher.cpp:463 msgid "Institution" msgstr "Instituição" -#: fetch/z3950connection.cpp:132 +#: fetch/z3950connection.cpp:117 msgid "Query error!" msgstr "Erro na pesquisa!" -#: fetch/z3950connection.cpp:173 +#: fetch/z3950connection.cpp:158 msgid "Connection search error %1: %2" msgstr "Erro na procura da conexão %1: %2" -#: fetch/z3950connection.cpp:250 +#: fetch/z3950connection.cpp:235 msgid "Record syntax error" msgstr "Erro de Sintaxe no Registro" -#: fetch/z3950connection.cpp:345 +#: fetch/z3950connection.cpp:331 msgid "Connection error %1: %2" msgstr "Erro de conexão %1: %2" -#: fetch/srufetcher.cpp:72 +#: fetch/srufetcher.cpp:65 msgid "SRU Server" msgstr "Servidor SRU" -#: fetch/srufetcher.cpp:405 z3950.cpp:2 +#: fetch/srufetcher.cpp:334 z3950.cpp:2 msgid "Library of Congress (US)" msgstr "Biblioteca do Congresso (Estados Unidos)" -#: fetch/imdbfetcher.cpp:1121 fetch/srufetcher.cpp:428 -#: fetch/z3950fetcher.cpp:504 +#: fetch/imdbfetcher.cpp:1099 fetch/srufetcher.cpp:349 +#: fetch/z3950fetcher.cpp:506 msgid "Hos&t: " -msgstr "&Servidor:" +msgstr "&Servidor: " -#: fetch/srufetcher.cpp:435 fetch/z3950fetcher.cpp:510 +#: fetch/srufetcher.cpp:355 fetch/z3950fetcher.cpp:512 msgid "Enter the host name of the server." -msgstr "Insira o nome do servidor" +msgstr "Insira o nome do servidor." -#: fetch/srufetcher.cpp:440 fetch/z3950fetcher.cpp:515 +#: fetch/srufetcher.cpp:360 fetch/z3950fetcher.cpp:517 msgid "&Port: " -msgstr "&Porta:" +msgstr "&Porta: " -#: fetch/srufetcher.cpp:445 fetch/z3950fetcher.cpp:520 +#: fetch/srufetcher.cpp:365 fetch/z3950fetcher.cpp:522 #, c-format msgid "Enter the port number of the server. The default is %1." msgstr "Insira o número da porta do servidor z39.50. A porta padrão é %1." -#: fetch/srufetcher.cpp:450 +#: fetch/srufetcher.cpp:370 msgid "Path: " -msgstr "Caminho:" +msgstr "Caminho: " -#: fetch/srufetcher.cpp:455 +#: fetch/srufetcher.cpp:375 msgid "Enter the path to the database used by the server." -msgstr "Insira o caminho para o banco de dados utilizado pelo servidor" +msgstr "Insira o caminho para o banco de dados utilizado pelo servidor." -#: fetch/srufetcher.cpp:460 +#: fetch/srufetcher.cpp:380 msgid "Format: " -msgstr "Formato:" +msgstr "Formato: " -#: fetch/srufetcher.cpp:468 +#: fetch/srufetcher.cpp:387 msgid "Enter the result format used by the server." msgstr "Informe o formato de resultado utilizado pelo servidor." -#: fetch/yahoofetcher.cpp:54 +#: fetch/yahoofetcher.cpp:53 msgid "Yahoo! Audio Search" msgstr "Yahoo! Audio Search" -#: fetch/amazonfetcher.cpp:730 fetch/discogsfetcher.cpp:539 -#: fetch/yahoofetcher.cpp:242 +#: fetch/amazonfetcher.cpp:709 fetch/yahoofetcher.cpp:243 msgid "The cover image could not be loaded." msgstr "A imagem da capa não pôde ser carregada." -#: fetch/amazonfetcher.cpp:53 +#: fetch/amazonfetcher.cpp:52 msgid "Amazon Link" msgstr "Amazon Link" -#: fetch/amazonfetcher.cpp:62 +#: fetch/amazonfetcher.cpp:61 msgid "Amazon (US)" msgstr "Amazon (Estados Unidos)" -#: fetch/amazonfetcher.cpp:65 +#: fetch/amazonfetcher.cpp:64 msgid "Amazon (UK)" msgstr "Amazon (Reino Unido)" -#: fetch/amazonfetcher.cpp:68 +#: fetch/amazonfetcher.cpp:67 msgid "Amazon (Germany)" msgstr "Amazon (Alemanha)" -#: fetch/amazonfetcher.cpp:71 +#: fetch/amazonfetcher.cpp:70 msgid "Amazon (Japan)" msgstr "Amazon (Japão)" -#: fetch/amazonfetcher.cpp:74 +#: fetch/amazonfetcher.cpp:73 msgid "Amazon (France)" msgstr "Amazon (França)" -#: fetch/amazonfetcher.cpp:77 +#: fetch/amazonfetcher.cpp:76 msgid "Amazon (Canada)" msgstr "Amazon (Canadá)" -#: fetch/amazonfetcher.cpp:99 +#: fetch/amazonfetcher.cpp:98 msgid "Amazon.com Web Services" msgstr "Serviços Web da Amazon.com" -#: fetch/amazonfetcher.cpp:848 +#: fetch/amazonfetcher.cpp:543 +msgid "Results from %1: %2/%3" +msgstr "Resultados de %1 : %2/%3" + +#: fetch/amazonfetcher.cpp:826 msgid "Co&untry: " msgstr "&País" -#: fetch/amazonfetcher.cpp:851 +#: fetch/amazonfetcher.cpp:830 msgid "United States" msgstr "Estados Unidos" -#: fetch/amazonfetcher.cpp:852 +#: fetch/amazonfetcher.cpp:831 msgid "United Kingdom" msgstr "Reino Unido" -#: fetch/amazonfetcher.cpp:853 +#: fetch/amazonfetcher.cpp:832 msgid "Germany" msgstr "Alemanha" -#: fetch/amazonfetcher.cpp:854 +#: fetch/amazonfetcher.cpp:833 msgid "Japan" msgstr "Japão" -#: fetch/amazonfetcher.cpp:855 +#: fetch/amazonfetcher.cpp:834 msgid "France" msgstr "França" -#: fetch/amazonfetcher.cpp:856 +#: fetch/amazonfetcher.cpp:835 msgid "Canada" msgstr "Canadá" -#: fetch/amazonfetcher.cpp:860 +#: fetch/amazonfetcher.cpp:839 msgid "" "Amazon.com provides data from several different localized sites. Choose the " "one you wish to use for this data source." msgstr "" -"Amazon.com disponibiliza dados de vários sites em diferentes " -"localizações. Escolha o que deseja utilizar como fonte de dados." +"Amazon.com disponibiliza dados de vários sites em diferentes localizações. " +"Escolha o que deseja utilizar como fonte de dados." -#: fetch/amazonfetcher.cpp:866 +#: fetch/amazonfetcher.cpp:845 msgid "&Image size: " msgstr "&Tamanho da Imagem" -#: fetch/amazonfetcher.cpp:869 +#: fetch/amazonfetcher.cpp:849 msgid "Small Image" msgstr "Imagem Pequena" -#: fetch/amazonfetcher.cpp:870 +#: fetch/amazonfetcher.cpp:850 msgid "Medium Image" msgstr "Imagem Média" -#: fetch/amazonfetcher.cpp:871 +#: fetch/amazonfetcher.cpp:851 msgid "Large Image" msgstr "Imagem Grande" -#: fetch/amazonfetcher.cpp:872 +#: fetch/amazonfetcher.cpp:852 msgid "No Image" msgstr "Sem Imagem" -#: fetch/amazonfetcher.cpp:875 fetch/discogsfetcher.cpp:683 -#: fetch/imdbfetcher.cpp:1146 +#: fetch/amazonfetcher.cpp:855 fetch/imdbfetcher.cpp:1124 msgid "" "The cover image may be downloaded as well. However, too many large images in " "the collection may degrade performance." @@ -1393,39 +1377,39 @@ msgstr "" "A imagem da capa pode obtida da mesma forma. No entanto, imagens grandes na " "coleção podem degradar o desempenho." -#: fetch/amazonfetcher.cpp:881 +#: fetch/amazonfetcher.cpp:861 msgid "&Associate's ID: " msgstr "Identidade &associada: " -#: fetch/amazonfetcher.cpp:886 +#: fetch/amazonfetcher.cpp:866 msgid "" "The associate's id identifies the person accessing the Amazon.com Web " "Services, and is included in any links to the Amazon.com site." msgstr "" -"A identidade associada identifica a pessoa acessando os serviços Web " -"Amazon.com, e será incluída em todos os links para o site Amazon.com." +"A identidade associada identifica a pessoa acessando os serviços Web Amazon." +"com, e será incluída em todos os links para o site Amazon.com." -#: fetch/z3950fetcher.cpp:79 fetch/z3950fetcher.cpp:755 +#: fetch/z3950fetcher.cpp:79 fetch/z3950fetcher.cpp:757 msgid "z39.50 Server" msgstr "Servidor z39.50" -#: fetch/z3950fetcher.cpp:494 +#: fetch/z3950fetcher.cpp:496 msgid "Use preset &server:" -msgstr "Usar &servidor pré-definido" +msgstr "Usar &servidor pré-definido:" -#: fetch/z3950fetcher.cpp:525 +#: fetch/z3950fetcher.cpp:527 msgid "&Database: " -msgstr "Base de &dados:" +msgstr "Base de &dados: " -#: fetch/z3950fetcher.cpp:530 +#: fetch/z3950fetcher.cpp:532 msgid "Enter the database name used by the server." msgstr "Insira o nome da base de dados utilizado pelo servidor." -#: fetch/z3950fetcher.cpp:535 +#: fetch/z3950fetcher.cpp:537 msgid "Ch&aracter set: " msgstr "Conjunto de c&aracteres: " -#: fetch/z3950fetcher.cpp:544 +#: fetch/z3950fetcher.cpp:546 msgid "" "Enter the character set encoding used by the z39.50 server. The most likely " "choice is MARC-8, although ISO-8859-1 is common as well." @@ -1433,15 +1417,15 @@ msgstr "" "Insira o conjunto de caracteres utilizado pelo servidor z39.50. A escolha " "mais provável é MARC-8, apesar do ISO-8859-1 ser tão comum quanto." -#: fetch/z3950fetcher.cpp:550 +#: fetch/z3950fetcher.cpp:552 msgid "&Format: " -msgstr "&Formato:" +msgstr "&Formato: " -#: fetch/z3950fetcher.cpp:553 +#: fetch/z3950fetcher.cpp:555 msgid "Auto-detect" msgstr "Detectar automaticamente" -#: fetch/z3950fetcher.cpp:561 +#: fetch/z3950fetcher.cpp:563 msgid "" "Enter the data format used by the z39.50 server. Tellico will attempt to " "automatically detect the best setting if auto-detect is selected." @@ -1450,15 +1434,15 @@ msgstr "" "tentar detectar a melhor configuração se Detectar automaticamente " "estiver selecionado." -#: fetch/z3950fetcher.cpp:567 +#: fetch/z3950fetcher.cpp:569 msgid "&User: " -msgstr "&Usuário:" +msgstr "&Usuário: " -#: fetch/z3950fetcher.cpp:570 fetch/z3950fetcher.cpp:582 +#: fetch/z3950fetcher.cpp:572 fetch/z3950fetcher.cpp:584 msgid "Optional" msgstr "Opcional" -#: fetch/z3950fetcher.cpp:573 +#: fetch/z3950fetcher.cpp:575 msgid "" "Enter the authentication user name used by the z39.50 database. Most servers " "do not need one." @@ -1466,21 +1450,21 @@ msgstr "" "Insira o nome da base de dados utilizada pelo servidor z39.50. A maioria dos " "servidores não precisam dele." -#: fetch/z3950fetcher.cpp:579 +#: fetch/z3950fetcher.cpp:581 msgid "Pass&word: " -msgstr "&Senha:" +msgstr "&Senha: " -#: fetch/z3950fetcher.cpp:586 +#: fetch/z3950fetcher.cpp:588 msgid "" "Enter the authentication password used by the z39.50 database. Most servers " "do not need one. The password will be saved in plain text in the Tellico " "configuration file." msgstr "" "Insira a senha utilizada para a base de dados z39.50. A maior parte dos " -"servidores não precisam dela. A senha será salva em formato texto no " -"arquivo de configuração do Tellico." +"servidores não precisam dela. A senha será salva em formato texto no arquivo " +"de configuração do Tellico." -#: fetch/z3950fetcher.cpp:670 +#: fetch/z3950fetcher.cpp:672 msgid "Illustrator" msgstr "Ilustrador" @@ -1488,31 +1472,28 @@ msgstr "Ilustrador" msgid "External Application" msgstr "Aplicativo Externo" -#: configdialog.cpp:363 fetch/execexternalfetcher.cpp:346 -#: fetch/gcstarpluginfetcher.cpp:398 translators/csvimporter.cpp:226 +#: configdialog.cpp:354 fetch/execexternalfetcher.cpp:336 +#: translators/csvimporter.cpp:171 msgid "Collection &type:" msgstr "&Tipo de coleção:" -#: fetch/execexternalfetcher.cpp:351 -msgid "" -"Set the collection type of the data returned from the external application." -msgstr "" -"Especifique o tipo de coleção dos dados retornados do aplicativo externo." +#: fetch/execexternalfetcher.cpp:341 +msgid "Set the collection type of the data returned from the external application." +msgstr "Especifique o tipo de coleção dos dados retornados do aplicativo externo." -#: fetch/execexternalfetcher.cpp:356 +#: fetch/execexternalfetcher.cpp:346 msgid "&Result type: " -msgstr "Tipo de &Resultado:" +msgstr "Tipo de &Resultado: " -#: fetch/execexternalfetcher.cpp:365 +#: fetch/execexternalfetcher.cpp:355 msgid "Set the result type of the data returned from the external application." -msgstr "" -"Especifique o tipo de resultado dos dados retornados do aplicativo externo." +msgstr "Especifique o tipo de resultado dos dados retornados do aplicativo externo." -#: fetch/execexternalfetcher.cpp:370 +#: fetch/execexternalfetcher.cpp:360 msgid "Application &path: " -msgstr "&Caminho do Aplicativo:" +msgstr "&Caminho do aplicativo: " -#: fetch/execexternalfetcher.cpp:375 +#: fetch/execexternalfetcher.cpp:365 msgid "" "Set the path of the application to run that should output a valid Tellico " "data file." @@ -1520,11 +1501,11 @@ msgstr "" "Especifique o caminho do aplicativo a ser executado que deve gerar um " "arquivo de dados Tellico válido." -#: fetch/execexternalfetcher.cpp:380 +#: fetch/execexternalfetcher.cpp:370 msgid "Select the search keys supported by the data source." msgstr "Selecione as chaves de procura suportadas pela fonte de dados." -#: fetch/execexternalfetcher.cpp:381 +#: fetch/execexternalfetcher.cpp:371 msgid "" "Add any arguments that may be needed. %1 will be replaced by the " "search term." @@ -1532,27 +1513,26 @@ msgstr "" "Adicione todos os argumentos necessários. %1 vai ser substituído " "pelo termo a ser pesquisado." -#: fetch/execexternalfetcher.cpp:382 +#: fetch/execexternalfetcher.cpp:372 msgid "Arguments" msgstr "Argumentos" -#: fetch/execexternalfetcher.cpp:415 newstuff/dialog.cpp:152 +#: fetch/execexternalfetcher.cpp:405 newstuff/dialog.cpp:151 msgid "Update" msgstr "Atualizar" #. TRANSLATORS: Do not translate %{author}. -#: fetch/execexternalfetcher.cpp:423 +#: fetch/execexternalfetcher.cpp:413 msgid "" "

Enter the arguments which should be used to search for available updates " "to an entry.

The format is the same as for Dependent fields, " "where field values are contained inside braces, such as %{author}. " "See the documentation for details.

" msgstr "" -"

Forneça os argumentos que devem ser usados para procurar por " -"atualizações disponíveis para um registro.

O formato é o mesmo dos " -"campos Dependentes, onde os valores dos campos são contidos entre " -"colchetes, como %{author}. Veja a documentação para maiores " -"detalhes.

" +"

Forneça os argumentos que devem ser usados para procurar por atualizações " +"disponíveis para um registro.

O formato é o mesmo dos campos " +"Dependentes, onde os valores dos campos são contidos entre colchetes, " +"como %{author}. Veja a documentação para maiores detalhes.

" #: fetch/configwidget.cpp:29 msgid "Source Options" @@ -1562,7 +1542,7 @@ msgstr "Opções da Fonte" msgid "Available Fields" msgstr "Campos Disponíveis" -#: fetch/imdbfetcher.cpp:89 +#: fetch/imdbfetcher.cpp:88 msgid "Internet Movie Database" msgstr "Base de dados de filmes na Internet" @@ -1571,8 +1551,7 @@ msgid "Select IMDB Result" msgstr "Selecione o resultado IMDB" #: fetch/imdbfetcher.cpp:581 -msgid "" -"Your search returned multiple matches. Please select one below." +msgid "Your search returned multiple matches. Please select one below." msgstr "" "A sua pesquisa retornou vários resultados. Por favor selecione um dos " "seguintes." @@ -1581,24 +1560,24 @@ msgstr "" msgid "Select a search result." msgstr "Selecione um resultado da pesquisa." -#: fetch/imdbfetcher.cpp:688 fetch/imdbfetcher.cpp:1185 +#: fetch/imdbfetcher.cpp:688 fetch/imdbfetcher.cpp:1163 msgid "IMDB Link" msgstr "Link IMDB" -#: fetch/animenfofetcher.cpp:260 fetch/imdbfetcher.cpp:746 -#: fetch/imdbfetcher.cpp:1187 +#: fetch/animenfofetcher.cpp:260 fetch/imdbfetcher.cpp:741 +#: fetch/imdbfetcher.cpp:1165 msgid "Alternative Titles" msgstr "Títulos alternativos" -#: fetch/imdbfetcher.cpp:947 fetch/imdbfetcher.cpp:1186 +#: fetch/imdbfetcher.cpp:932 fetch/imdbfetcher.cpp:1164 msgid "IMDB Rating" msgstr "Classificação IMDB" -#: fetch/imdbfetcher.cpp:1065 fetch/imdbfetcher.cpp:1188 +#: fetch/imdbfetcher.cpp:1043 fetch/imdbfetcher.cpp:1166 msgid "Certifications" msgstr "Certificações" -#: fetch/imdbfetcher.cpp:1126 +#: fetch/imdbfetcher.cpp:1104 msgid "" "The Internet Movie Database uses several different servers. Choose the one " "you wish to use." @@ -1606,11 +1585,11 @@ msgstr "" "A base de dados de filmes na Internet (IMDB) utiliza vários servidores " "diferentes. Escolha o que deseja utilizar." -#: fetch/imdbfetcher.cpp:1132 +#: fetch/imdbfetcher.cpp:1110 msgid "&Maximum cast: " -msgstr "Elenco &máximo:" +msgstr "Elenco &máximo: " -#: fetch/imdbfetcher.cpp:1137 +#: fetch/imdbfetcher.cpp:1115 msgid "" "The list of cast members may include many people. Set the maximum number " "returned from the search." @@ -1618,40 +1597,31 @@ msgstr "" "A lista de membros do elenco pode incluir muitas pessoas. Especifique o " "número máximo a ser retornado da pesquisa." -#: fetch/discogsfetcher.cpp:679 fetch/imdbfetcher.cpp:1142 +#: fetch/imdbfetcher.cpp:1120 msgid "Download cover &image" msgstr "Efetuar o Download da &Imagem da Capa" -#: fetch/ibsfetcher.cpp:47 +#: fetch/ibsfetcher.cpp:46 msgid "Internet Bookshop (ibs.it)" msgstr "Internet Bookshop (ibs.it)" -#: fetch/fetchmanager.cpp:69 +#: fetch/fetchmanager.cpp:63 msgid "Person" msgstr "Pessoa" -#: fetch/fetchmanager.cpp:70 +#: fetch/fetchmanager.cpp:64 msgid "ISBN" msgstr "ISBN" -#: fetch/fetchmanager.cpp:71 -#, fuzzy -msgid "UPC/EAN" +#: fetch/fetchmanager.cpp:65 +msgid "UPC" msgstr "UPC" -#: fetch/fetchmanager.cpp:72 +#: fetch/fetchmanager.cpp:66 msgid "Keyword" msgstr "Palavra chave" -#: fetch/fetchmanager.cpp:74 translators/pdfimporter.cpp:173 -msgid "arXiv ID" -msgstr "" - -#: fetch/fetchmanager.cpp:75 -msgid "Pubmed ID" -msgstr "" - -#: fetch/fetchmanager.cpp:76 +#: fetch/fetchmanager.cpp:67 msgid "Raw Query" msgstr "Pesquisa não refinada" @@ -1667,128 +1637,49 @@ msgstr "Distribuidor" msgid "Episodes" msgstr "Episódios" -#: fetch/arxivfetcher.cpp:53 -msgid "arXiv.org" -msgstr "" - -#: fetch/crossreffetcher.cpp:83 -msgid "%1 requires a username and password." -msgstr "" - -#: fetch/crossreffetcher.cpp:332 -msgid "" -"CrossRef requires an account for access. Please read the terms and " -"conditions and request an " -"account. Enter your OpenURL account information below." -msgstr "" - -#: fetch/crossreffetcher.cpp:343 -#, fuzzy -msgid "&Username: " -msgstr "&Usuário:" - -#: fetch/crossreffetcher.cpp:348 -#, fuzzy -msgid "" -"A username and password is required to access the CrossRef service. The " -"password is stored as plain text in the Tellico configuration file." -msgstr "" -"Insira a senha utilizada para a base de dados z39.50. A maior parte dos " -"servidores não precisam dela. A senha será salva em formato texto no " -"arquivo de configuração do Tellico." - -#: fetch/crossreffetcher.cpp:354 -#, fuzzy -msgid "&Password: " -msgstr "&Senha:" - -#: fetch/gcstarpluginfetcher.cpp:190 -#, fuzzy -msgid "GCstar Plugin" -msgstr "Elenco" - -#: fetch/gcstarpluginfetcher.cpp:404 -#, fuzzy -msgid "Set the collection type of the data returned from the plugin." -msgstr "" -"Especifique o tipo de coleção dos dados retornados do aplicativo externo." - -#: fetch/gcstarpluginfetcher.cpp:409 -msgid "&Plugin: " -msgstr "" - -#: fetch/gcstarpluginfetcher.cpp:415 -#, fuzzy -msgid "Select the GCstar plugin used for the data source." -msgstr "Selecione as chaves de procura suportadas pela fonte de dados." - -#: fetch/gcstarpluginfetcher.cpp:420 -#, fuzzy -msgid "Author: " -msgstr "Autor" - -#: fetch/discogsfetcher.cpp:58 -#, fuzzy -msgid "Discogs Audio Search" -msgstr "Yahoo! Audio Search" - -#: fetch/discogsfetcher.cpp:668 -msgid "API &key: " -msgstr "" - -#: fetch/discogsfetcher.cpp:674 -msgid "" -"With your discogs.com account you receive an API key for the usage of their " -"XML-based interface (See http://www.discogs.com/help/api)." -msgstr "" - -#: fetch/discogsfetcher.cpp:718 -msgid "Discogs Link" -msgstr "" - -#: newstuff/dialog.cpp:94 +#: newstuff/dialog.cpp:93 msgid "Get Hot New Stuff" msgstr "Novidades Quentes" -#: newstuff/dialog.cpp:114 +#: newstuff/dialog.cpp:113 msgid "Version" msgstr "Versão" -#: newstuff/dialog.cpp:116 +#: newstuff/dialog.cpp:115 msgid "Downloads" msgstr "Downloads" -#: newstuff/dialog.cpp:117 +#: newstuff/dialog.cpp:116 msgid "Release Date" msgstr "Data de Lançamento" -#: newstuff/dialog.cpp:121 +#: newstuff/dialog.cpp:120 msgid "" "This is a list of all the items available for download. Previously installed " "items have a checkmark icon, while items with new version available have an " "update icon" msgstr "" "Essa é uma lista de todos os itens disponíveis para download. Itens " -"previamente instalados são mostrados com um tique, enquanto itens que " -"tenham novas versões disponíveis tem um ícone de atualização." +"previamente instalados são mostrados com um tique, enquanto itens que tenham " +"novas versões disponíveis tem um ícone de atualização" -#: newstuff/dialog.cpp:137 +#: newstuff/dialog.cpp:136 msgid "The name and license of the selected item" msgstr "O nome e a licença do item selecionado" -#: newstuff/dialog.cpp:140 +#: newstuff/dialog.cpp:139 msgid "The author of the selected item" msgstr "O autor do item selecionado" -#: newstuff/dialog.cpp:142 newstuff/dialog.cpp:396 +#: newstuff/dialog.cpp:141 newstuff/dialog.cpp:395 msgid "Install" msgstr "Instalar" -#: newstuff/dialog.cpp:161 +#: newstuff/dialog.cpp:160 msgid "Download and install the selected template." msgstr "Baixa e instala o modelo selecionado." -#: newstuff/dialog.cpp:164 +#: newstuff/dialog.cpp:163 msgid "" "Download and install the selected script. Some scripts may need to be " "configured after being installed." @@ -1796,83 +1687,35 @@ msgstr "" "Baixa e instala o script selecionado. Alguns scripts podem precisar ser " "configurados após a instalação." -#: newstuff/dialog.cpp:194 +#: newstuff/dialog.cpp:193 msgid "A description of the selected item is shown here." msgstr "Uma descrição do item selecionado é mostrada aqui." -#: newstuff/dialog.cpp:224 +#: newstuff/dialog.cpp:223 msgid "Downloading information..." msgstr "Baixando informações..." -#: controller.cpp:135 fetchdialog.cpp:226 fetchdialog.cpp:333 -#: fetchdialog.cpp:451 fetchdialog.cpp:506 newstuff/dialog.cpp:297 -#: newstuff/dialog.cpp:324 newstuff/dialog.cpp:434 statusbar.cpp:83 +#: controller.cpp:134 fetchdialog.cpp:215 fetchdialog.cpp:294 +#: fetchdialog.cpp:411 fetchdialog.cpp:466 newstuff/dialog.cpp:296 +#: newstuff/dialog.cpp:323 newstuff/dialog.cpp:433 statusbar.cpp:83 msgid "Ready." msgstr "Pronto." -#: newstuff/dialog.cpp:396 +#: newstuff/dialog.cpp:395 msgid "" "_: Update Stuff\n" "Update" msgstr "Atualização" -#: newstuff/dialog.cpp:413 +#: newstuff/dialog.cpp:412 msgid "Installing item..." msgstr "Instalando item..." -#: translators/bibteximporter.cpp:79 -#, fuzzy -msgid "No valid bibtex entries were found" -msgstr "Nenhum registro válido do BibTeX encontrado no arquivo - %1" - -#: translators/bibteximporter.cpp:96 +#: translators/bibteximporter.cpp:58 #, c-format msgid "No valid bibtex entries were found in file - %1" msgstr "Nenhum registro válido do BibTeX encontrado no arquivo - %1" -#: translators/bibtexexporter.cpp:200 translators/bibteximporter.cpp:286 -msgid "Bibtex Options" -msgstr "Opções do BibTeX" - -#: translators/bibteximporter.cpp:287 -#, fuzzy -msgid "Use Unicode (UTF-8) encoding" -msgstr "Codificar em Unicode (UTF-8)" - -#: translators/bibteximporter.cpp:288 -#, fuzzy -msgid "Read the imported file in Unicode (UTF-8)." -msgstr "Codificar o arquivo exportado em Unicode (UTF-8)." - -#: translators/bibteximporter.cpp:289 -#, fuzzy -msgid "Use user locale (%1) encoding" -msgstr "Codificar na localização do usuário (%1)" - -#: translators/bibteximporter.cpp:293 -#, fuzzy -msgid "Read the imported file in the local encoding." -msgstr "Codifica o arquivo exportado no formato local." - -#: translators/tellicozipexporter.cpp:35 -msgid "Tellico Zip File" -msgstr "Arquivo Zip Tellico" - -#: importdialog.cpp:245 mainwindow.cpp:1101 mainwindow.cpp:1267 -#: translators/tellicozipexporter.cpp:39 -msgid "*.tc *.bc|Tellico Files (*.tc)" -msgstr "*.tc *.bc|Arquivos Tellico (*.tc)" - -#: configdialog.cpp:1017 importdialog.cpp:297 mainwindow.cpp:1105 -#: mainwindow.cpp:1269 reportdialog.cpp:195 translators/bibtexexporter.cpp:52 -#: translators/bibtexmlexporter.cpp:40 translators/csvexporter.cpp:44 -#: translators/gcfilmsexporter.cpp:41 translators/htmlexporter.cpp:89 -#: translators/onixexporter.cpp:67 translators/pilotdbexporter.cpp:47 -#: translators/tellicoxmlexporter.cpp:60 translators/tellicozipexporter.cpp:39 -#: translators/xsltexporter.cpp:41 translators/xsltimporter.cpp:105 -msgid "*|All Files" -msgstr "*|Todos os Arquivos" - #: translators/alexandriaexporter.cpp:43 msgid "Alexandria" msgstr "Alexandria" @@ -1885,21 +1728,21 @@ msgstr "" "Uma biblioteca do Alexandria chamada %1 já existe. Quaisquer " "livros existentes nesta biblioteca podem ser sobrescritos." -#: filehandler.cpp:141 translators/tellicoimporter.cpp:113 -#: translators/xmlimporter.cpp:43 translators/xmlimporter.cpp:60 +#: filehandler.cpp:138 translators/tellicoimporter.cpp:108 +#: translators/xmlimporter.cpp:42 translators/xmlimporter.cpp:56 msgid "There is an XML parsing error in line %1, column %2." msgstr "Há um erro de análise XML na linha %1, coluna %2." -#: filehandler.cpp:143 translators/tellicoimporter.cpp:115 -#: translators/xmlimporter.cpp:45 translators/xmlimporter.cpp:62 +#: filehandler.cpp:140 translators/tellicoimporter.cpp:110 +#: translators/xmlimporter.cpp:44 translators/xmlimporter.cpp:58 msgid "The error message from Qt is:" msgstr "A mensagem de erro do Qt é:" -#: translators/tellicoimporter.cpp:152 +#: translators/tellicoimporter.cpp:147 msgid "It is from a future version of Tellico." msgstr "Isto é para uma futura versão do Tellico." -#: translators/tellicoimporter.cpp:162 +#: translators/tellicoimporter.cpp:156 msgid "" "Tellico is converting the file to a more recent document format. Information " "loss may occur if an older version of Tellico is used to read this file in " @@ -1909,32 +1752,32 @@ msgstr "" "perda de informações se este arquivo for lido no futuro por uma versão " "antiga do Tellico." -#: translators/bibtexhandler.cpp:245 translators/risimporter.cpp:286 -#: translators/risimporter.cpp:290 translators/tellicoimporter.cpp:367 +#: translators/bibtexhandler.cpp:245 translators/risimporter.cpp:263 +#: translators/risimporter.cpp:267 translators/tellicoimporter.cpp:333 msgid "Unknown" msgstr "Desconhecido" -#: translators/tellicoimporter.cpp:777 +#: translators/tellicoimporter.cpp:723 msgid "The file is empty." msgstr "O arquivo está vazio." -#: translators/tellicoimporter.cpp:795 +#: translators/tellicoimporter.cpp:741 msgid "The file contains no collection data." msgstr "O arquivo não contém dados de coleção." -#: translators/tellicoimporter.cpp:940 +#: translators/tellicoimporter.cpp:885 msgid "Unread Books" msgstr "Livros Não Lidos" -#: translators/tellicoimporter.cpp:950 +#: translators/tellicoimporter.cpp:895 msgid "Old Movies" msgstr "Filmes Antigos" -#: translators/tellicoimporter.cpp:968 +#: translators/tellicoimporter.cpp:913 msgid "80's Music" msgstr "Música dos anos 80" -#: translators/tellicoimporter.cpp:980 +#: translators/tellicoimporter.cpp:925 msgid "Favorites" msgstr "Favoritos" @@ -1942,63 +1785,53 @@ msgstr "Favoritos" msgid "Scanning audio files..." msgstr "Procurando arquivos de áudio..." -#: translators/audiofileimporter.cpp:129 -#, fuzzy -msgid "Bitrate" -msgstr "BibTeX" - -#: translators/audiofileimporter.cpp:160 translators/audiofileimporter.cpp:170 -msgid "Tracks (Disc %1)" -msgstr "" - -#: translators/audiofileimporter.cpp:189 xslt.cpp:4 +#: translators/audiofileimporter.cpp:169 xslt.cpp:4 msgid "(Various)" msgstr "(Vários)" -#: translators/audiofileimporter.cpp:340 +#: translators/audiofileimporter.cpp:317 msgid "Audio File Options" msgstr "Opções de Arquivo de Áudio" -#: translators/audiofileimporter.cpp:342 +#: translators/audiofileimporter.cpp:319 msgid "Recursive &folder search" msgstr "Pesquisa recursiva de &pastas" -#: translators/audiofileimporter.cpp:343 +#: translators/audiofileimporter.cpp:320 msgid "If checked, folders are recursively searched for audio files." msgstr "" -"Se selecionado, as pastas são varridas recursivamente para procurar " -"arquivos de áudio." +"Se selecionado, as pastas são varridas recursivamente para procurar arquivos " +"de áudio." -#: translators/audiofileimporter.cpp:347 -msgid "Include file &location" +#: translators/audiofileimporter.cpp:324 +msgid "&Include file location" msgstr "&Incluir localização do arquivo" -#: translators/audiofileimporter.cpp:348 +#: translators/audiofileimporter.cpp:325 msgid "If checked, the file names for each track are added to the entries." msgstr "" "Se selecionado, os nomes dos arquivos de cada faixa serão adicionados aos " "registros." -#: translators/audiofileimporter.cpp:352 -msgid "Include &bitrate" -msgstr "" - -#: translators/audiofileimporter.cpp:353 -#, fuzzy -msgid "If checked, the bitrate for each track is added to the entries." -msgstr "" -"Se selecionado, os nomes dos arquivos de cada faixa serão adicionados aos " -"registros." - #: translators/csvexporter.cpp:40 msgid "CSV" msgstr "CSV" -#: importdialog.cpp:254 translators/csvexporter.cpp:44 +#: importdialog.cpp:213 translators/csvexporter.cpp:44 msgid "*.csv|CSV Files (*.csv)" msgstr "*.csv|Arquivos CSV (*.csv)" -#: translators/csvexporter.cpp:109 translators/csvimporter.cpp:221 +#: configdialog.cpp:992 importdialog.cpp:245 mainwindow.cpp:1060 +#: mainwindow.cpp:1217 reportdialog.cpp:195 translators/bibtexexporter.cpp:52 +#: translators/bibtexmlexporter.cpp:40 translators/csvexporter.cpp:44 +#: translators/gcfilmsexporter.cpp:41 translators/htmlexporter.cpp:88 +#: translators/onixexporter.cpp:67 translators/pilotdbexporter.cpp:47 +#: translators/tellicoxmlexporter.cpp:60 translators/tellicozipexporter.cpp:39 +#: translators/xsltexporter.cpp:41 translators/xsltimporter.cpp:86 +msgid "*|All Files" +msgstr "*|Todos os Arquivos" + +#: translators/csvexporter.cpp:109 translators/csvimporter.cpp:166 msgid "CSV Options" msgstr "Opções CSV" @@ -2008,27 +1841,25 @@ msgstr "Incluir os nomes dos campos como cabeçalho das colunas" #: translators/csvexporter.cpp:114 msgid "If checked, a header row will be added with the field titles." -msgstr "" -"Se selecionada, uma linha de cabeçalho será adicionada com o nome dos " -"campos." +msgstr "Se selecionada, uma linha de cabeçalho será adicionada com o nome dos campos." -#: translators/csvexporter.cpp:117 translators/csvimporter.cpp:240 +#: translators/csvexporter.cpp:117 translators/csvimporter.cpp:185 msgid "Delimiter" msgstr "Separador" -#: translators/csvexporter.cpp:120 translators/csvimporter.cpp:243 +#: translators/csvexporter.cpp:120 translators/csvimporter.cpp:188 msgid "" "In addition to a comma, other characters may be used as a delimiter, " "separating each value in the file." msgstr "" -"Além da vírgula, outros caracteres podem ser utilizados para delimitar " -"cada valor no arquivo." +"Além da vírgula, outros caracteres podem ser utilizados para delimitar cada " +"valor no arquivo." #: translators/csvexporter.cpp:124 msgid "Comma" msgstr "Vírgula" -#: translators/csvexporter.cpp:126 translators/csvimporter.cpp:250 +#: translators/csvexporter.cpp:126 translators/csvimporter.cpp:195 msgid "Use a comma as the delimiter." msgstr "Utilizar a vírgula como separador." @@ -2036,7 +1867,7 @@ msgstr "Utilizar a vírgula como separador." msgid "Semicolon" msgstr "Ponto e vírgula" -#: translators/csvexporter.cpp:131 translators/csvimporter.cpp:255 +#: translators/csvexporter.cpp:131 translators/csvimporter.cpp:200 msgid "Use a semi-colon as the delimiter." msgstr "Utilizar o ponto e vírgula como separador." @@ -2044,7 +1875,7 @@ msgstr "Utilizar o ponto e vírgula como separador." msgid "Tab" msgstr "Aba" -#: translators/csvexporter.cpp:136 translators/csvimporter.cpp:260 +#: translators/csvexporter.cpp:136 translators/csvimporter.cpp:205 msgid "Use a tab as the delimiter." msgstr "Utilizar a tabulação como separador." @@ -2052,45 +1883,45 @@ msgstr "Utilizar a tabulação como separador." msgid "Other" msgstr "Outro" -#: translators/csvexporter.cpp:141 translators/csvimporter.cpp:265 +#: translators/csvexporter.cpp:141 translators/csvimporter.cpp:210 msgid "Use a custom string as the delimiter." msgstr "Utilizar um outro caractere como separador." -#: translators/csvexporter.cpp:146 translators/csvimporter.cpp:272 +#: translators/csvexporter.cpp:146 translators/csvimporter.cpp:216 msgid "A custom string, such as a colon, may be used as a delimiter." msgstr "" "Um caractere qualquer, como os dois pontos, pode ser utilizado como " "separador." -#: translators/filelistingimporter.cpp:63 +#: translators/filelistingimporter.cpp:62 msgid "Scanning files..." msgstr "Varrendo arquivos..." -#: translators/filelistingimporter.cpp:191 +#: translators/filelistingimporter.cpp:196 msgid "File Listing Options" msgstr "Opções de Listagem de Arquivo" -#: translators/filelistingimporter.cpp:193 +#: translators/filelistingimporter.cpp:198 msgid "Recursive folder search" msgstr "Procura recursiva de pastas" -#: translators/filelistingimporter.cpp:194 +#: translators/filelistingimporter.cpp:199 msgid "If checked, folders are recursively searched for all files." msgstr "" -"Se selecionado, as pastas são varridas recursivamente para procurar todos " -"os arquivos." +"Se selecionado, as pastas são varridas recursivamente para procurar todos os " +"arquivos." -#: translators/filelistingimporter.cpp:198 +#: translators/filelistingimporter.cpp:203 msgid "Generate file previews" msgstr "Gerar pré-visualizações dos arquivos" -#: translators/filelistingimporter.cpp:199 +#: translators/filelistingimporter.cpp:204 msgid "" "If checked, previews of the file contents are generated, which can slow down " "the folder listing." msgstr "" -"Se selecionado, serão geradas pré-visualizações do conteúdo dos " -"arquivos, o que pode causar lentidão na listagem das pastas." +"Se selecionado, serão geradas pré-visualizações do conteúdo dos arquivos, o " +"que pode causar lentidão na listagem das pastas." #: translators/onixexporter.cpp:63 msgid "ONIX Archive" @@ -2118,8 +1949,7 @@ msgstr "" #: translators/freedbimporter.cpp:84 translators/freedbimporter.cpp:170 msgid "Tellico was unable to access the CD-ROM device - %1." -msgstr "" -"Tellico não pôde acessar o dispositivo de CD-ROM - %1." +msgstr "Tellico não pôde acessar o dispositivo de CD-ROM - %1." #: translators/freedbimporter.cpp:196 msgid "Select CDDB Entry" @@ -2135,30 +1965,29 @@ msgstr "Nenhum registro correspondente ao CD foi encontrado." #: translators/freedbimporter.cpp:238 msgid "Tellico was unable to complete the CD lookup." -msgstr "" -"Tellico não pôde completar a pesquisa das informações do CD." +msgstr "Tellico não pôde completar a pesquisa das informações do CD." -#: translators/freedbimporter.cpp:470 +#: translators/freedbimporter.cpp:469 msgid "Various" msgstr "Vários" -#: translators/freedbimporter.cpp:489 +#: translators/freedbimporter.cpp:488 msgid "Audio CD Options" msgstr "Opções de CD de Áudio" -#: translators/freedbimporter.cpp:493 +#: translators/freedbimporter.cpp:492 msgid "Read data from CD-ROM device" msgstr "Ler dados do dispositivo de CD-ROM" -#: translators/freedbimporter.cpp:496 +#: translators/freedbimporter.cpp:495 msgid "Select or input the CD-ROM device location." msgstr "Selecione ou informe a localização do dispositivo de CD-ROM." -#: translators/freedbimporter.cpp:502 +#: translators/freedbimporter.cpp:501 msgid "Read all CDDB cache files only" msgstr "Ler apenas os arquivos de cache do CDDB" -#: translators/freedbimporter.cpp:503 +#: translators/freedbimporter.cpp:502 msgid "" "Read data recursively from all the CDDB cache files contained in the default " "cache folders." @@ -2166,27 +1995,23 @@ msgstr "" "Ler recursivamente os dados de todos os arquivos de cache do CDDB contidos " "nas pastas de cache padrão." -#: translators/gcfilmsexporter.cpp:37 +#: importdialog.cpp:272 translators/gcfilmsexporter.cpp:37 msgid "GCfilms" msgstr "GCfilms " -#: importdialog.cpp:273 translators/gcfilmsexporter.cpp:41 +#: importdialog.cpp:230 translators/gcfilmsexporter.cpp:41 msgid "*.gcf|GCfilms Data Files (*.gcf)" msgstr "*.gcf|Arquivos de Dados GCfilms (*.gcf) " -#: importdialog.cpp:272 translators/gcfilmsexporter.cpp:43 -msgid "*.gcs|GCstar Data Files (*.gcs)" -msgstr "*.gcs|Arquivos de Dados GCstar (*.gcs) " - #: translators/xsltexporter.cpp:37 msgid "XSLT" msgstr "XSLT" -#: translators/xsltexporter.cpp:69 translators/xsltimporter.cpp:98 +#: translators/xsltexporter.cpp:69 translators/xsltimporter.cpp:79 msgid "XSLT Options" msgstr "Opções de XSLT" -#: translators/xsltexporter.cpp:74 translators/xsltimporter.cpp:101 +#: translators/xsltexporter.cpp:74 translators/xsltimporter.cpp:82 msgid "XSLT file:" msgstr "Arquivo XSLT:" @@ -2194,15 +2019,15 @@ msgstr "Arquivo XSLT:" msgid "Choose the XSLT file used to transform the Tellico XML data." msgstr "Escolher o arquivo XSLT para transformar os dados XML do Tellico." -#: translators/alexandriaimporter.cpp:194 +#: translators/alexandriaimporter.cpp:193 msgid "Alexandria Options" msgstr "Opções do Alexandria" -#: translators/alexandriaimporter.cpp:195 +#: translators/alexandriaimporter.cpp:194 msgid "&Library:" msgstr "&Biblioteca:" -#: translators/bibtexmlexporter.cpp:36 +#: importdialog.cpp:268 translators/bibtexmlexporter.cpp:36 msgid "Bibtexml" msgstr "BibTeXML " @@ -2214,20 +2039,20 @@ msgstr "*.xml|Arquivos BibTeXML (*.xml)" msgid "XML" msgstr "XML" -#: importdialog.cpp:246 importdialog.cpp:259 importdialog.cpp:264 -#: mainwindow.cpp:1103 translators/tellicoxmlexporter.cpp:60 +#: importdialog.cpp:205 importdialog.cpp:218 importdialog.cpp:222 +#: mainwindow.cpp:1058 translators/tellicoxmlexporter.cpp:60 msgid "*.xml|XML Files (*.xml)" msgstr "*.xml|Arquivos XML (*.xml)" -#: translators/tellicoxmlexporter.cpp:480 +#: translators/tellicoxmlexporter.cpp:464 msgid "Tellico XML Options" msgstr "Opções XML do Tellico" -#: translators/tellicoxmlexporter.cpp:483 +#: translators/tellicoxmlexporter.cpp:467 msgid "Include images in XML document" msgstr "Incluir as imagens no documento XML" -#: translators/tellicoxmlexporter.cpp:485 +#: translators/tellicoxmlexporter.cpp:469 msgid "" "If checked, the images in the document will be included in the XML stream as " "base64 encoded elements." @@ -2235,27 +2060,31 @@ msgstr "" "Se selecionado, as imagens do documento serão integradas aos dados em XML " "como elementos codificados em base64." -#: translators/importer.h:100 +#: translators/importer.h:90 msgid "Loading data..." msgstr "Carregando dados..." -#: translators/importer.h:100 +#: translators/importer.h:90 msgid "Loading %1..." msgstr "Carregando %1..." -#: translators/bibtexexporter.cpp:48 +#: importdialog.cpp:267 translators/bibtexexporter.cpp:48 msgid "Bibtex" msgstr "BibTeX" -#: importdialog.cpp:250 translators/bibtexexporter.cpp:52 +#: importdialog.cpp:209 translators/bibtexexporter.cpp:52 msgid "*.bib|Bibtex Files (*.bib)" msgstr "*.bib|Arquivos BibTeX (*.bib)" -#: translators/bibtexexporter.cpp:203 +#: translators/bibtexexporter.cpp:201 +msgid "Bibtex Options" +msgstr "Opções do BibTeX" + +#: translators/bibtexexporter.cpp:204 msgid "Expand string macros" msgstr "Expandir as macros de string" -#: translators/bibtexexporter.cpp:205 +#: translators/bibtexexporter.cpp:206 msgid "" "If checked, the string macros will be expanded and no @string{} entries will " "be written." @@ -2263,113 +2092,113 @@ msgstr "" "Se selecionado, as macros de string vão ser expandidas e nenhum registro " "@string{} será escrito." -#: translators/bibtexexporter.cpp:208 +#: translators/bibtexexporter.cpp:209 msgid "Use URL package" msgstr "Utilizar o pacote URL" -#: translators/bibtexexporter.cpp:210 +#: translators/bibtexexporter.cpp:211 msgid "If checked, any URL fields will be wrapped in a \\url declaration." -msgstr "" -"Se selecionado, qualquer campo URL será transformado em uma declaração " -"\\url." +msgstr "Se selecionado, qualquer campo URL será transformado em uma declaração \\url." -#: translators/bibtexexporter.cpp:213 +#: translators/bibtexexporter.cpp:214 msgid "Skip entries with empty citation keys" msgstr "Ignorar os registros com chaves de citação vazias" -#: translators/bibtexexporter.cpp:215 +#: translators/bibtexexporter.cpp:216 msgid "If checked, any entries without a bibtex citation key will be skipped." msgstr "" "Se selecionado, qualquer registro sem uma chave de citação do BibTeX será " "ignorado." -#: translators/bibtexexporter.cpp:219 +#: translators/bibtexexporter.cpp:220 msgid "Bibtex quotation style:" msgstr "Estilo das citações do BibTeX:" -#: translators/bibtexexporter.cpp:221 translators/bibtexexporter.cpp:228 -#: translators/bibtexexporter.cpp:259 +#: translators/bibtexexporter.cpp:222 translators/bibtexexporter.cpp:229 +#: translators/bibtexexporter.cpp:260 msgid "Braces" msgstr "Colchetes" -#: translators/bibtexexporter.cpp:222 translators/bibtexexporter.cpp:230 +#: translators/bibtexexporter.cpp:223 translators/bibtexexporter.cpp:231 msgid "Quotes" msgstr "Aspas" -#: translators/bibtexexporter.cpp:223 +#: translators/bibtexexporter.cpp:224 msgid "" "The quotation style used when exporting bibtex. All field values will " "be escaped with either braces or quotation marks." msgstr "" -"Estilo de citação utilizado para arquivos no formato BibTeX. Os " -"valores de todos os campos serão envolvidos por colchetes ou aspas." +"Estilo de citação utilizado para arquivos no formato BibTeX. Os valores " +"de todos os campos serão envolvidos por colchetes ou aspas." + +#: translators/tellicozipexporter.cpp:35 +msgid "Tellico Zip File" +msgstr "Arquivo Zip Tellico" -#: translators/csvimporter.cpp:229 +#: importdialog.cpp:204 mainwindow.cpp:1056 mainwindow.cpp:1215 +#: translators/tellicozipexporter.cpp:39 +msgid "*.tc *.bc|Tellico Files (*.tc)" +msgstr "*.tc *.bc|Arquivos Tellico (*.tc)" + +#: translators/csvimporter.cpp:174 msgid "Select the type of collection being imported." msgstr "Selecionar o tipo de coleção a importar." -#: translators/csvimporter.cpp:235 +#: translators/csvimporter.cpp:180 msgid "&First row contains field titles" msgstr "A &primeira linha contém os títulos dos campos" -#: translators/csvimporter.cpp:236 +#: translators/csvimporter.cpp:181 msgid "If checked, the first row is used as field titles." -msgstr "" -"Se selecionado, a primeira linha será utilizada para o nome dos campos." +msgstr "Se selecionado, a primeira linha será utilizada para o nome dos campos." -#: translators/csvimporter.cpp:248 +#: translators/csvimporter.cpp:193 msgid "&Comma" msgstr "&Vírgula" -#: translators/csvimporter.cpp:254 +#: translators/csvimporter.cpp:199 msgid "&Semicolon" msgstr "&Ponto e vírgula" -#: translators/csvimporter.cpp:259 +#: translators/csvimporter.cpp:204 msgid "Ta&b" msgstr "Ta&bulação" -#: translators/csvimporter.cpp:264 +#: translators/csvimporter.cpp:209 msgid "Ot&her:" -msgstr "Out&ro" +msgstr "Out&ro:" -#: translators/csvimporter.cpp:289 +#: translators/csvimporter.cpp:233 msgid "The table shows up to the first five lines of the CSV file." msgstr "A tabela mostra as cinco primeiras linhas do arquivo CSV." -#: translators/csvimporter.cpp:296 +#: translators/csvimporter.cpp:240 msgid "" "Set each column to correspond to a field in the collection by choosing a " -"column, selecting the field, then clicking the Assign Field " -"button." +"column, selecting the field, then clicking the Assign Field button." msgstr "" " Marque cada coluna para corresponder a um campo na coleção escolhendo " -"uma coluna, selecionando o campo e clicando no botão Associar Campo " +"uma coluna, selecionando o campo e clicando no botão Associar Campo ." -#: translators/csvimporter.cpp:298 +#: translators/csvimporter.cpp:242 msgid "Co&lumn:" msgstr "Co&luna:" -#: translators/csvimporter.cpp:307 +#: translators/csvimporter.cpp:251 msgid "&Data field in this column:" msgstr "Campo de &dados nesta coluna:" -#: translators/csvimporter.cpp:315 +#: translators/csvimporter.cpp:259 msgid "&Assign Field" msgstr "&Associar Campo" -#: translators/csvimporter.cpp:347 -msgid "" -"At least one column must be assigned to a field. Only assigned columns will " -"be imported." -msgstr "" - -#: collectionfieldsdialog.cpp:409 collectionfieldsdialog.cpp:412 -#: translators/csvimporter.cpp:396 translators/csvimporter.cpp:510 +#: collectionfieldsdialog.cpp:405 collectionfieldsdialog.cpp:408 +#: translators/csvimporter.cpp:410 translators/csvimporter.cpp:513 msgid "New Field" msgstr "Novo campo" -#: translators/risimporter.cpp:288 +#: translators/risimporter.cpp:265 msgid "PDF" msgstr "PDF" @@ -2378,10 +2207,10 @@ msgid "PilotDB" msgstr "PilotDB" #: translators/pilotdbexporter.cpp:47 -msgid "*.pdb|Pilot Database Files (*.pdb)" -msgstr "*.pdb|Arquivos Pilot Database (*.pdb)" +msgid "*.pdb|Pilot Database Files(*.pdb)" +msgstr "*.pdb|Arquivos de Banco de Dados (*.pdb)" -#: detailedlistview.cpp:67 detailedlistview.cpp:297 +#: detailedlistview.cpp:67 detailedlistview.cpp:299 #: translators/pilotdbexporter.cpp:143 msgid "View Columns" msgstr "Ver Colunas" @@ -2394,83 +2223,66 @@ msgstr "Opções do PilotDB" msgid "Set PDA backup flag for database" msgstr "Marcar a opção PDA backup para a base de dados" -#: translators/gcfilmsimporter.cpp:110 translators/gcfilmsimporter.cpp:255 -msgid "The file is not a valid GCstar data file." -msgstr "O arquivo não é um arquivo de dados GCstar válido" - -#: mainwindow.cpp:1738 translators/gcfilmsimporter.cpp:248 -#: translators/xsltimporter.cpp:76 -msgid "Tellico encountered an error in XSLT processing." -msgstr "Tellico encontrou um erro no processamento do XSLT." +#: translators/gcfilmsimporter.cpp:85 +msgid "The file is not a valid GCfilms data file." +msgstr "O arquivo não é um arquivo de dados GCfilms válido." -#: translators/xsltimporter.cpp:64 translators/xsltimporter.cpp:70 +#: translators/xsltimporter.cpp:45 translators/xsltimporter.cpp:51 msgid "A valid XSLT file is needed to import the file." msgstr "Um arquivo XSLT válido é necessário para importar o arquivo." -#: configdialog.cpp:1015 translators/xsltimporter.cpp:104 +#: mainwindow.cpp:1699 translators/xsltimporter.cpp:57 +msgid "Tellico encountered an error in XSLT processing." +msgstr "Tellico encontrou um erro no processamento do XSLT." + +#: configdialog.cpp:990 translators/xsltimporter.cpp:85 msgid "*.xsl|XSL Files (*.xsl)" msgstr "*.xsl|Arquivos XSL (*.xsl)" -#: translators/htmlexporter.cpp:85 +#: translators/htmlexporter.cpp:84 msgid "HTML" msgstr "HTML" -#: reportdialog.cpp:195 translators/htmlexporter.cpp:89 +#: reportdialog.cpp:195 translators/htmlexporter.cpp:88 msgid "*.html|HTML Files (*.html)" msgstr "*.html|Arquivos HTML (*.html)" -#: groupview.cpp:479 mainwindow.cpp:1591 mainwindow.cpp:1631 -#: translators/htmlexporter.cpp:316 +#: groupview.cpp:479 mainwindow.cpp:1552 mainwindow.cpp:1592 +#: translators/htmlexporter.cpp:315 msgid "People" msgstr "Pessoas" -#: translators/htmlexporter.cpp:320 +#: translators/htmlexporter.cpp:319 msgid "(grouped by %1)" msgstr "(Agrupados por %1)" -#: translators/htmlexporter.cpp:465 +#: translators/htmlexporter.cpp:464 msgid "HTML Options" msgstr "Opções HTML" -#: translators/htmlexporter.cpp:468 +#: translators/htmlexporter.cpp:467 msgid "Print field headers" msgstr "Imprimir os cabeçalhos dos campos" -#: configdialog.cpp:307 translators/htmlexporter.cpp:469 +#: configdialog.cpp:298 translators/htmlexporter.cpp:468 msgid "If checked, the field names will be printed as table headers." -msgstr "" -"Se selecionado, o nome dos campos será impresso como títulos de uma tabela." +msgstr "Se selecionado, o nome dos campos será impresso como títulos de uma tabela." -#: translators/htmlexporter.cpp:473 +#: translators/htmlexporter.cpp:472 msgid "Group the entries" msgstr "Agrupar os registros" -#: configdialog.cpp:314 translators/htmlexporter.cpp:474 +#: configdialog.cpp:305 translators/htmlexporter.cpp:473 msgid "If checked, the entries will be grouped by the selected field." -msgstr "" -"Se selecionado, os registros serão agrupados em função do campo " -"selecionado." +msgstr "Se selecionado, os registros serão agrupados em função do campo selecionado." -#: translators/htmlexporter.cpp:478 +#: translators/htmlexporter.cpp:477 msgid "Export individual entry files" msgstr "Exporta arquivos de registros isolados" -#: translators/htmlexporter.cpp:479 +#: translators/htmlexporter.cpp:478 msgid "If checked, individual files will be created for each entry." -msgstr "" -"Se selecionado, serão criados arquivos individuais para cada registro." - -#: translators/pdfimporter.cpp:92 translators/pdfimporter.cpp:100 -#, fuzzy -msgid "Tellico was unable to read any metadata from the PDF file." -msgstr "Tellico não pôde carregar o arquivo - %1." - -#: translators/pdfimporter.cpp:231 -msgid "" -"Tellico is able to download information about entries with a DOI from " -"CrossRef.org. However, you must create an CrossRef account and add a new " -"data source with your account information." -msgstr "" +msgstr "Se selecionado, serão criados arquivos individuais para cada registro." #: fetcherconfigdialog.cpp:39 fetcherconfigdialog.cpp:49 msgid "Data Source Properties" @@ -2481,8 +2293,7 @@ msgid "&Source name: " msgstr "Nome da &fonte: " #: fetcherconfigdialog.cpp:79 -msgid "" -"The name identifies the data source and should be unique and informative." +msgid "The name identifies the data source and should be unique and informative." msgstr "O nome identifica a fonte de dados, devendo ser único e informativo." #: fetcherconfigdialog.cpp:90 fetcherconfigdialog.cpp:94 @@ -2502,8 +2313,8 @@ msgstr "" #: fetcherconfigdialog.cpp:114 msgid "If checked, updating entries will overwrite any existing information." msgstr "" -"Se selecionado, a atualização dos registros sobrescreverá toda " -"informação existente." +"Se selecionado, a atualização dos registros sobrescreverá toda informação " +"existente." #: filterdialog.cpp:60 msgid "Any Field" @@ -2561,62 +2372,62 @@ msgstr "Nome do filtro:" msgid "&Save Filter" msgstr "&Salvar Filtro " -#: field.cpp:490 +#: field.cpp:482 msgid "Simple Text" msgstr "Texto Simples " -#: field.cpp:491 +#: field.cpp:483 msgid "Paragraph" msgstr "Parágrafo " -#: field.cpp:492 +#: field.cpp:484 msgid "Choice" msgstr "Escolha " -#: field.cpp:493 +#: field.cpp:485 msgid "Checkbox" msgstr "Marcador " -#: field.cpp:496 +#: field.cpp:488 msgid "Table" msgstr "Tabela" -#: field.cpp:498 +#: field.cpp:490 msgid "Dependent" msgstr "Dependente " -#: field.cpp:500 +#: field.cpp:492 msgid "Date" msgstr "Data " -#: entryupdater.cpp:81 +#: entryupdater.cpp:83 msgid "Updating %1..." msgstr "Carregando %1..." -#: entryupdater.cpp:83 +#: entryupdater.cpp:85 msgid "Updating entries..." msgstr "Atualizando registros..." -#: entryupdater.cpp:85 +#: entryupdater.cpp:87 msgid "Update Entries" msgstr "Atualizar Registros" -#: entryupdater.cpp:99 +#: entryupdater.cpp:101 msgid "Updating %1..." msgstr "Atualizando %1..." -#: entryupdater.cpp:209 +#: entryupdater.cpp:211 msgid "Select Match" msgstr "Selecionar Correspondência" -#: entryupdater.cpp:217 +#: entryupdater.cpp:219 msgid "" "%1 returned multiple results which could match %2, the " "entry currently in the collection. Please select the correct match." msgstr "" -"%1 foram retornados múltiplos resultados que correspondem a " -"%2, que é o registro corrente na coleção. Por favor selecione o " -"resultado desejado." +"%1 foram retornados múltiplos resultados que correspondem a %" +"2, que é o registro corrente na coleção. Por favor selecione o resultado " +"desejado." #: groupview.cpp:252 msgid "Expand All Groups" @@ -2640,35 +2451,35 @@ msgid "" "Group" msgstr "Grupo" -#: importdialog.cpp:54 importdialog.cpp:60 +#: importdialog.cpp:50 importdialog.cpp:56 msgid "Import Options" msgstr "Opções de Importação" -#: importdialog.cpp:62 +#: importdialog.cpp:58 msgid "&Replace current collection" msgstr "&Substituir a coleção atual" -#: importdialog.cpp:63 +#: importdialog.cpp:59 msgid "Replace the current collection with the contents of the imported file." msgstr "Substitui a coleção atual pelo conteúdo do arquivo importado." -#: importdialog.cpp:65 +#: importdialog.cpp:61 msgid "A&ppend to current collection" msgstr "A&dicionar à coleção" -#: importdialog.cpp:66 +#: importdialog.cpp:62 msgid "" "Append the contents of the imported file to the current collection. This is " "only possible when the collection types match." msgstr "" -"Adiciona os dados do arquivo importado à coleção atual. Isso só é " -"possível se as coleções forem do mesmo tipo." +"Adiciona os dados do arquivo importado à coleção atual. Isso só é possível " +"se as coleções forem do mesmo tipo." -#: importdialog.cpp:69 +#: importdialog.cpp:65 msgid "&Merge with current collection" msgstr "&Combinar com a coleção atual" -#: importdialog.cpp:70 +#: importdialog.cpp:66 msgid "" "Merge the contents of the imported file to the current collection. This is " "only possible when the collection types match. Entries must match exactly in " @@ -2678,28 +2489,25 @@ msgstr "" "possível se as coleções forem do mesmo tipo. Os registros devem ser " "exatamente do mesmo tipo para que possam ser combinados." -#: importdialog.cpp:95 mainwindow.cpp:318 rc.cpp:9 -#, no-c-format -msgid "&Import" -msgstr "&Importar " - -#: importdialog.cpp:268 +#: importdialog.cpp:226 msgid "*.ris|RIS Files (*.ris)" msgstr "*.ris|Arquivos RIS (*.ris)" -#: importdialog.cpp:277 +#: importdialog.cpp:234 msgid "*.amc|AMC Data Files (*.amc)" msgstr "*.amc|Arquivos de Dados AMC (*.amc) " -#: importdialog.cpp:281 -#, fuzzy -msgid "*.pdf|PDF Files (*.pdf)" -msgstr "*.pdb|Arquivos Pilot Database (*.pdb)" +#: importdialog.cpp:270 +msgid "MODS" +msgstr "MODS" -#: importdialog.cpp:285 -#, fuzzy -msgid "*.reflib|Referencer Files (*.reflib)" -msgstr "*.ris|Arquivos RIS (*.ris)" +#: importdialog.cpp:271 +msgid "RIS" +msgstr "RIS " + +#: importdialog.cpp:273 +msgid "AMC" +msgstr "AMC" #: tellico_strings.cpp:18 #, c-format @@ -2721,27 +2529,22 @@ msgid "" "Only collections with the same type of entries as the current one can be " "appended. No changes are being made to the current collection." msgstr "" -"Somente coleções com os mesmos tipos de registros do da coleção atual " -"podem ser adicionadas. Nenhuma mudança foi feita à coleção atual." +"Somente coleções com os mesmos tipos de registros do da coleção atual podem " +"ser adicionadas. Nenhuma mudança foi feita à coleção atual." #: tellico_strings.cpp:24 msgid "" "Only collections with the same type of entries as the current one can be " "merged. No changes are being made to the current collection." msgstr "" -"Somente coleções com os mesmos tipos de registro da coleção atual podem " -"ser combinadas. Nenhuma mudança será feita à coleção atual." +"Somente coleções com os mesmos tipos de registro da coleção atual podem ser " +"combinadas. Nenhuma mudança será feita à coleção atual." #: tellico_strings.cpp:27 #, c-format msgid "Tellico is unable to load an image from the file - %1." msgstr "Tellico não pôde carregar o arquivo - %1." -#: entryiconview.cpp:287 -#, fuzzy -msgid "&Sort By" -msgstr "&Porta:" - #: loandialog.cpp:40 msgid "Loan Dialog" msgstr "Diálogo de Empréstimo" @@ -2763,47 +2566,47 @@ msgid "" "Enter the name of the person borrowing the items from you. Clicking the " "button allows you to select from your address book." msgstr "" -"Entre com o nome da pessoa para quem você está emprestando esses itens. " -"Você pode selecioná-lo do seu livro de endereços clicando neste botão." +"Entre com o nome da pessoa para quem você está emprestando esses itens. Você " +"pode selecioná-lo do seu livro de endereços clicando neste botão." -#: loandialog.cpp:117 +#: loandialog.cpp:116 msgid "&Loan date:" msgstr "Data do &Empréstimo:" -#: loandialog.cpp:123 +#: loandialog.cpp:122 msgid "" "The check-out date is the date that you lent the items. By default, today's " "date is used." msgstr "" -"A data de saída é a data em que você emprestou os itens. Por padrão, a " -"data de hoje é usada." +"A data de saída é a data em que você emprestou os itens. Por padrão, a data " +"de hoje é usada." -#: loandialog.cpp:132 +#: loandialog.cpp:131 msgid "D&ue date:" msgstr "Data para &Devolução:" -#: loandialog.cpp:139 +#: loandialog.cpp:138 msgid "" "The due date is when the items are due to be returned. The due date is not " "required, unless you want to add the loan to your active calendar." msgstr "" -"A data para devolução é o dia previsto para que os itens sejam " -"devolvidos. Ela não é requerida, a menos que você queira adicionar o " -"empréstimo ao seu calendário ativo." +"A data para devolução é o dia previsto para que os itens sejam devolvidos. " +"Ela não é requerida, a menos que você queira adicionar o empréstimo ao seu " +"calendário ativo." -#: loandialog.cpp:144 +#: loandialog.cpp:143 msgid "&Note:" msgstr "&Observação:" -#: loandialog.cpp:150 +#: loandialog.cpp:149 msgid "You can add notes about the loan, as well." msgstr "Você também pode adicionar observações sobre o empréstimo." -#: loandialog.cpp:154 +#: loandialog.cpp:153 msgid "&Add a reminder to the active calendar" msgstr "&Adiciona um lembrete ao calendário ativo. " -#: loandialog.cpp:157 +#: loandialog.cpp:156 msgid "" "Checking this box will add a To-do item to your active " "calendar, which can be viewed using KOrganizer. The box is only active if " @@ -2813,631 +2616,566 @@ msgstr "" "calendário ativo, podendo ser acessado pelo KOrganizer. Este marcador será " "habilitado somente se você especificar uma data para devolução." -#: mainwindow.cpp:188 +#: mainwindow.cpp:195 msgid "Create a new collection" msgstr "Cria uma nova coleção " -#: mainwindow.cpp:192 +#: mainwindow.cpp:199 msgid "New &Book Collection" msgstr "Nova Coleção de &Livros " -#: mainwindow.cpp:194 +#: mainwindow.cpp:201 msgid "Create a new book collection" msgstr "Cria uma nova coleção de livros " -#: mainwindow.cpp:200 +#: mainwindow.cpp:207 msgid "New B&ibliography" msgstr "Nova &Bibliografia" -#: mainwindow.cpp:202 +#: mainwindow.cpp:209 msgid "Create a new bibtex bibliography" msgstr "Cria uma nova bibliografia do BibTeX" -#: mainwindow.cpp:208 +#: mainwindow.cpp:215 msgid "New &Comic Book Collection" msgstr "Nova Coleção de &Revistas em Quadrinhos" -#: mainwindow.cpp:210 +#: mainwindow.cpp:217 msgid "Create a new comic book collection" msgstr "Cria uma nova coleção de revistas em quadrinhos" -#: mainwindow.cpp:216 +#: mainwindow.cpp:223 msgid "New &Video Collection" msgstr "Nova Coleção de &Vídeos" -#: mainwindow.cpp:218 +#: mainwindow.cpp:225 msgid "Create a new video collection" msgstr "Cria uma nova coleção de vídeos " -#: mainwindow.cpp:224 +#: mainwindow.cpp:231 msgid "New &Music Collection" msgstr "Nova Coleção de &Músicas" -#: mainwindow.cpp:226 +#: mainwindow.cpp:233 msgid "Create a new music collection" msgstr "Cria uma nova coleção de músicas" -#: mainwindow.cpp:232 +#: mainwindow.cpp:239 msgid "New C&oin Collection" msgstr "Nova Coleção de M&oedas" -#: mainwindow.cpp:234 +#: mainwindow.cpp:241 msgid "Create a new coin collection" msgstr "Cria uma nova coleção de moedas" -#: mainwindow.cpp:240 +#: mainwindow.cpp:247 msgid "New &Stamp Collection" msgstr "Nova Coleção de &Selos " -#: mainwindow.cpp:242 +#: mainwindow.cpp:249 msgid "Create a new stamp collection" msgstr "Cria uma nova coleção de selos " -#: mainwindow.cpp:248 +#: mainwindow.cpp:255 msgid "New C&ard Collection" msgstr "Nova Coleção de &Cartões" -#: mainwindow.cpp:250 +#: mainwindow.cpp:257 msgid "Create a new trading card collection" msgstr "Cria uma nova coleção de cartões" -#: mainwindow.cpp:256 +#: mainwindow.cpp:263 msgid "New &Wine Collection" msgstr "Nova Coleção de &Vinhos" -#: mainwindow.cpp:258 +#: mainwindow.cpp:265 msgid "Create a new wine collection" msgstr "Cria uma nova coleção de vinhos " -#: mainwindow.cpp:264 +#: mainwindow.cpp:271 msgid "New &Game Collection" msgstr "Nova Coleção de &Jogos" -#: mainwindow.cpp:266 +#: mainwindow.cpp:273 msgid "Create a new game collection" msgstr "Cria uma nova coleção de jogos " -#: mainwindow.cpp:272 -#, fuzzy -msgid "New Boa&rd Game Collection" -msgstr "Nova Coleção de &Jogos" - -#: mainwindow.cpp:274 -#, fuzzy -msgid "Create a new board game collection" -msgstr "Cria uma nova coleção de jogos " - -#: mainwindow.cpp:280 +#: mainwindow.cpp:279 msgid "New &File Catalog" msgstr "Novo Catálogo de &Arquivos" -#: mainwindow.cpp:282 +#: mainwindow.cpp:281 msgid "Create a new file catalog" msgstr "Cria um novo catálogo de arquivos " -#: mainwindow.cpp:288 +#: mainwindow.cpp:287 msgid "New C&ustom Collection" msgstr "Nova Coleção &Personalizada" -#: mainwindow.cpp:290 +#: mainwindow.cpp:289 msgid "Create a new custom collection" msgstr "Cria uma nova coleção personalizada " -#: mainwindow.cpp:299 +#: mainwindow.cpp:298 msgid "Open an existing document" msgstr "Abre um documento existente" -#: mainwindow.cpp:301 +#: mainwindow.cpp:300 msgid "Open a recently used file" msgstr "Abre um arquivo usado recentemente" -#: mainwindow.cpp:303 +#: mainwindow.cpp:302 msgid "Save the document" msgstr "Salva o documento" -#: mainwindow.cpp:305 +#: mainwindow.cpp:304 msgid "Save the document as a different file..." -msgstr "Salva o documento como um novo arquivo" +msgstr "Salva o documento como um novo arquivo..." -#: mainwindow.cpp:307 +#: mainwindow.cpp:306 msgid "Print the contents of the document..." -msgstr "Imprime os dados do documento" +msgstr "Imprime os dados do documento..." -#: mainwindow.cpp:309 +#: mainwindow.cpp:308 msgid "Quit the application" msgstr "Sai do aplicativo" -#: mainwindow.cpp:320 +#: mainwindow.cpp:317 rc.cpp:9 +#, no-c-format +msgid "&Import" +msgstr "&Importar " + +#: mainwindow.cpp:319 msgid "Import collection data from other formats" msgstr "Importa dados a partir de outros formatos" -#: mainwindow.cpp:324 +#: mainwindow.cpp:323 msgid "Import Tellico Data..." msgstr "Importar Dados do Tellico..." -#: mainwindow.cpp:325 +#: mainwindow.cpp:324 msgid "Import another Tellico data file" msgstr "Importa outro arquivo de dados do Tellico " -#: mainwindow.cpp:331 +#: mainwindow.cpp:330 msgid "Import CSV Data..." -msgstr "Importar Dados CSV... " +msgstr "Importar Dados CSV..." -#: mainwindow.cpp:332 +#: mainwindow.cpp:331 msgid "Import a CSV file" msgstr "Importa um arquivo de valores separados por vírgula" -#: mainwindow.cpp:338 +#: mainwindow.cpp:337 msgid "Import MODS Data..." msgstr "Importar Dados do MODS..." -#: mainwindow.cpp:339 +#: mainwindow.cpp:338 msgid "Import a MODS data file" msgstr "Importa um arquivo do MODS" -#: mainwindow.cpp:345 +#: mainwindow.cpp:344 msgid "Import Alexandria Data..." msgstr "Importar Dados do Alexandria..." -#: mainwindow.cpp:346 +#: mainwindow.cpp:345 msgid "Import data from the Alexandria book collection manager" msgstr "Importa um arquivo do gerenciador de coleção de livros Alexandria" -#: mainwindow.cpp:352 -#, fuzzy -msgid "Import Delicious Library Data..." -msgstr "Importar Dados do Tellico..." - -#: mainwindow.cpp:353 -#, fuzzy -msgid "Import data from Delicious Library" -msgstr "Importa meta-dados de arquivos de áudio" - -#: mainwindow.cpp:359 -#, fuzzy -msgid "Import Referencer Data..." -msgstr "Importar Dados do RIS..." - -#: mainwindow.cpp:360 -#, fuzzy -msgid "Import data from Referencer" -msgstr "Importa um arquivo de referência do RIS" - -#: mainwindow.cpp:366 +#: mainwindow.cpp:351 msgid "Import Bibtex Data..." msgstr "Importar Dados do BibTeX..." -#: mainwindow.cpp:367 +#: mainwindow.cpp:352 msgid "Import a bibtex bibliography file" msgstr "Importa um arquivo de bibliografia do BibTeX" -#: mainwindow.cpp:373 +#: mainwindow.cpp:358 msgid "Import Bibtexml Data..." msgstr "Importar Dados do BibTeXML..." -#: mainwindow.cpp:374 +#: mainwindow.cpp:359 msgid "Import a Bibtexml bibliography file" msgstr "Importa um arquivo de bibliografia do BibTeXML" -#: mainwindow.cpp:380 +#: mainwindow.cpp:365 msgid "Import RIS Data..." msgstr "Importar Dados do RIS..." -#: mainwindow.cpp:381 +#: mainwindow.cpp:366 msgid "Import an RIS reference file" msgstr "Importa um arquivo de referência do RIS" -#: mainwindow.cpp:387 -#, fuzzy -msgid "Import PDF File..." -msgstr "Importar Arquivo" - -#: mainwindow.cpp:388 -#, fuzzy -msgid "Import a PDF file" -msgstr "Importa um arquivo de valores separados por vírgula" - -#: mainwindow.cpp:394 +#: mainwindow.cpp:372 msgid "Import Audio File Metadata..." msgstr "Importar Meta-dados de um Arquivo de Áudio..." -#: mainwindow.cpp:395 +#: mainwindow.cpp:373 msgid "Import meta-data from audio files" msgstr "Importa meta-dados de arquivos de áudio" -#: mainwindow.cpp:404 +#: mainwindow.cpp:382 msgid "Import Audio CD Data..." msgstr "Importar Dados de CD de Áudio..." -#: mainwindow.cpp:405 +#: mainwindow.cpp:383 msgid "Import audio CD information" msgstr "Importa informações de um CD de áudio " -#: mainwindow.cpp:414 -msgid "Import GCstar Data..." -msgstr "Importar Dados do GCstar..." - -#: mainwindow.cpp:415 -msgid "Import a GCstar data file" -msgstr "Importa um arquivo de dados do GCstar" - -#: mainwindow.cpp:421 -#, fuzzy -msgid "Import Griffith Data..." -msgstr "Importar Dados do GCstar..." +#: mainwindow.cpp:392 +msgid "Import GCfilms Data..." +msgstr "Importar Dados do GCfilms..." -#: mainwindow.cpp:422 -#, fuzzy -msgid "Import a Griffith database" -msgstr "Exporta para um banco de dados PilotDB" +#: mainwindow.cpp:393 +msgid "Import a GCfilms data file" +msgstr "Importa um arquivo de dados do GCfilms" -#: mainwindow.cpp:428 +#: mainwindow.cpp:399 msgid "Import Ant Movie Catalog Data..." msgstr "Importar Dados do Ant Movie Catalog..." -#: mainwindow.cpp:429 +#: mainwindow.cpp:400 msgid "Import an Ant Movie Catalog data file" msgstr "Importa um arquivo de dados do Ant Movie Catalog" -#: mainwindow.cpp:435 +#: mainwindow.cpp:406 msgid "Import File Listing..." msgstr "Importar Listagem de Arquivos..." -#: mainwindow.cpp:436 +#: mainwindow.cpp:407 msgid "Import information about files in a folder" msgstr "Importa informações sobre os arquivos de uma pasta " -#: mainwindow.cpp:442 +#: mainwindow.cpp:413 msgid "Import XSL Transform..." msgstr "Importar Transformação XSL..." -#: mainwindow.cpp:443 +#: mainwindow.cpp:414 msgid "Import using an XSL Transform" msgstr "Importa dados utilizando uma transformação XSL " -#: mainwindow.cpp:455 rc.cpp:12 +#: mainwindow.cpp:426 rc.cpp:12 #, no-c-format msgid "&Export" msgstr "&Exportar " -#: mainwindow.cpp:457 +#: mainwindow.cpp:428 msgid "Export the collection data to other formats" msgstr "Exporta os dados da coleção para outros formatos " -#: mainwindow.cpp:461 +#: mainwindow.cpp:432 msgid "Export to XML..." -msgstr "Exportar para XML... " +msgstr "Exportar para XML..." -#: mainwindow.cpp:462 +#: mainwindow.cpp:433 msgid "Export to a Tellico XML file" msgstr "Exporta para um arquivo XML do Tellico " -#: mainwindow.cpp:468 +#: mainwindow.cpp:439 msgid "Export to Zip..." -msgstr "Exportar para Zip... " +msgstr "Exportar para Zip..." -#: mainwindow.cpp:469 +#: mainwindow.cpp:440 msgid "Export to a Tellico Zip file" msgstr "Exporta para um arquivo Zip do Tellico " -#: mainwindow.cpp:475 +#: mainwindow.cpp:446 msgid "Export to HTML..." -msgstr "Exportar para HTML... " +msgstr "Exportar para HTML..." -#: mainwindow.cpp:476 +#: mainwindow.cpp:447 msgid "Export to an HTML file" msgstr "Exporta para um arquivo HTML " -#: mainwindow.cpp:482 +#: mainwindow.cpp:453 msgid "Export to CSV..." -msgstr "Exportar para CSV... " +msgstr "Exportar para CSV..." -#: mainwindow.cpp:483 +#: mainwindow.cpp:454 msgid "Export to a comma-separated values file" msgstr "Exporta para um arquivo de valores separados por vírgula " -#: mainwindow.cpp:489 +#: mainwindow.cpp:460 msgid "Export to PilotDB..." -msgstr "Exportar para &PilotDB... " +msgstr "Exportar para PilotDB..." -#: mainwindow.cpp:490 +#: mainwindow.cpp:461 msgid "Export to a PilotDB database" msgstr "Exporta para um banco de dados PilotDB" -#: mainwindow.cpp:496 +#: mainwindow.cpp:467 msgid "Export to Alexandria..." -msgstr "Exportar para o Alexandria... " +msgstr "Exportar para o Alexandria..." -#: mainwindow.cpp:497 +#: mainwindow.cpp:468 msgid "Export to an Alexandria library" msgstr "Exporta para uma biblioteca do Alexandria " -#: mainwindow.cpp:503 +#: mainwindow.cpp:474 msgid "Export to Bibtex..." -msgstr "Exportar para o BibTeX... " +msgstr "Exportar para o BibTeX..." -#: mainwindow.cpp:504 +#: mainwindow.cpp:475 msgid "Export to a bibtex file" msgstr "Exporta para um arquivo do BibTeX " -#: mainwindow.cpp:510 +#: mainwindow.cpp:481 msgid "Export to Bibtexml..." msgstr "Exportar para o BibTeXML..." -#: mainwindow.cpp:511 +#: mainwindow.cpp:482 msgid "Export to a Bibtexml file" msgstr "Exporta para um arquivo BibTeXML" -#: mainwindow.cpp:517 +#: mainwindow.cpp:488 msgid "Export to ONIX..." -msgstr "Exportar para o ONIX... " +msgstr "Exportar para o ONIX..." -#: mainwindow.cpp:518 +#: mainwindow.cpp:489 msgid "Export to an ONIX file" msgstr "Exporta para um arquivo ONIX" -#: mainwindow.cpp:524 +#: mainwindow.cpp:495 msgid "Export to GCfilms..." -msgstr "Exportar para o GCfilms... " +msgstr "Exportar para o GCfilms..." -#: mainwindow.cpp:525 +#: mainwindow.cpp:496 msgid "Export to a GCfilms data file" msgstr "Exporta para um arquivo de dados do GCfilms" -#: mainwindow.cpp:531 -#, fuzzy -msgid "Export to GCstar..." -msgstr "Exportar para o GCfilms... " - -#: mainwindow.cpp:532 -#, fuzzy -msgid "Export to a GCstar data file" -msgstr "Exporta para um arquivo de dados do GCfilms" - -#: mainwindow.cpp:536 +#: mainwindow.cpp:502 msgid "Export XSL Transform..." msgstr "Exportar Transformação XSL..." -#: mainwindow.cpp:537 +#: mainwindow.cpp:503 msgid "Export using an XSL Transform" msgstr "Exporta utilizando uma transformação XSL" -#: mainwindow.cpp:546 +#: mainwindow.cpp:512 msgid "Cut the selected text and puts it in the clipboard" msgstr "Corta o texto selecionado e coloca-o na área de transferência" -#: mainwindow.cpp:548 +#: mainwindow.cpp:514 msgid "Copy the selected text to the clipboard" msgstr "Copia o texto selecionado para a área de transferência" -#: mainwindow.cpp:550 +#: mainwindow.cpp:516 msgid "Paste the clipboard contents" msgstr "Cola o conteúdo da área de transferência" -#: mainwindow.cpp:552 +#: mainwindow.cpp:518 msgid "Select all the entries in the collection" msgstr "Seleciona todos os registros da coleção" -#: mainwindow.cpp:554 +#: mainwindow.cpp:520 msgid "Deselect all the entries in the collection" msgstr "De-seleciona todos os registros da coleção" -#: mainwindow.cpp:556 +#: mainwindow.cpp:522 msgid "Internet Search..." msgstr "Pesquisa na Internet..." -#: mainwindow.cpp:559 +#: mainwindow.cpp:525 msgid "Search the internet..." -msgstr "Pesquisa registros em fontes da Internet" - -#: mainwindow.cpp:561 -msgid "Advanced &Filter..." -msgstr "&Filtro Avançado..." - -#: mainwindow.cpp:564 mainwindow.cpp:719 -msgid "Filter the collection" -msgstr "Filtrar a coleção " +msgstr "Pesquisa registros em fontes da Internet..." -#: mainwindow.cpp:569 +#: mainwindow.cpp:530 msgid "&New Entry..." msgstr "&Novo registro..." -#: mainwindow.cpp:572 +#: mainwindow.cpp:533 msgid "Create a new entry" msgstr "Cria um novo registro" -#: controller.cpp:620 mainwindow.cpp:573 +#: controller.cpp:606 mainwindow.cpp:534 msgid "&Edit Entry..." msgstr "&Editar Registro..." -#: mainwindow.cpp:576 +#: mainwindow.cpp:537 msgid "Edit the selected entries" msgstr "Edita os registros selecionados" -#: controller.cpp:621 mainwindow.cpp:577 +#: controller.cpp:607 mainwindow.cpp:538 msgid "D&uplicate Entry" msgstr "D&uplicar Registro" -#: mainwindow.cpp:580 +#: mainwindow.cpp:541 msgid "Copy the selected entries" msgstr "Copia os registros selecionados" -#: controller.cpp:623 mainwindow.cpp:581 +#: controller.cpp:609 mainwindow.cpp:542 msgid "&Delete Entry" msgstr "&Apagar Registro" -#: mainwindow.cpp:584 +#: mainwindow.cpp:545 msgid "Delete the selected entries" msgstr "Apaga os registros selecionados " -#: mainwindow.cpp:585 -#, fuzzy -msgid "&Merge Entries" -msgstr "&Apagar Registros" - -#: mainwindow.cpp:588 -#, fuzzy -msgid "Merge the selected entries" -msgstr "Apaga os registros selecionados " - -#: mainwindow.cpp:591 +#: mainwindow.cpp:547 msgid "&Generate Reports..." -msgstr "&Gerar Relatórios... " +msgstr "&Gerar Relatórios..." -#: mainwindow.cpp:594 +#: mainwindow.cpp:550 msgid "Generate collection reports" msgstr "Gera relatórios da coleção " -#: mainwindow.cpp:595 +#: mainwindow.cpp:551 msgid "Check-&out..." msgstr "&Registrar saída..." -#: mainwindow.cpp:598 +#: mainwindow.cpp:554 msgid "Check-out the selected items" msgstr "Registra saída dos itens selecionados " -#: mainwindow.cpp:599 +#: mainwindow.cpp:555 msgid "Check-&in" -msgstr "Registrar &entrada..." +msgstr "Registrar &entrada" -#: mainwindow.cpp:602 +#: mainwindow.cpp:558 msgid "Check-in the selected items" msgstr "Registra entrada dos itens selecionados" -#: mainwindow.cpp:604 +#: mainwindow.cpp:560 msgid "&Rename Collection..." msgstr "&Renomear Coleção..." -#: mainwindow.cpp:607 +#: mainwindow.cpp:563 msgid "Rename the collection" msgstr "Renomeia a coleção" -#: mainwindow.cpp:608 +#: mainwindow.cpp:564 msgid "Collection &Fields..." msgstr "&Campos da Coleção..." -#: mainwindow.cpp:611 +#: mainwindow.cpp:567 msgid "Modify the collection fields" msgstr "Modifica os campos da coleção" -#: mainwindow.cpp:612 +#: mainwindow.cpp:568 msgid "Convert to &Bibliography" msgstr "Converter para &Bibliografia" -#: mainwindow.cpp:615 +#: mainwindow.cpp:571 msgid "Convert a book collection to a bibliography" msgstr "Converter uma coleção de livros para uma bibliografia" -#: mainwindow.cpp:616 +#: mainwindow.cpp:572 msgid "String &Macros..." msgstr "&Macros de String..." -#: mainwindow.cpp:619 +#: mainwindow.cpp:575 msgid "Edit the bibtex string macros" msgstr "Editar linhas de macros do BibTeX " -#: mainwindow.cpp:626 +#: mainwindow.cpp:582 msgid "Copy Bibtex to Cli&pboard" msgstr "Copia BibTeX para a &Área de Transferência" -#: mainwindow.cpp:627 +#: mainwindow.cpp:583 msgid "Copy bibtex citations to the clipboard" msgstr "Copia citações do BibTeX para a área de transferência" -#: mainwindow.cpp:632 +#: mainwindow.cpp:588 msgid "Cite Entry in &LyX" msgstr "Citar Registro no &LyX" -#: mainwindow.cpp:633 +#: mainwindow.cpp:589 msgid "Cite the selected entries in LyX" msgstr "Citar os registros selecionados no LyX" -#: mainwindow.cpp:638 +#: mainwindow.cpp:594 msgid "Ci&te Entry in OpenOffice.org" msgstr "Ci&tar Registro no OpenOffice.org" -#: mainwindow.cpp:639 +#: mainwindow.cpp:595 msgid "Cite the selected entries in OpenOffice.org" msgstr "Citar os registros selecionados no OpenOffice.org" -#: controller.cpp:622 mainwindow.cpp:647 rc.cpp:18 +#: controller.cpp:608 mainwindow.cpp:603 rc.cpp:18 #, no-c-format msgid "&Update Entry" msgstr "&Atualizar o Registro" -#: mainwindow.cpp:652 +#: mainwindow.cpp:608 msgid "All Sources" msgstr "Todas as Fontes" -#: mainwindow.cpp:653 +#: mainwindow.cpp:609 msgid "Update entry data from all available sources" msgstr "Atualizar o registro a partir de todas as fontes disponíveis " -#: mainwindow.cpp:665 +#: mainwindow.cpp:621 msgid "Show Grou&p View" msgstr "Mostrar Visão de &Grupo" -#: mainwindow.cpp:668 +#: mainwindow.cpp:624 msgid "Enable/disable the group view" msgstr "Ativar/desativar a visão de grupo" -#: mainwindow.cpp:669 +#: mainwindow.cpp:625 msgid "Hide Grou&p View" msgstr "Ocultar Visão de Gru&po " -#: mainwindow.cpp:671 +#: mainwindow.cpp:627 msgid "Show Entry &Editor" msgstr "Mostrar &Editor de Registros" -#: mainwindow.cpp:674 +#: mainwindow.cpp:630 msgid "Enable/disable the editor" msgstr "Habilitar/desabilitar o editor" -#: mainwindow.cpp:675 +#: mainwindow.cpp:631 msgid "Hide Entry &Editor" msgstr "Ocultar &Editor de Registros" -#: mainwindow.cpp:677 +#: mainwindow.cpp:633 msgid "Show Entry &View" msgstr "Mostrar &Visão de Registros" -#: mainwindow.cpp:680 +#: mainwindow.cpp:636 msgid "Enable/disable the entry view" msgstr "Habilitar/desabilitar visão de registros" -#: mainwindow.cpp:681 +#: mainwindow.cpp:637 msgid "Hide Entry &View" msgstr "Ocultar &Visão de Registros" -#: mainwindow.cpp:693 +#: mainwindow.cpp:639 +msgid "Advanced &Filter..." +msgstr "&Filtro Avançado..." + +#: mainwindow.cpp:642 mainwindow.cpp:680 +msgid "Filter the collection" +msgstr "Filtrar a coleção " + +#: mainwindow.cpp:654 msgid "Change Grouping" msgstr "Alterar o Agrupamento" -#: mainwindow.cpp:697 +#: mainwindow.cpp:658 msgid "&Group Selection" msgstr "Seleção de &Grupo" -#: mainwindow.cpp:700 +#: mainwindow.cpp:661 msgid "Change the grouping of the collection" msgstr "Alterar o agrupamento da coleção" -#: filterview.cpp:33 filterview.cpp:85 mainwindow.cpp:702 mainwindow.cpp:717 +#: filterview.cpp:33 filterview.cpp:85 mainwindow.cpp:663 mainwindow.cpp:678 msgid "Filter" msgstr "Filtrar" -#: mainwindow.cpp:705 +#: mainwindow.cpp:666 msgid "Clear Filter" msgstr "Limpar Filtro" -#: mainwindow.cpp:710 +#: mainwindow.cpp:671 msgid "Filter here..." msgstr "Filtrar Aqui..." -#: mainwindow.cpp:768 +#: mainwindow.cpp:727 msgid "Groups" msgstr "Grupos" -#: mainwindow.cpp:769 +#: mainwindow.cpp:728 msgid "" "The Group View sorts the entries into groupings based on a " "selected field." @@ -3445,74 +3183,60 @@ msgstr "" "A Visão de Grupos classifica os registros em grupos com base em " "um campo selecionado." -#: mainwindow.cpp:776 +#: mainwindow.cpp:735 msgid "" -"The Column View shows the value of multiple fields for each " -"entry." +"The Column View shows the value of multiple fields for each entry." +"" msgstr "" "A Visão de Colunas mostra os valores de vários campos para cada " "registro" -#: mainwindow.cpp:831 -#, fuzzy -msgid "Welcome to the Tellico Collection Manager" -msgstr "Tellico - um gerenciador de coleções para o KDE" - -#: mainwindow.cpp:833 -msgid "" -"

Tellico is a tool for managing collections of books, videos, music, and " -"whatever else you want to catalog.

New entries can be added to your " -"collection by entering data manually or " -"by downloading data from various " -"Internet sources.

" -msgstr "" - -#: mainwindow.cpp:1066 +#: mainwindow.cpp:1021 msgid "Creating new document..." -msgstr "Criação de um novo documento... " +msgstr "Criação de um novo documento..." -#: mainwindow.cpp:1098 mainwindow.cpp:1117 mainwindow.cpp:1135 +#: mainwindow.cpp:1053 mainwindow.cpp:1073 mainwindow.cpp:1091 msgid "Opening file..." msgstr "Abrindo arquivo..." -#: mainwindow.cpp:1108 +#: mainwindow.cpp:1063 msgid "Open File" msgstr "Abrir Arquivo" -#: document.cpp:192 mainwindow.cpp:1215 +#: document.cpp:189 mainwindow.cpp:1165 msgid "Saving file..." msgstr "Salvando Arquivo..." -#: mainwindow.cpp:1226 +#: mainwindow.cpp:1175 msgid "" "

You are saving a file with many images, which causes Tellico to slow " "down significantly. Do you want to save the images separately in Tellico's " "data directory to improve performance?

Your choice can always be " "changed in the configuration dialog.

" msgstr "" -"

Você está salvando um arquivo com muitas imagens, levando o Tellico " -"a ficar significativamente lento. Você gostaria de salvar as imagens " -"separadamente no diretório de dados do Tellico para melhorar a " -"performance?

Sua escolha pode sempre ser alterada na caixa de diálogo " -"de configuração.

" +"

Você está salvando um arquivo com muitas imagens, levando o Tellico a " +"ficar significativamente lento. Você gostaria de salvar as imagens " +"separadamente no diretório de dados do Tellico para melhorar a performance?

Sua escolha pode sempre ser alterada na caixa de diálogo de " +"configuração.

" -#: mainwindow.cpp:1231 +#: mainwindow.cpp:1180 msgid "Save Images Separately" msgstr "Salvar Imagens Separadamente" -#: mainwindow.cpp:1232 +#: mainwindow.cpp:1181 msgid "Save Images in File" msgstr "Salvar Imagens no Arquivo" -#: mainwindow.cpp:1265 +#: mainwindow.cpp:1213 msgid "Saving file with a new filename..." msgstr "Salvando arquivo com um novo nome..." -#: mainwindow.cpp:1303 mainwindow.cpp:1353 +#: mainwindow.cpp:1253 mainwindow.cpp:1305 msgid "Printing..." msgstr "Impressão..." -#: mainwindow.cpp:1312 +#: mainwindow.cpp:1262 msgid "" "The collection is currently being filtered to show a limited subset of the " "entries. Only the visible entries will be printed. Continue?" @@ -3520,139 +3244,126 @@ msgstr "" "A coleção esta sendo filtrada para mostrar um subconjunto limitado de seus " "registros. Apenas os registros visíveis serão impressos. Continuar?" -#: mainwindow.cpp:1337 +#: mainwindow.cpp:1288 msgid "Processing document..." msgstr "Processamento do documento..." -#: mainwindow.cpp:1360 +#: mainwindow.cpp:1313 msgid "Exiting..." msgstr "Saindo..." -#: mainwindow.cpp:1498 +#: mainwindow.cpp:1453 #, c-format msgid "Total entries: %1" msgstr "Total de registros: %1" -#: mainwindow.cpp:1505 +#: mainwindow.cpp:1460 msgid "(%1 filtered; %2 selected)" -msgstr "" -"(%1 filtrado, %2 selecionado)\n" -"(%1 filtrados, %2 selecionados)" +msgstr "(%1 filtrados, %2 selecionados)" -#: mainwindow.cpp:1508 +#: mainwindow.cpp:1463 msgid "(%1 filtered)" -msgstr "" -"(%1 filtrado)\n" -"(%1 filtrados)" +msgstr "(%1 filtrados)" -#: mainwindow.cpp:1511 +#: mainwindow.cpp:1466 msgid "(%1 selected)" -msgstr "" -"(%1 selecionado)\n" -"(%1 selecionados)" +msgstr "(%1 selecionados)" -#: mainwindow.cpp:1679 +#: mainwindow.cpp:1640 #, c-format msgid "Print %1" msgstr "Impressão %1" -#: mainwindow.cpp:1712 +#: mainwindow.cpp:1673 #, c-format msgid "Page %1" msgstr "Página %1" -#: entryview.cpp:188 mainwindow.cpp:1739 +#: entryview.cpp:171 mainwindow.cpp:1700 msgid "Please check your installation." msgstr "Por favor, confira sua instalação." -#: mainwindow.cpp:1849 +#: mainwindow.cpp:1789 msgid "Importing data..." msgstr "Importação de dados..." -#: mainwindow.cpp:1858 +#: mainwindow.cpp:1798 msgid "Import File" msgstr "Importar Arquivo" -#: mainwindow.cpp:1864 +#: mainwindow.cpp:1804 msgid "Import Directory" msgstr "Importar Diretório" -#: mainwindow.cpp:1885 +#: mainwindow.cpp:1892 msgid "Exporting data..." msgstr "Exportação de dados..." -#: mainwindow.cpp:1907 +#: mainwindow.cpp:1914 msgid "Export As" msgstr "Exportar Como" -#: mainwindow.cpp:1935 +#: mainwindow.cpp:1943 msgid "String Macros" msgstr "Macros de String" -#: mainwindow.cpp:1936 +#: mainwindow.cpp:1944 msgid "Macro" msgstr "Macro" -#: mainwindow.cpp:1936 +#: mainwindow.cpp:1944 msgid "String" msgstr "String" -#: mainwindow.cpp:1999 +#: mainwindow.cpp:2007 msgid "Creating citations..." msgstr "Criando citações..." -#: mainwindow.cpp:2104 +#: mainwindow.cpp:2157 msgid "Filters" msgstr "Filtros" -#: mainwindow.cpp:2105 +#: mainwindow.cpp:2158 msgid "" -"The Filter View shows the entries which meet certain filter " -"rules." +"The Filter View shows the entries which meet certain filter rules." +"" msgstr "" "A Visão de Filtros mostra os registros que atendem determinadas " "regras de filtros." -#: mainwindow.cpp:2121 +#: mainwindow.cpp:2174 msgid "Loans" msgstr "Empréstimos" -#: mainwindow.cpp:2122 +#: mainwindow.cpp:2175 msgid "" "The Loan View shows a list of all the people who have borrowed " "items from your collection." msgstr "" -"A Visão de Empréstimos mostra uma lista com todas as pessoas " -"que pegaram itens emprestados de sua coleção." +"A Visão de Empréstimos mostra uma lista com todas as pessoas que " +"pegaram itens emprestados de sua coleção." -#: mainwindow.cpp:2255 +#: mainwindow.cpp:2308 #, c-format msgid "Update entry data from %1" msgstr "Atualiza os dados do registro %1" -#: mainwindow.cpp:2274 -msgid "" -"Tellico can only import one file of this type at a time. Only %1 will be " -"imported." -msgstr "" - -#: filehandler.cpp:193 +#: filehandler.cpp:190 #, c-format msgid "Tellico is unable to load the image - %1." msgstr "Tellico não pôde carregar a imagem - %1." -#: filehandler.cpp:207 -msgid "" -"A file named \"%1\" already exists. Are you sure you want to overwrite it?" +#: filehandler.cpp:204 +msgid "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Um arquivo chamado \"%1\" já existe. Tem certeza que deseja mesmo " "sobrescrevê-lo?" -#: filehandler.cpp:210 +#: filehandler.cpp:207 msgid "Overwrite File?" msgstr "Sobrescrever o Arquivo?" -#: filehandler.cpp:211 +#: filehandler.cpp:208 msgid "Overwrite" msgstr "Sobrescrever" @@ -3660,70 +3371,70 @@ msgstr "Sobrescrever" msgid "Filter (Sort by Count)" msgstr "Filtro (Classificar por Contagem)" -#: controller.cpp:427 +#: controller.cpp:423 msgid "Do you really want to delete this entry?" msgstr "Quer mesmo apagar este registro?" -#: controller.cpp:429 +#: controller.cpp:425 msgid "Delete Entry" -msgstr "Apagar a entrada?" +msgstr "Apagar Entrada" -#: controller.cpp:439 +#: controller.cpp:435 msgid "Do you really want to delete these entries?" msgstr "Quer mesmo apagar estes registros?" -#: controller.cpp:443 +#: controller.cpp:439 msgid "Delete Multiple Entries" msgstr "Apagar Múltiplos Registros" -#: controller.cpp:626 +#: controller.cpp:611 msgid "&Edit Entries..." msgstr "&Editar Registros..." -#: controller.cpp:627 +#: controller.cpp:612 msgid "D&uplicate Entries" msgstr "D&uplicar Registros" -#: controller.cpp:628 +#: controller.cpp:613 msgid "&Update Entries" msgstr "&Editar Registros" -#: controller.cpp:629 +#: controller.cpp:614 msgid "&Delete Entries" msgstr "&Apagar Registros" -#: controller.cpp:684 +#: controller.cpp:668 msgid "" "The following items are already loaned, but Tellico does not currently " "support lending an item multiple times. They will be removed from the list " "of items to lend." msgstr "" -"Os seguintes itens já estão emprestados. Como Tellico não suporta " -"emprestar itens múltiplas vezes, eles serão removidos da lista de itens a " -"serem emprestados." +"Os seguintes itens já estão emprestados. Como Tellico não suporta emprestar " +"itens múltiplas vezes, eles serão removidos da lista de itens a serem " +"emprestados." -#: calendarhandler.cpp:167 +#: calendarhandler.cpp:166 msgid "Default Calendar" msgstr "Calendário Padrão" -#: calendarhandler.cpp:175 +#: calendarhandler.cpp:174 msgid "" "At the moment, Tellico only supports local calendar resources. The active " "calendar is remotely located, so your loans will not be added." msgstr "" "Presentemente, Tellico suporta apenas recursos de calendário locais. O " -"calendário ativo está localizado remotamente, então seus empréstimos " -"não serão adicionados." +"calendário ativo está localizado remotamente, então seus empréstimos não " +"serão adicionados." -#: calendarhandler.cpp:180 +#: calendarhandler.cpp:179 msgid "Active Calendar" msgstr "Calendário Ativo" -#: calendarhandler.cpp:203 +#: calendarhandler.cpp:202 msgid "Tellico: %1 is due to return \"%2\"" msgstr "Tellico: %1 está previsto para ser devolvido para \"%2\"" -#: collection.cpp:32 +#: collection.cpp:31 msgid "(Empty)" msgstr "(Vazio)" @@ -3767,16 +3478,6 @@ msgstr "Autor da biblioteca btparse" msgid "Code examples and general inspiration" msgstr "Exemplos de código e inspiração em geral" -#: main.cpp:50 -#, fuzzy -msgid "Author of libcsv library" -msgstr "Autor da biblioteca btparse" - -#: main.cpp:52 -#, fuzzy -msgid "Author of rtf2html library" -msgstr "Autor da biblioteca btparse" - #: collectionfieldsdialog.cpp:56 msgid "Collection Fields" msgstr "Campos da Coleção" @@ -3843,7 +3544,7 @@ msgstr "O tipo do campo determina que valores podem ser utilizados. " #: collectionfieldsdialog.cpp:136 msgid "Simple Text is used for most fields. " -msgstr "Texto Simples é utilizado para a maioria dos campos." +msgstr "Texto Simples é utilizado para a maioria dos campos. " #: collectionfieldsdialog.cpp:137 msgid "Paragraph is for large text blocks. " @@ -3855,11 +3556,11 @@ msgstr "Escolha limita o campo a certos valores. " #: collectionfieldsdialog.cpp:139 msgid "Checkbox is for a simple yes/no value. " -msgstr "Marcador é usado para descrever valores do tipo sim/não." +msgstr "Marcador é usado para descrever valores do tipo sim/não. " #: collectionfieldsdialog.cpp:140 msgid "Number indicates that the field contains a numerical value. " -msgstr "Número indica que o campo contém um valor numérico." +msgstr "Número indica que o campo contém um valor numérico. " #: collectionfieldsdialog.cpp:141 msgid "" @@ -3867,25 +3568,23 @@ msgid "" "files. " msgstr "" "URL é para os campos que fazem referência a uma URL, contendo " -"referências a outros arquivos." +"referências a outros arquivos. " #: collectionfieldsdialog.cpp:142 msgid "A Table may hold one or more columns of values. " -msgstr "Uma Tabela pode conter uma ou duas colunas de valores." +msgstr "Uma Tabela pode conter uma ou duas colunas de valores. " #: collectionfieldsdialog.cpp:143 msgid "An Image field holds a picture. " -msgstr "Um campo Imagem serve para armazenar uma foto ou figura." +msgstr "Um campo Imagem serve para armazenar uma foto ou figura. " #: collectionfieldsdialog.cpp:144 -msgid "" -"A Date field can be used for values with a day, month, and year. " -msgstr "" -"Um campo Data pode ser utilizado para valores com dia, mês e ano." +msgid "A Date field can be used for values with a day, month, and year. " +msgstr "Um campo Data pode ser utilizado para valores com dia, mês e ano. " #: collectionfieldsdialog.cpp:145 msgid "A Rating field uses stars to show a rating number. " -msgstr "Campos Classificação usam estrelas para indicar uma nota." +msgstr "Campos Classificação usam estrelas para indicar uma nota. " #: collectionfieldsdialog.cpp:146 msgid "" @@ -3893,7 +3592,7 @@ msgid "" "formatted according to the field description. " msgstr "" "Um campo Dependente depende dos valores de outros campos, sendo " -"formatado conforme a descrição do campo." +"formatado conforme a descrição do campo. " #: collectionfieldsdialog.cpp:148 msgid "" @@ -3901,7 +3600,7 @@ msgid "" "export. " msgstr "" "Um campo Read Only é utilizado para valores internos, que podem ser " -"úteis para importação e exportação de dados." +"úteis para importação e exportação de dados. " #: collectionfieldsdialog.cpp:157 msgid "Cate&gory:" @@ -3922,10 +3621,9 @@ msgid "" "field. For Dependent fields, the description is a format string such " "as \"%{year} %{title}\" where the named fields get substituted in the string." msgstr "" -"A descrição serve como lembrete de que informação o campo deve conter. " -"Para campos Dependentes, a descrição é uma string de formatação " -"do tipo \"%{year} %{title}\" onde os campos nomeados são substituídos por " -"seus valores." +"A descrição serve como lembrete de que informação o campo deve conter. Para " +"campos Dependentes, a descrição é uma string de formatação do tipo \"%" +"{year} %{title}\" onde os campos nomeados são substituídos por seus valores." #: collectionfieldsdialog.cpp:193 msgid "&Default value:" @@ -3942,13 +3640,12 @@ msgstr "Va&lores permitidos:" #: collectionfieldsdialog.cpp:208 msgid "" "For Choice-type fields, these are the only values allowed. They " -"are placed in a combo box. The possible values have to be separated by a " -"semi-colon, for example: \"dog; cat; mouse\"" +"are placed in a combo box. The possible value have to be seperated by a semi-" +"colon, for example: \"dog; cat; mouse\"
" msgstr "" "Para os campos do tipo Escolha, estes são os únicos valores " -"permitidos. Eles são colocados numa lista de opções. Os possíveis " -"valores tem de ser separados por ponto e vírgula, por exemplo: \"cachorro, " -"gato, rato\"" +"permitidos. Eles são colocados numa lista de opções. O valores possíveis têm de ser separados por ponto e vírgula, por exemplo: \"cachorro; gato; rato" +"\"
" #: collectionfieldsdialog.cpp:215 msgid "Extended &properties:" @@ -3987,11 +3684,8 @@ msgid "Allow auto-capitalization only" msgstr "Permitir apenas a formatação automática em letras maiúsculas" #: collectionfieldsdialog.cpp:231 -msgid "" -"This option allows the field to be capitalized, but not specially formatted." -msgstr "" -"Esta opção permite pôr o campo em maiúsculas, mas sem formatações " -"especiais." +msgid "This option allows the field to be capitalized, but not specially formatted." +msgstr "Esta opção permite pôr o campo em maiúsculas, mas sem formatações especiais." #: collectionfieldsdialog.cpp:233 msgid "Format as a title" @@ -4002,8 +3696,8 @@ msgid "" "This option capitalizes and formats the field as a title, but only if those " "options are globally set." msgstr "" -"Esta opção põe em maiúsculas e formata o campo como um título,mas " -"apenas se estas opções forem definidas globalmente." +"Esta opção põe em maiúsculas e formata o campo como um título,mas apenas se " +"estas opções forem definidas globalmente." #: collectionfieldsdialog.cpp:236 msgid "Format as a name" @@ -4014,8 +3708,8 @@ msgid "" "This option capitalizes and formats the field as a name, but only if those " "options are globally set." msgstr "" -"Esta opção põe em maiúsculas e formata o campo como um nome,mas apenas " -"se estas opções forem definidas globalmente." +"Esta opção põe em maiúsculas e formata o campo como um nome,mas apenas se " +"estas opções forem definidas globalmente." #: collectionfieldsdialog.cpp:241 msgid "Field Options" @@ -4042,48 +3736,46 @@ msgid "" "If checked, Tellico will parse the values in the field for multiple values, " "separated by a semi-colon." msgstr "" -"Se selecionado, Tellico separará os valores separados por ponto e vírgula " -"no campo de múltiplos valores." +"Se selecionado, Tellico separará os valores separados por ponto e vírgula no " +"campo de múltiplos valores." #: collectionfieldsdialog.cpp:248 msgid "Allow grouping" msgstr "Permitir agrupamento" #: collectionfieldsdialog.cpp:249 -msgid "" -"If checked, this field may be used to group the entries in the group view." +msgid "If checked, this field may be used to group the entries in the group view." msgstr "" "Se selecionado, este campo será utilizado para reagrupar os registros na " "visão de grupos." #: collectionfieldsdialog.cpp:263 msgid "Revert the selected field's properties to the default values." -msgstr "" -"Reverter as propriedades dos campos selecionados para seus valores padrão." +msgstr "Reverter as propriedades dos campos selecionados para seus valores padrão." -#: collectionfieldsdialog.cpp:306 +#: collectionfieldsdialog.cpp:302 msgid "Modify Fields" msgstr "Modificar Campos" -#: collectionfieldsdialog.cpp:320 +#: collectionfieldsdialog.cpp:316 msgid "" "Removing allowed values from the %1 field which currently exist " "in the collection may cause data corruption. Do you want to keep your " "modified values or cancel and revert to the current ones?" msgstr "" "Apagar os valores possíveis do campo %1 que existem na coleção " -"pode causar corrupção de dados. Você deseja manter seus valores " -"modificados ou cancelar e reverter aos valores anteriores?" +"pode causar corrupção de dados. Você deseja manter seus valores modificados " +"ou cancelar e reverter aos valores anteriores?" -#: collectionfieldsdialog.cpp:325 +#: collectionfieldsdialog.cpp:321 msgid "Keep modified values" msgstr "Manter os valores modificados" -#: collectionfieldsdialog.cpp:745 +#: collectionfieldsdialog.cpp:741 msgid "Revert Field Properties" msgstr "Reverter Propriedades do Campo" -#: collectionfieldsdialog.cpp:746 +#: collectionfieldsdialog.cpp:742 msgid "" "

Do you really want to revert the properties for the %1 field " "back to their default values?

" @@ -4091,35 +3783,35 @@ msgstr "" "

Deseja realmente reverter as propriedades do campo %1 para " "seus valores padrão?

" -#: collectionfieldsdialog.cpp:749 +#: collectionfieldsdialog.cpp:745 msgid "Revert" msgstr "Reverter" -#: collectionfieldsdialog.cpp:872 +#: collectionfieldsdialog.cpp:868 msgid "Extended Field Properties" msgstr "Propriedades Estendidas dos Campos" -#: collectionfieldsdialog.cpp:902 +#: collectionfieldsdialog.cpp:898 msgid "A field with this title already exists. Please enter a different title." msgstr "Já existe um campo com este nome. Favor escolher um nome diferente." -#: collectionfieldsdialog.cpp:909 +#: collectionfieldsdialog.cpp:905 msgid "The category may not be empty. Please enter a category." msgstr "" "A categoria não pode ser deixada em branco. Por favor,informe uma " "categoria." -#: collectionfieldsdialog.cpp:917 +#: collectionfieldsdialog.cpp:913 msgid "" "A field may not be in the same category as a Paragraph, " -"Table or Image field. Please enter a different " -"category." +"Table or Image field. Please enter a different category." msgstr "" "Um campo não pode estar na mesma categoria que um Parágrafo, " "uma Tabela ou uma Imagem. Favor escolher uma outra " "categoria." -#: collectionfieldsdialog.cpp:925 +#: collectionfieldsdialog.cpp:921 msgid "" "A field's title may not be the same as an existing category. Please enter a " "different title." @@ -4127,21 +3819,20 @@ msgstr "" "O nome de um campo não deve ser o mesmo que o de uma categoria existente. " "Por favor insera um outro nome." -#: collectionfieldsdialog.cpp:937 +#: collectionfieldsdialog.cpp:933 msgid "" "The range for a rating field must be between 1 and 10, and the lower bound " "must be less than the higher bound. Please enter different low and high " "properties." msgstr "" -"A faixa para uma classificação tem que ser de 1 até 10, e o limite " -"inferior deve ser menor que o limite superior. Por favor entre com novos " -"limites." +"A faixa para uma classificação tem que ser de 1 até 10, e o limite inferior " +"deve ser menor que o limite superior. Por favor entre com novos limites." -#: collectionfieldsdialog.cpp:952 +#: collectionfieldsdialog.cpp:948 msgid "Tables are limited to a maximum of ten columns." msgstr "Tabelas são limitadas a um máximo de dez colunas." -#: document.cpp:158 +#: document.cpp:155 msgid "" "The current file has been modified.\n" "Do you want to save it?" @@ -4149,7 +3840,7 @@ msgstr "" "O arquivo atual foi modificado.\n" "Deseja salvá-lo?" -#: document.cpp:160 entryeditdialog.cpp:660 +#: document.cpp:157 entryeditdialog.cpp:634 msgid "Unsaved Changes" msgstr "Alterações não salvas" @@ -4157,114 +3848,101 @@ msgstr "Alterações não salvas" msgid "Select Borrower" msgstr "Selecione a pessoa que pegou o item emprestado" -#: configdialog.cpp:103 +#: configdialog.cpp:100 msgid "Configure Tellico" msgstr "Configurar Tellico" -#: configdialog.cpp:198 +#: configdialog.cpp:192 msgid "General Options" msgstr "Opções Gerais" -#: configdialog.cpp:201 +#: configdialog.cpp:195 +msgid "&Include images in data file" +msgstr "&Incluir imagens no arquivo de dados" + +#: configdialog.cpp:196 +msgid "" +"If checked, all images will be included in the data file, rather than saved " +"separately in the Tellico data directory. Saving a lot of images in the data " +"file cause Tellico to run more slowly." +msgstr "" +"Se marcado, todas as imagens vão ser incluídas no arquivo de dados, ao invés " +"de salvas separadamente no diretório de dados do Tellico. Salvar muitas " +"imagens no arquivo de dados pode levar o Tellico a ficar mais lento." + +#: configdialog.cpp:203 msgid "&Reopen file at startup" msgstr "&Reabrir o arquivo ao iniciar" -#: configdialog.cpp:202 +#: configdialog.cpp:204 msgid "" -"If checked, the file that was last open will be re-opened at program " -"start-up." +"If checked, the file that was last open will be re-opened at program start-" +"up." msgstr "" "Se selecionado, o último arquivo aberto será reaberto na próxima " "inicialização do programa." -#: configdialog.cpp:207 +#: configdialog.cpp:209 msgid "&Show \"Tip of the Day\" at startup" msgstr "&Mostrar \"Dicas do Dia\" ao iniciar" -#: configdialog.cpp:208 +#: configdialog.cpp:210 msgid "If checked, the \"Tip of the Day\" will be shown at program start-up." -msgstr "" -"Se selecionado, as '\"Dicas do Dia\" serão mostradas ao iniciar o programa." - -#: configdialog.cpp:213 -#, fuzzy -msgid "Image Storage Options" -msgstr "Opções das Imagens" - -#: configdialog.cpp:214 -#, fuzzy -msgid "Store images in data file" -msgstr "&Incluir imagens no arquivo de dados" - -#: configdialog.cpp:215 -msgid "Store images in common application directory" -msgstr "" - -#: configdialog.cpp:216 -msgid "Store images in directory relative to data file" -msgstr "" - -#: configdialog.cpp:217 -msgid "" -"Images may be saved in the data file itself, which can cause Tellico to run " -"slowly, stored in the Tellico application directory, or stored in a " -"directory in the same location as the data file." -msgstr "" +msgstr "Se selecionado, as '\"Dicas do Dia\" serão mostradas ao iniciar o programa." -#: configdialog.cpp:224 configdialog.cpp:299 +#: configdialog.cpp:215 configdialog.cpp:290 msgid "Formatting Options" msgstr "Opções de formatação" -#: configdialog.cpp:227 +#: configdialog.cpp:218 msgid "Auto capitalize &titles and names" msgstr "Auto capitalizar &títulos e nomes" -#: configdialog.cpp:228 +#: configdialog.cpp:219 msgid "If checked, titles and names will be automatically capitalized." msgstr "" "Se selecionado, os títulos e os nomes serão automaticamente postos em " "maiúsculas." -#: configdialog.cpp:232 +#: configdialog.cpp:223 msgid "Auto &format titles and names" msgstr "&Formatação automática dos títulos e nomes" -#: configdialog.cpp:233 configdialog.cpp:303 +#: configdialog.cpp:224 configdialog.cpp:294 msgid "If checked, titles and names will be automatically formatted." -msgstr "" -"Se selecionado, os títulos e os nomes serão automaticamente formatados." +msgstr "Se selecionado, os títulos e os nomes serão automaticamente formatados." -#: configdialog.cpp:240 +#: configdialog.cpp:231 msgid "No capitali&zation:" -msgstr "Não capitali&zar" +msgstr "Não capitali&zar:" -#: configdialog.cpp:243 +#: configdialog.cpp:234 msgid "" "A list of words which should not be capitalized. Multiple values should " "be separated by a semi-colon." msgstr "" -"Uma lista de palavras que não devem ser capitalizadas. As palavras " -"devem ser separadas por ponto e vírgula." +"Uma lista de palavras que não devem ser capitalizadas. As palavras devem " +"ser separadas por ponto e vírgula." -#: configdialog.cpp:249 +#: configdialog.cpp:240 msgid "Artic&les:" msgstr "Arti&gos:" -#: configdialog.cpp:252 +#: configdialog.cpp:243 msgid "" "A list of words which should be considered as articles if they are the " -"first word in a title. Multiple values should be separated by a " -"semi-colon." +"first word in a title. Multiple values should be separated by a semi-colon." msgstr "" "Uma lista de palavras que devem ser consideradas como artigos se forem a " "primeira palavra em um título. As palavras devem ser separadas por ponto e " "vírgula." -#: configdialog.cpp:259 +#: configdialog.cpp:250 msgid "Personal suffi&xes:" msgstr "Sufi&xos pessoais:" -#: configdialog.cpp:262 +#: configdialog.cpp:253 msgid "" "A list of suffixes which might be used in personal names. Multiple " "values should be separated by a semi-colon." @@ -4272,11 +3950,11 @@ msgstr "" "Uma lista de sufixos que podem ser utilizados nos nomes de pessoas. Os " "sufixos devem ser separados por um ponto e vírgula." -#: configdialog.cpp:268 +#: configdialog.cpp:259 msgid "Surname &prefixes:" msgstr "&Prefixos de sobrenomes:" -#: configdialog.cpp:271 +#: configdialog.cpp:262 msgid "" "A list of prefixes which might be used in surnames. Multiple values " "should be separated by a semi-colon." @@ -4284,69 +3962,67 @@ msgstr "" "Uma lista de prefixos que podem ser utilizados em sobrenomes. Os " "prefixos devem ser separados por um ponto e vírgula." -#: configdialog.cpp:296 +#: configdialog.cpp:287 msgid "Printing" msgstr "Impressão" -#: configdialog.cpp:296 +#: configdialog.cpp:287 msgid "Printing Options" msgstr "Opções de Impressão" -#: configdialog.cpp:302 +#: configdialog.cpp:293 msgid "&Format titles and names" msgstr "&Formatação dos títulos e nomes" -#: configdialog.cpp:306 +#: configdialog.cpp:297 msgid "&Print field headers" msgstr "Im&primir cabeçalhos dos campos" -#: configdialog.cpp:310 +#: configdialog.cpp:301 msgid "Grouping Options" msgstr "Opções de agrupamento" -#: configdialog.cpp:313 +#: configdialog.cpp:304 msgid "&Group the entries" msgstr "A&grupar os registros" -#: configdialog.cpp:317 +#: configdialog.cpp:308 msgid "Image Options" msgstr "Opções das Imagens" -#: configdialog.cpp:323 +#: configdialog.cpp:314 msgid "Maximum image &width:" msgstr "&Largura máxima da imagem:" -#: configdialog.cpp:328 +#: configdialog.cpp:319 msgid "" "The maximum width of the images in the printout. The aspect ration is " "preserved." -msgstr "" -"Largura máxima das imagens na impressão. As proporções são conservadas." +msgstr "Largura máxima das imagens na impressão. As proporções são conservadas." -#: configdialog.cpp:336 +#: configdialog.cpp:327 msgid "&Maximum image height:" msgstr "Altura &máxima da imagem:" -#: configdialog.cpp:341 +#: configdialog.cpp:332 msgid "" "The maximum height of the images in the printout. The aspect ration is " "preserved." -msgstr "" -"Altura máxima da imagem na impressão. As proporções são conservadas." +msgstr "Altura máxima da imagem na impressão. As proporções são conservadas." -#: configdialog.cpp:355 +#: configdialog.cpp:346 msgid "Templates" msgstr "Modelos" -#: configdialog.cpp:355 +#: configdialog.cpp:346 msgid "Template Options" msgstr "Opções do Modelo" -#: configdialog.cpp:369 +#: configdialog.cpp:360 msgid "Template:" msgstr "Modelo:" -#: configdialog.cpp:373 +#: configdialog.cpp:364 msgid "" "Select the template to use for the current type of collections. Not all " "templates will use the font and color settings." @@ -4354,99 +4030,99 @@ msgstr "" "Selecione o modelo a ser utilizado para o tipo de coleção selecionado. Nem " "todos os modelos permitem a alteração do tipo e cor da fonte." -#: configdialog.cpp:380 +#: configdialog.cpp:371 msgid "&Preview..." msgstr "&Pré-visualização..." -#: configdialog.cpp:381 +#: configdialog.cpp:372 msgid "Show a preview of the template" msgstr "Apresenta uma amostra do modelo" -#: configdialog.cpp:398 +#: configdialog.cpp:389 msgid "Font Options" msgstr "Opções de Fonte" -#: configdialog.cpp:405 +#: configdialog.cpp:396 msgid "Font:" msgstr "Fonte:" -#: configdialog.cpp:411 +#: configdialog.cpp:402 msgid "This font is passed to the template used in the Entry View." -msgstr "Esta fonte é utilizada no modelo usado na Visão de Registros" +msgstr "Esta fonte é utilizada no modelo usado na Visão de Registros." -#: configdialog.cpp:415 +#: configdialog.cpp:406 msgid "Size:" msgstr "Tamanho:" -#: configdialog.cpp:425 +#: configdialog.cpp:416 msgid "Color Options" msgstr "Opções de Cor" -#: configdialog.cpp:432 +#: configdialog.cpp:423 msgid "Background color:" msgstr "Cor de fundo:" -#: configdialog.cpp:438 +#: configdialog.cpp:429 msgid "This color is passed to the template used in the Entry View." -msgstr "Esta cor é utilizada no modelo usado na Visão de Registro" +msgstr "Esta cor é utilizada no modelo usado na Visão de Registro." -#: configdialog.cpp:442 +#: configdialog.cpp:433 msgid "Text color:" msgstr "Cor do texto:" -#: configdialog.cpp:451 +#: configdialog.cpp:442 msgid "Highlight color:" msgstr "Cor do destaque:" -#: configdialog.cpp:460 +#: configdialog.cpp:451 msgid "Highlighted text color:" msgstr "Cor do texto em destaque:" -#: configdialog.cpp:469 +#: configdialog.cpp:460 msgid "Manage Templates" msgstr "Gerenciamento de Modelos" -#: configdialog.cpp:475 +#: configdialog.cpp:466 msgid "Install..." msgstr "Instalar..." -#: configdialog.cpp:478 +#: configdialog.cpp:469 msgid "Click to install a new template directly." -msgstr "Clique para instalar um modelo diretamente" +msgstr "Clique para instalar um modelo diretamente." -#: configdialog.cpp:481 configdialog.cpp:537 +#: configdialog.cpp:472 configdialog.cpp:528 msgid "Download..." msgstr "Baixar..." -#: configdialog.cpp:484 +#: configdialog.cpp:475 msgid "Click to download additional templates via the Internet." -msgstr "Clique para baixar modelos adicionais da internet" +msgstr "Clique para baixar modelos adicionais da internet." -#: configdialog.cpp:487 +#: configdialog.cpp:478 msgid "Delete..." msgstr "Deletar..." -#: configdialog.cpp:490 +#: configdialog.cpp:481 msgid "Click to select and remove installed templates." -msgstr "Clique para selecionar e remover modelos instalados" +msgstr "Clique para selecionar e remover modelos instalados." -#: configdialog.cpp:501 +#: configdialog.cpp:492 msgid "Data Sources" msgstr "Fontes de Dados" -#: configdialog.cpp:501 +#: configdialog.cpp:492 msgid "Data Source Options" msgstr "Opções da Fonte de Dados" -#: configdialog.cpp:506 fetchdialog.cpp:171 +#: configdialog.cpp:497 fetchdialog.cpp:161 msgid "Source" msgstr "Fonte" -#: configdialog.cpp:517 +#: configdialog.cpp:508 msgid "Move &Up" msgstr "Mover para &Cima" -#: configdialog.cpp:519 configdialog.cpp:523 +#: configdialog.cpp:510 configdialog.cpp:514 msgid "" "The order of the data sources sets the order that Tellico uses when entries " "are automatically updated." @@ -4454,45 +4130,45 @@ msgstr "" "A ordem das fontes de dados define a ordem que o Tellico usa quando as " "entradas são automaticamente atualizadas." -#: configdialog.cpp:521 +#: configdialog.cpp:512 msgid "Move &Down" msgstr "Mover para &Baixo" -#: configdialog.cpp:528 +#: configdialog.cpp:519 msgid "&New..." msgstr "&Novo..." -#: configdialog.cpp:530 +#: configdialog.cpp:521 msgid "Click to add a new data source." -msgstr "Clique para adicionar uma nova fonte de dados" +msgstr "Clique para adicionar uma nova fonte de dados." -#: configdialog.cpp:531 +#: configdialog.cpp:522 msgid "&Modify..." msgstr "&Modificar..." -#: configdialog.cpp:533 +#: configdialog.cpp:524 msgid "Click to modify the selected data source." -msgstr "Clique para modificar a fonte de dados selecionada" +msgstr "Clique para modificar a fonte de dados selecionada." -#: configdialog.cpp:536 +#: configdialog.cpp:527 msgid "Click to delete the selected data source." -msgstr "Clique para apagar a fonte de dados selecionada" +msgstr "Clique para apagar a fonte de dados selecionada." -#: configdialog.cpp:539 +#: configdialog.cpp:530 msgid "Click to download additional data sources via the Internet." msgstr "Clique para baixar fontes de dados adicionais da internet." -#: configdialog.cpp:1016 +#: configdialog.cpp:991 msgid "*.tar.gz *.tgz|Template Packages (*.tar.gz)" msgstr "*.tar.gz *.tgz|Pacotes de Modelos (*.tar.gz)" -#: configdialog.cpp:1049 +#: configdialog.cpp:1024 msgid "Delete Template" msgstr "Apaga Modelo" -#: configdialog.cpp:1050 +#: configdialog.cpp:1025 msgid "Select template to delete:" -msgstr "Seleciona modelo a ser apagado" +msgstr "Selecione o modelo a ser apagado:" #: loanview.cpp:33 loanview.cpp:91 xslt.cpp:26 msgid "Borrower" @@ -4504,69 +4180,64 @@ msgstr "Registro de entrada" #: loanview.cpp:76 msgid "Modify Loan..." -msgstr "&Modificar empréstimo..." +msgstr "Modificar Empréstimo..." #: loanview.cpp:93 msgid "Borrower (Sort by Count)" msgstr "Pessoa que pegou emprestado (Classificar por Contagem)" -#: collectionfactory.cpp:81 +#: collectionfactory.cpp:77 msgid "My Collection" msgstr "Minha Coleção" -#: collectionfactory.cpp:124 +#: collectionfactory.cpp:118 msgid "Book Collection" msgstr "Coleção de Livros" -#: collectionfactory.cpp:126 +#: collectionfactory.cpp:120 msgid "Comic Book Collection" msgstr "Coleção de Revistas em Quadrinhos" -#: collectionfactory.cpp:127 +#: collectionfactory.cpp:121 msgid "Video Collection" msgstr "Coleção de Vídeos" -#: collectionfactory.cpp:128 +#: collectionfactory.cpp:122 msgid "Music Collection" msgstr "Coleção de Músicas" -#: collectionfactory.cpp:129 +#: collectionfactory.cpp:123 msgid "Coin Collection" msgstr "Coleção de Moedas" -#: collectionfactory.cpp:130 +#: collectionfactory.cpp:124 msgid "Stamp Collection" msgstr "Coleção de Selos" -#: collectionfactory.cpp:131 +#: collectionfactory.cpp:125 msgid "Wine Collection" msgstr "Coleção de Vinhos" -#: collectionfactory.cpp:132 +#: collectionfactory.cpp:126 msgid "Card Collection" msgstr "Coleção de Cartões" -#: collectionfactory.cpp:133 +#: collectionfactory.cpp:127 msgid "Game Collection" msgstr "Coleção de Jogos" -#: collectionfactory.cpp:134 +#: collectionfactory.cpp:128 msgid "File Catalog" msgstr "Catálogo de Arquivos" -#: collectionfactory.cpp:135 -#, fuzzy -msgid "Board Game Collection" -msgstr "Coleção de Jogos" - -#: collectionfactory.cpp:136 +#: collectionfactory.cpp:129 msgid "Custom Collection" msgstr "Coleção Personalizada" #: viewstack.cpp:29 msgid "" -"The Entry View shows a formatted view of the entry's " -"contents." +"The Entry View shows a formatted view of the entry's contents." msgstr "" "A Visão de Registros mostra uma visão formatada do conteúdo do " "registro." @@ -4624,81 +4295,79 @@ msgid "Encode in user locale (%1)" msgstr "Codificar na localização do usuário (%1)" #: exportdialog.cpp:72 -#, fuzzy -msgid "Encode the exported file in the local encoding." +msgid "Encode the exported file in the local format." msgstr "Codifica o arquivo exportado no formato local." -#: fetchdialog.cpp:65 +#: fetchdialog.cpp:59 msgid "&Search" msgstr "&Procurar" -#: fetchdialog.cpp:66 +#: fetchdialog.cpp:60 msgid "&Stop" msgstr "&Interromper" -#: fetchdialog.cpp:86 +#: fetchdialog.cpp:78 msgid "Internet Search" msgstr "Pesquisa na Internet" -#: fetchdialog.cpp:94 +#: fetchdialog.cpp:84 msgid "Search Query" msgstr "Parâmetros da Pesquisa" -#: fetchdialog.cpp:100 +#: fetchdialog.cpp:90 msgid "" "_: Start the search\n" "S&earch:" msgstr "P&esquisa:" -#: fetchdialog.cpp:104 +#: fetchdialog.cpp:94 msgid "Enter a search value. An ISBN search must include the full ISBN." msgstr "" "Forneça um valor de procura. Uma pesquisa por ISBN deve incluir o número " "ISBN completo." -#: fetchdialog.cpp:111 +#: fetchdialog.cpp:101 msgid "Choose the type of search" msgstr "Escolha o tipo de pesquisa" -#: fetchdialog.cpp:117 +#: fetchdialog.cpp:107 msgid "Click to start or stop the search" msgstr "Clique para iniciar ou interromper a pesquisa" -#: fetchdialog.cpp:134 +#: fetchdialog.cpp:124 msgid "&Multiple ISBN/UPC search" msgstr "Pesquisa &múltiplos ISBN/UPC" -#: fetchdialog.cpp:135 +#: fetchdialog.cpp:125 msgid "Check this box to search for multiple ISBN or UPC values." msgstr "Assinale este marcador para pesquisar vários valores ISBN ou UPC." -#: fetchdialog.cpp:138 +#: fetchdialog.cpp:128 msgid "Edit List..." msgstr "Editar Lista..." -#: fetchdialog.cpp:140 -msgid "" -"Click to open a text edit box for entering or editing multiple ISBN values." +#: fetchdialog.cpp:130 +msgid "Click to open a text edit box for entering or editing multiple ISBN values." msgstr "Clique para inserir ou editar os múltiplos ISBN a serem pesquisados." -#: fetchdialog.cpp:146 +#: fetchdialog.cpp:136 msgid "Search s&ource:" msgstr "Procurar f&onte:" -#: fetchdialog.cpp:154 +#: fetchdialog.cpp:144 msgid "Select the database to search" msgstr "Escolha a base de dados a pesquisar" -#: fetchdialog.cpp:177 +#: fetchdialog.cpp:166 msgid "" "As results are found, they are added to this list. Selecting one will fetch " "the complete entry and show it in the view below." msgstr "" -"À medida em que os resultados são encontrados, eles são adicionados a " -"esta lista. Ao selecionar um deles a informação completa do registro será " +"À medida em que os resultados são encontrados, eles são adicionados a esta " +"lista. Ao selecionar um deles a informação completa do registro será " "descarregada e mostrada na lista abaixo." -#: fetchdialog.cpp:185 +#: fetchdialog.cpp:174 msgid "" "An entry may be shown here before adding it to the current collection by " "selecting it in the list above" @@ -4706,39 +4375,39 @@ msgstr "" "Um registro pode ser mostrado aqui antes de ser adicionado à coleção, " "bastando selecioná-lo na lista abaixo" -#: fetchdialog.cpp:192 +#: fetchdialog.cpp:181 msgid "&Add Entry" msgstr "&Adicionar registro" -#: fetchdialog.cpp:196 +#: fetchdialog.cpp:185 msgid "Add the selected entry to the current collection" msgstr "Adicionar o registro selecionado à coleção atual" -#: fetchdialog.cpp:198 +#: fetchdialog.cpp:187 msgid "Get More Results" msgstr "Obter mais resultados" -#: fetchdialog.cpp:201 +#: fetchdialog.cpp:190 msgid "Fetch more results from the current data source" msgstr "Obter mais resultados da fonte de dados atual" -#: fetchdialog.cpp:205 +#: fetchdialog.cpp:194 msgid "Clear all search fields and results" msgstr "Apagar todos os campos e valores" -#: fetchdialog.cpp:298 +#: fetchdialog.cpp:259 msgid "Cancelling the search..." msgstr "Cancelando a pesquisa..." -#: fetchdialog.cpp:313 fetchdialog.cpp:472 +#: fetchdialog.cpp:274 fetchdialog.cpp:432 msgid "Searching..." msgstr "Pesquisando..." -#: fetchdialog.cpp:368 +#: fetchdialog.cpp:329 msgid "The search returned no items." msgstr "A pesquisa não retornou resultados." -#: fetchdialog.cpp:372 +#: fetchdialog.cpp:333 #, c-format msgid "" "_n: The search returned 1 item.\n" @@ -4747,36 +4416,35 @@ msgstr "" "A pesquisa retornou 1 item.\n" "A pesquisa retornou %n items." -#: fetchdialog.cpp:412 -#, fuzzy -msgid "No results were found for the following ISBN values:" -msgstr "Nenhuma entrada encontrada para os ISBN seguintes:" +#: fetchdialog.cpp:370 +msgid "No entries were found for the following ISBN values:" +msgstr "Nenhuma entrada encontrada para os seguintes valores ISBN:" -#: fetchdialog.cpp:443 fetchdialog.cpp:495 +#: fetchdialog.cpp:403 fetchdialog.cpp:455 msgid "Fetching %1..." msgstr "Carregando %1..." -#: fetchdialog.cpp:528 fetchdialog.cpp:708 +#: fetchdialog.cpp:488 msgid "No Internet sources are available for your current collection type." msgstr "Não há fontes na Internet disponíveis para este tipo de coleção." -#: fetchdialog.cpp:594 +#: fetchdialog.cpp:554 msgid "Edit ISBN/UPC Values" msgstr "Editar os valores ISBN/UPC" -#: fetchdialog.cpp:598 +#: fetchdialog.cpp:558 msgid "Enter the ISBN or UPC values, one per line." msgstr "Insira os valores ISBN ou UPC, um por linha." -#: fetchdialog.cpp:604 +#: fetchdialog.cpp:564 msgid "&Load From File..." msgstr "&Carregar de um arquivo..." -#: fetchdialog.cpp:605 +#: fetchdialog.cpp:565 msgid "Load the list from a text file." msgstr "Carrega a lista de um arquivo texto." -#: fetchdialog.cpp:624 +#: fetchdialog.cpp:584 msgid "" "An ISBN search can contain a maximum of 100 ISBN values. Only the first " "100 values in your list will be used." @@ -4784,49 +4452,45 @@ msgstr "" "Uma pesquisa ISBN pode conter um máximo de 100 valores ISBN. Apenas os " "100 primeiros serão utilizados." -#: entryeditdialog.cpp:51 entryeditdialog.cpp:382 entryeditdialog.cpp:406 -#: entryeditdialog.cpp:512 +#: entryeditdialog.cpp:50 entryeditdialog.cpp:357 entryeditdialog.cpp:381 +#: entryeditdialog.cpp:485 msgid "Edit Entry" msgstr "Editar Registro" -#: entryeditdialog.cpp:52 +#: entryeditdialog.cpp:51 msgid "&New Entry" msgstr "&Novo Registro" -#: entryeditdialog.cpp:66 entryeditdialog.cpp:117 entryeditdialog.cpp:416 -#: entryeditdialog.cpp:540 +#: entryeditdialog.cpp:64 entryeditdialog.cpp:115 entryeditdialog.cpp:391 +#: entryeditdialog.cpp:514 msgid "Sa&ve Entry" msgstr "Sal&var Registro" -#: entryeditdialog.cpp:77 +#: entryeditdialog.cpp:75 msgid "Go to the previous entry in the collection" msgstr "Retorna ao registro anterior na coleção" -#: entryeditdialog.cpp:82 +#: entryeditdialog.cpp:80 msgid "Go to the next entry in the collection" msgstr "Avança ao próximo registro na coleção" -#: entryeditdialog.cpp:315 +#: entryeditdialog.cpp:313 msgid "Do you really want to modify these entries?" msgstr "Deseja realmente modificar estes registros?" -#: entryeditdialog.cpp:317 +#: entryeditdialog.cpp:315 msgid "Modify Multiple Entries" msgstr "Modificar Múltiplos Registros" -#: entryeditdialog.cpp:359 -msgid "A value is required for the following fields. Do you want to continue?" -msgstr "" - -#: entryeditdialog.cpp:456 +#: entryeditdialog.cpp:430 msgid "Edit Entries" -msgstr "&Editar Registros" +msgstr "Editar Registros" -#: entryeditdialog.cpp:488 +#: entryeditdialog.cpp:462 msgid "Sa&ve Entries" msgstr "Sal&var Registros" -#: entryeditdialog.cpp:656 +#: entryeditdialog.cpp:630 msgid "" "The current entry has been modified.\n" "Do you want to enter the changes?" @@ -4834,7 +4498,7 @@ msgstr "" "A entrada corrente foi modificada.\n" "Deseja salvar as modificações?" -#: entryeditdialog.cpp:659 +#: entryeditdialog.cpp:633 msgid "Save Entry" msgstr "Salvar Registro" @@ -4855,11 +4519,10 @@ msgid "Select a report template and click Generate." msgstr "Selecione um modelo de relatório e clique em Gerar." #: reportdialog.cpp:108 -msgid "" -"Some reports may take several seconds to generate for large collections." +msgid "Some reports may take several seconds to generate for large collections." msgstr "" -"Alguns relatórios de grandes coleções podem levar vários segundos para " -"serem gerados." +"Alguns relatórios de grandes coleções podem levar vários segundos para serem " +"gerados." #: tellico_kernel.cpp:285 msgid "Do you really want to delete this filter?" @@ -4873,38 +4536,9 @@ msgstr "Apagar o Filtro?" msgid "New collection name:" msgstr "Novo nome da coleção:" -#: tellico_kernel.cpp:377 -#, fuzzy -msgid "Entry 1" -msgstr "Tipo de Registro" - -#: tellico_kernel.cpp:378 -#, fuzzy -msgid "Entry 2" -msgstr "Tipo de Registro" - -#: tellico_kernel.cpp:387 -msgid "Conflicting values for %1 were found while merging entries." -msgstr "" - -#: tellico_kernel.cpp:393 -msgid "Please choose which value to keep." -msgstr "" - -#: entrymerger.cpp:33 tellico_kernel.cpp:398 -#, fuzzy -msgid "Merge Entries" -msgstr "Apagar Registros" - -#: tellico_kernel.cpp:399 tellico_kernel.cpp:400 -#, c-format -msgid "Select value from %1" -msgstr "" - -#: entryview.cpp:186 +#: entryview.cpp:169 msgid "Tellico is unable to locate the default entry stylesheet." -msgstr "" -"Tellico não pôde encontrar a folha de estilo padrão para os registros." +msgstr "Tellico não pôde encontrar a folha de estilo padrão para os registros." #: rc.cpp:6 #, no-c-format @@ -4933,16 +4567,6 @@ msgid "" "Your emails" msgstr "claudio@helpo.com.br" -#: entrymerger.cpp:35 -#, fuzzy -msgid "Merging entries..." -msgstr "Atualizando registros..." - -#: entrymerger.cpp:49 -#, fuzzy -msgid "Total merged/scanned entries: %1/%2" -msgstr "Total de registros: %1" - #: tips.cpp:3 msgid "" "

...that if a book has more than one author, you should separate\n" @@ -4977,8 +4601,8 @@ msgstr "" "usando\n" "o Editor de Campos. Os botões com setas sob a lista de campos permitem " "modificar\n" -"a posição do campo na lista, o que afetará sua posição no editor de " -"registro.

\n" +"a posição do campo na lista, o que afetará sua posição no editor de registro." +"

\n" #: tips.cpp:23 msgid "" @@ -4992,8 +4616,7 @@ msgid "" msgstr "" "

...que se você quiser filtrar a partir de um campo do tipo Marcador,\n" "um valor \"verdadeiro\" deve ser usado. Se quiser, por exemplo, mostrar\n" -"apenas os livros de ficção científica que ainda não leu, marque o " -"botão\n" +"apenas os livros de ficção científica que ainda não leu, marque o botão\n" "Verificar todas as regras seguintes, ajuste a primeira regra\n" "para \"Género\" contém\" \"Ficção científica\" (sem aspas) e a segunda " "regra\n" @@ -5006,8 +4629,7 @@ msgid "" "

To show only books which are by Weber or Bujold, for example, then\n" "type \"weber|bujold\" (no quotes) in the filter box.

\n" msgstr "" -"

...que se um caractere não alfabético for utilizado no Filtro Rápido, " -"o\n" +"

...que se um caractere não alfabético for utilizado no Filtro Rápido, o\n" "o texto é interpretado como uma expressão regular.

\n" "

Para mostrar somente os livros de Weber ou Bujold, por exemplo,\n" "escreva \"weber|bujold\" (sem aspas) no campo do filtro.

\n" @@ -5030,8 +4652,8 @@ msgstr "" #: tips.cpp:50 msgid "" -"

...that you can add, edit, and delete string macros for " -"bibliographies.

\n" +"

...that you can add, edit, and delete string macros for bibliographies.\n" msgstr "" "

...que você pode adicionar, editar e apagar linhas de macros\n" "para bibliografias.

\n" @@ -5045,8 +4667,8 @@ msgid "" "to be sorted or printed together, for example.

\n" msgstr "" "

...que se mais de um campo for formatado como nome, então um grupo\n" -"adicional chamado \"Pessoas\" é adicionado à coleção, permitindo que " -"autores e editores\n" +"adicional chamado \"Pessoas\" é adicionado à coleção, permitindo que autores " +"e editores\n" "sejam classificados ou impressos juntos, por exemplo.

\n" #: tips.cpp:60 @@ -5092,8 +4714,8 @@ msgid "" "

...that in the Detailed View, you can press a letter on the\n" "keyboard to skip to the next entry that starts with that letter.

\n" msgstr "" -"

...que na Visão Detalhada, você pode pressionar uma letra do teclado " -"para ir diretamente ao próximo registro que começa por esta letra.

\n" +"

...que na Visão Detalhada, você pode pressionar uma letra do teclado para " +"ir diretamente ao próximo registro que começa por esta letra.

\n" #: tips.cpp:85 msgid "" @@ -5107,6 +4729,12 @@ msgid "" "types by respecting proper sorting at the same time. Consider for example\n" "a number field followed by a text subfield with entries 3b, 14a.

\n" msgstr "" +"

...que você pode usar Campos Dependentes para combinar múltiplos campos separados\n" +"em um único campo. Apenas selecione o tipo Dependente e use uma descrição\n" +"parecida com \"Valor: %{campoa}%{campob}\" onde %{...} é substituído pelo\n" +"valor do campo apropriado. Isto é útil para coletar vários valores em um único campo, p.ex. para um melhor agrupamento, e para combinar campos de diferentes\n" +"tipos, respeitando a correta organização ao mesmo tempo. Considere, por exemplo,\n" +"um campo de número seguido por um sub-campo de texto com entradas 3b, 14a.

\n" #: xslt.cpp:2 msgid "" @@ -5116,7 +4744,7 @@ msgstr "Álbum" #: xslt.cpp:3 msgid "This template is meant for music collections only." -msgstr "Este modelo é apenas para coleções de música" +msgstr "Este modelo é apenas para coleções de música." #: xslt.cpp:5 msgid "Total:" @@ -5148,7 +4776,7 @@ msgstr "Vídeo" #: xslt.cpp:14 xslt.cpp:43 msgid "This template is meant for video collections only." -msgstr "Este modelo é apenas para coleções de vídeo" +msgstr "Este modelo é apenas para coleções de vídeo." #: xslt.cpp:16 msgid "" @@ -5174,7 +4802,7 @@ msgstr "Gerado por Tellico" #: xslt.cpp:21 msgid "Distinct values: " -msgstr "Valores Distintos:" +msgstr "Valores distintos: " #: xslt.cpp:23 msgid "" @@ -5270,95 +4898,15 @@ msgstr "Lista Unida de Israel" msgid "National Library of Australia" msgstr "Biblioteca Nacional da Austrália" -#: z3950.cpp:22 -#, fuzzy -msgid "National Library of Lithuania" -msgstr "Biblioteca Nacional do Canadá" - -#: z3950.cpp:24 -msgid "Copac (UK and Ireland)" -msgstr "" - #: scripts.cpp:2 -msgid "BoardGameGeek" -msgstr "" - -#: scripts.cpp:4 msgid "Dark Horse Comics" msgstr "Quadrinhos Dark Horse" -#: scripts.cpp:6 +#: scripts.cpp:4 msgid "Allocine.fr" msgstr "Allocine.fr" -#: scripts.cpp:8 +#: scripts.cpp:6 msgid "Spanish Ministry of Culture" msgstr "Ministério da Cultura da Espanha" -#, fuzzy -#~ msgid "CrossRef" -#~ msgstr "Referência cruzada" - -#~ msgid "MODS" -#~ msgstr "MODS" - -#~ msgid "RIS" -#~ msgstr "RIS " - -#, fuzzy -#~ msgid "GCstar" -#~ msgstr "Elenco" - -#~ msgid "AMC" -#~ msgstr "AMC" - -#, fuzzy -#~ msgid "Griffith" -#~ msgstr "Presente" - -#, fuzzy -#~ msgid "Referencer" -#~ msgstr "Referência cruzada" - -#~ msgid "Comics" -#~ msgstr "Revistas em Quadrinhos" - -#~ msgid "Stamps" -#~ msgstr "Selos" - -#~ msgid "Coins" -#~ msgstr "Moedas" - -#~ msgid "Books" -#~ msgstr "Livros" - -#~ msgid "Wines" -#~ msgstr "Vinhos" - -#~ msgid "Videos" -#~ msgstr "Vídeos" - -#~ msgid "Games" -#~ msgstr "Jogos" - -#~ msgid "Cards" -#~ msgstr "Cartões" - -#~ msgid "Entries" -#~ msgstr "Registros" - -#~ msgid "Albums" -#~ msgstr "Álbuns" - -#~ msgid "" -#~ "If checked, all images will be included in the data file, rather than saved " -#~ "separately in the Tellico data directory. Saving a lot of images in the data " -#~ "file cause Tellico to run more slowly." -#~ msgstr "" -#~ "Se marcado, todas as imagens vão ser incluídas no arquivo de dados, ao " -#~ "invés de salvas separadamente no diretório de dados do Tellico. Salvar " -#~ "muitas imagens no arquivo de dados pode levar o Tellico a ficar mais lento." - -#, fuzzy -#~ msgid "Copac" -#~ msgstr "Vírgula" diff --git a/po/ru.po b/po/ru.po index fcbe9e6..4965cee 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1,19 +1,22 @@ # translation of ru.po to Russian +# Copyright (C) 2007 Robby Stephenson . # Калимуллин Артур , 2006. # Kalimullin Artur , 2006. # Pesotsky Denis , 2008. -# Copyright (C) 2007 Robby Stephenson . +# Denis Pesotsky , 2008. +# Denis Pesotsky , 2008. msgid "" msgstr "" "Project-Id-Version: ru\n" "POT-Creation-Date: 2008-01-26 10:52-0800\n" -"PO-Revision-Date: 2008-03-21 00:44+0300\n" -"Last-Translator: Pesotsky Denis \n" +"PO-Revision-Date: 2008-10-22 21:27+0400\n" +"Last-Translator: Denis Pesotsky \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.11.4\n" +"X-Generator: Lokalize 0.2\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: cite/lyxpipe.cpp:50 msgid "Tellico is unable to write to the server pipe at %1." @@ -21,7 +24,7 @@ msgstr "Ошибка записи на канал сервера %1.< #: cite/openoffice.cpp:82 msgid "Connecting to OpenOffice.org..." -msgstr "Подсоединение к OpenOffice.org..." +msgstr "Подсоединение к OpenOffice.org…" #: cite/openoffice.cpp:165 cite/openoffice.cpp:186 msgid "OpenOffice.org Connection" @@ -115,7 +118,7 @@ msgstr "Очистить" #: gui/imagewidget.cpp:57 msgid "Select Image..." -msgstr "Выбрать изображение..." +msgstr "Выбрать изображение…" #: gui/imagewidget.cpp:63 msgid "Save link only" @@ -652,7 +655,7 @@ msgstr "Создан" #: collections/filecatalog.cpp:89 msgid "Modified" -msgstr "Модифицирован" +msgstr "Изменён" #: collections/filecatalog.cpp:93 msgid "Meta Info" @@ -1780,7 +1783,7 @@ msgstr "Описание выделенного отображается зде #: newstuff/dialog.cpp:224 msgid "Downloading information..." -msgstr "Загрузка информации..." +msgstr "Загрузка информации…" #: controller.cpp:135 fetchdialog.cpp:226 fetchdialog.cpp:333 #: fetchdialog.cpp:451 fetchdialog.cpp:506 newstuff/dialog.cpp:297 @@ -1796,7 +1799,7 @@ msgstr "Обновить" #: newstuff/dialog.cpp:413 msgid "Installing item..." -msgstr "Установка...." +msgstr "Установка…" #: translators/bibteximporter.cpp:79 msgid "No valid bibtex entries were found" @@ -1913,7 +1916,7 @@ msgstr "Избранное" #: translators/audiofileimporter.cpp:69 msgid "Scanning audio files..." -msgstr "Сканируются аудио-файлы..." +msgstr "Сканируются аудио-файлы…" #: translators/audiofileimporter.cpp:129 msgid "Bitrate" @@ -2025,7 +2028,7 @@ msgstr "Может быть использован любой другой ра #: translators/filelistingimporter.cpp:63 msgid "Scanning files..." -msgstr "Сканируются файлы..." +msgstr "Сканируются файлы…" #: translators/filelistingimporter.cpp:191 msgid "File Listing Options" @@ -2192,11 +2195,11 @@ msgstr "" #: translators/importer.h:100 msgid "Loading data..." -msgstr "Загружаются данные..." +msgstr "Загружаются данные…" #: translators/importer.h:100 msgid "Loading %1..." -msgstr "Загружается %1..." +msgstr "Загружается %1…" #: translators/bibtexexporter.cpp:48 msgid "Bibtex" @@ -2484,7 +2487,7 @@ msgstr "не соответствует выражению" #: filterdialog.cpp:90 msgid "Edit..." -msgstr "Редактировать..." +msgstr "Редактировать…" #: filterdialog.cpp:282 msgid "Advanced Filter" @@ -2540,11 +2543,11 @@ msgstr "Дата" #: entryupdater.cpp:81 msgid "Updating %1..." -msgstr "Обновление %1..." +msgstr "Обновление %1…" #: entryupdater.cpp:83 msgid "Updating entries..." -msgstr "Обновление записей..." +msgstr "Обновление записей…" #: entryupdater.cpp:85 msgid "Update Entries" @@ -2552,7 +2555,7 @@ msgstr "Обновить записи" #: entryupdater.cpp:99 msgid "Updating %1..." -msgstr "Обновление %1..." +msgstr "Обновление %1…" #: entryupdater.cpp:209 msgid "Select Match" @@ -2875,11 +2878,11 @@ msgstr "Сохранить документ" #: mainwindow.cpp:305 msgid "Save the document as a different file..." -msgstr "Сохранить документ в другой файл..." +msgstr "Сохранить документ в другой файл…" #: mainwindow.cpp:307 msgid "Print the contents of the document..." -msgstr "Напечатать содержимое этого документа..." +msgstr "Напечатать содержимое этого документа…" #: mainwindow.cpp:309 msgid "Quit the application" @@ -2891,7 +2894,7 @@ msgstr "Импортировать коллекцию из других форм #: mainwindow.cpp:324 msgid "Import Tellico Data..." -msgstr "Импорт из файла Tellico..." +msgstr "Импорт из файла Tellico…" #: mainwindow.cpp:325 msgid "Import another Tellico data file" @@ -2899,7 +2902,7 @@ msgstr "Импортировать из другой коллекции Tellico" #: mainwindow.cpp:331 msgid "Import CSV Data..." -msgstr "Импорт из CSV..." +msgstr "Импорт из CSV…" #: mainwindow.cpp:332 msgid "Import a CSV file" @@ -2907,7 +2910,7 @@ msgstr "Импорт из файла CSV" #: mainwindow.cpp:338 msgid "Import MODS Data..." -msgstr "Импорт из MODS..." +msgstr "Импорт из MODS…" #: mainwindow.cpp:339 msgid "Import a MODS data file" @@ -2915,7 +2918,7 @@ msgstr "Импорт из файла MODS" #: mainwindow.cpp:345 msgid "Import Alexandria Data..." -msgstr "Импорт из файла Alexandria..." +msgstr "Импорт из файла Alexandria…" #: mainwindow.cpp:346 msgid "Import data from the Alexandria book collection manager" @@ -2923,7 +2926,7 @@ msgstr "Импорт из менеджера коллекций книг Alexand #: mainwindow.cpp:352 msgid "Import Delicious Library Data..." -msgstr "Импорт из файла Delicious..." +msgstr "Импорт из файла Delicious…" #: mainwindow.cpp:353 msgid "Import data from Delicious Library" @@ -2931,7 +2934,7 @@ msgstr "Импорт данных из файла Delicious" #: mainwindow.cpp:359 msgid "Import Referencer Data..." -msgstr "Импорт из файла Referencer..." +msgstr "Импорт из файла Referencer…" #: mainwindow.cpp:360 msgid "Import data from Referencer" @@ -2939,7 +2942,7 @@ msgstr "Импортировать данные из Referencer" #: mainwindow.cpp:366 msgid "Import Bibtex Data..." -msgstr "Импорт из Bibtex..." +msgstr "Импорт из Bibtex…" #: mainwindow.cpp:367 msgid "Import a bibtex bibliography file" @@ -2947,7 +2950,7 @@ msgstr "Импортировать из файла библиографии bibt #: mainwindow.cpp:373 msgid "Import Bibtexml Data..." -msgstr "Импорт из Bibtexml..." +msgstr "Импорт из Bibtexml…" #: mainwindow.cpp:374 msgid "Import a Bibtexml bibliography file" @@ -2955,7 +2958,7 @@ msgstr "Импортировать из файла библиографии Bibt #: mainwindow.cpp:380 msgid "Import RIS Data..." -msgstr "Импорт из RIS..." +msgstr "Импорт из RIS…" #: mainwindow.cpp:381 msgid "Import an RIS reference file" @@ -2963,7 +2966,7 @@ msgstr "Импортировать из файла RIS" #: mainwindow.cpp:387 msgid "Import PDF File..." -msgstr "Импорт из PDF..." +msgstr "Импорт из PDF…" #: mainwindow.cpp:388 msgid "Import a PDF file" @@ -2971,7 +2974,7 @@ msgstr "Импортировать из файла PDF" #: mainwindow.cpp:394 msgid "Import Audio File Metadata..." -msgstr "Импорт из данных аудио файла..." +msgstr "Импорт из данных аудио файла…" #: mainwindow.cpp:395 msgid "Import meta-data from audio files" @@ -2979,7 +2982,7 @@ msgstr "Импорт из данных тегов аудио файлов" #: mainwindow.cpp:404 msgid "Import Audio CD Data..." -msgstr "Импорт из Audio CD..." +msgstr "Импорт из Audio CD…" #: mainwindow.cpp:405 msgid "Import audio CD information" @@ -2987,7 +2990,7 @@ msgstr "Импорт информации об Audio CD" #: mainwindow.cpp:414 msgid "Import GCstar Data..." -msgstr "Импорт из файла GCstar..." +msgstr "Импорт из файла GCstar…" #: mainwindow.cpp:415 msgid "Import a GCstar data file" @@ -2995,7 +2998,7 @@ msgstr "Импорт данных из файла GCstar" #: mainwindow.cpp:421 msgid "Import Griffith Data..." -msgstr "Импорт из файла Griffith..." +msgstr "Импорт из файла Griffith…" #: mainwindow.cpp:422 msgid "Import a Griffith database" @@ -3003,7 +3006,7 @@ msgstr "Импортировать из файла Griffith" #: mainwindow.cpp:428 msgid "Import Ant Movie Catalog Data..." -msgstr "Импорт из файла Ant..." +msgstr "Импорт из файла Ant…" #: mainwindow.cpp:429 msgid "Import an Ant Movie Catalog data file" @@ -3011,7 +3014,7 @@ msgstr "Импортировать из файла менеджера колле #: mainwindow.cpp:435 msgid "Import File Listing..." -msgstr "Импорт списка фалов..." +msgstr "Импорт списка фалов…" #: mainwindow.cpp:436 msgid "Import information about files in a folder" @@ -3019,7 +3022,7 @@ msgstr "Импортировать информацию о файлах в па #: mainwindow.cpp:442 msgid "Import XSL Transform..." -msgstr "Импорт из XSLT..." +msgstr "Импорт из XSLT…" #: mainwindow.cpp:443 msgid "Import using an XSL Transform" @@ -3036,7 +3039,7 @@ msgstr "Экспортировать данные коллекции в друг #: mainwindow.cpp:461 msgid "Export to XML..." -msgstr "Экспорт в XML..." +msgstr "Экспорт в XML…" #: mainwindow.cpp:462 msgid "Export to a Tellico XML file" @@ -3044,7 +3047,7 @@ msgstr "Экспорт в XML-файл Tellico" #: mainwindow.cpp:468 msgid "Export to Zip..." -msgstr "Экспорт в ZIP..." +msgstr "Экспорт в ZIP…" #: mainwindow.cpp:469 msgid "Export to a Tellico Zip file" @@ -3052,7 +3055,7 @@ msgstr "Экспорт в сжатый ZIP файл Tellico" #: mainwindow.cpp:475 msgid "Export to HTML..." -msgstr "Экспорт в HTML..." +msgstr "Экспорт в HTML…" #: mainwindow.cpp:476 msgid "Export to an HTML file" @@ -3060,7 +3063,7 @@ msgstr "Экспорт в файл HTML" #: mainwindow.cpp:482 msgid "Export to CSV..." -msgstr "Экспорт в CSV..." +msgstr "Экспорт в CSV…" #: mainwindow.cpp:483 msgid "Export to a comma-separated values file" @@ -3068,7 +3071,7 @@ msgstr "Экспорт в текстовый файл с разделённым #: mainwindow.cpp:489 msgid "Export to PilotDB..." -msgstr "Экспорт в PilotDB..." +msgstr "Экспорт в PilotDB…" #: mainwindow.cpp:490 msgid "Export to a PilotDB database" @@ -3076,7 +3079,7 @@ msgstr "Экспортировать в базу данных PilotDB" #: mainwindow.cpp:496 msgid "Export to Alexandria..." -msgstr "Экспорт в Alexandria..." +msgstr "Экспорт в Alexandria…" #: mainwindow.cpp:497 msgid "Export to an Alexandria library" @@ -3084,7 +3087,7 @@ msgstr "Экспорт в библиотеку Alexandria" #: mainwindow.cpp:503 msgid "Export to Bibtex..." -msgstr "Экспорт в Bibtex..." +msgstr "Экспорт в Bibtex…" #: mainwindow.cpp:504 msgid "Export to a bibtex file" @@ -3092,7 +3095,7 @@ msgstr "Экспорт в файл Bibtex" #: mainwindow.cpp:510 msgid "Export to Bibtexml..." -msgstr "Экспорт в Bibtexml..." +msgstr "Экспорт в Bibtexml…" #: mainwindow.cpp:511 msgid "Export to a Bibtexml file" @@ -3100,7 +3103,7 @@ msgstr "Экспорт в файл Bibtexml" #: mainwindow.cpp:517 msgid "Export to ONIX..." -msgstr "Экспорт в ONIX..." +msgstr "Экспорт в ONIX…" #: mainwindow.cpp:518 msgid "Export to an ONIX file" @@ -3108,7 +3111,7 @@ msgstr "Экспорт в файл ONIX" #: mainwindow.cpp:524 msgid "Export to GCfilms..." -msgstr "Экспорт в GCfilms..." +msgstr "Экспорт в GCfilms…" #: mainwindow.cpp:525 msgid "Export to a GCfilms data file" @@ -3116,7 +3119,7 @@ msgstr "Экспорт в файл GCfilms" #: mainwindow.cpp:531 msgid "Export to GCstar..." -msgstr "Экспорт в GCStar..." +msgstr "Экспорт в GCStar…" #: mainwindow.cpp:532 msgid "Export to a GCstar data file" @@ -3124,7 +3127,7 @@ msgstr "Экспорт в файл GCfilms" #: mainwindow.cpp:536 msgid "Export XSL Transform..." -msgstr "Экспорт в XSLT..." +msgstr "Экспорт в XSLT…" #: mainwindow.cpp:537 msgid "Export using an XSL Transform" @@ -3152,15 +3155,15 @@ msgstr "Отменить выделение записей в коллекции #: mainwindow.cpp:556 msgid "Internet Search..." -msgstr "Поиск в интернете..." +msgstr "Поиск в интернете…" #: mainwindow.cpp:559 msgid "Search the internet..." -msgstr "Повести поиск в интернете для создания новой записи в коллекции..." +msgstr "Повести поиск в интернете для создания новой записи в коллекции…" #: mainwindow.cpp:561 msgid "Advanced &Filter..." -msgstr "Продвинутый &фильтр..." +msgstr "Продвинутый &фильтр…" #: mainwindow.cpp:564 mainwindow.cpp:719 msgid "Filter the collection" @@ -3168,7 +3171,7 @@ msgstr "Фильтр коллекции" #: mainwindow.cpp:569 msgid "&New Entry..." -msgstr "&Новая запись..." +msgstr "&Новая запись…" #: mainwindow.cpp:572 msgid "Create a new entry" @@ -3176,7 +3179,7 @@ msgstr "Создать новую запись" #: controller.cpp:620 mainwindow.cpp:573 msgid "&Edit Entry..." -msgstr "&Редактировать запись..." +msgstr "&Редактировать запись…" #: mainwindow.cpp:576 msgid "Edit the selected entries" @@ -3208,7 +3211,7 @@ msgstr "Объединить выделенные записи" #: mainwindow.cpp:591 msgid "&Generate Reports..." -msgstr "Создать от&чет..." +msgstr "Создать от&чет…" #: mainwindow.cpp:594 msgid "Generate collection reports" @@ -3216,7 +3219,7 @@ msgstr "Создать отчет о коллекции" #: mainwindow.cpp:595 msgid "Check-&out..." -msgstr "&Отдать в долг..." +msgstr "&Отдать в долг…" #: mainwindow.cpp:598 msgid "Check-out the selected items" @@ -3232,7 +3235,7 @@ msgstr "Вернуть из долга выделенные записи" #: mainwindow.cpp:604 msgid "&Rename Collection..." -msgstr "&Переименовать коллекцию..." +msgstr "&Переименовать коллекцию…" #: mainwindow.cpp:607 msgid "Rename the collection" @@ -3256,7 +3259,7 @@ msgstr "Конвертировать коллекцию книг в библио #: mainwindow.cpp:616 msgid "String &Macros..." -msgstr "Строчный &макрос..." +msgstr "Строчный &макрос…" #: mainwindow.cpp:619 msgid "Edit the bibtex string macros" @@ -3357,7 +3360,7 @@ msgstr "Очистить фильтр" #: mainwindow.cpp:710 msgid "Filter here..." -msgstr "Фильтр..." +msgstr "Фильтр…" #: mainwindow.cpp:768 msgid "Groups" @@ -3399,11 +3402,11 @@ msgstr "" #: mainwindow.cpp:1066 msgid "Creating new document..." -msgstr "Создание нового документа..." +msgstr "Создание нового документа…" #: mainwindow.cpp:1098 mainwindow.cpp:1117 mainwindow.cpp:1135 msgid "Opening file..." -msgstr "Открытие файла..." +msgstr "Открытие файла…" #: mainwindow.cpp:1108 msgid "Open File" @@ -3411,7 +3414,7 @@ msgstr "Открыть файл" #: document.cpp:192 mainwindow.cpp:1215 msgid "Saving file..." -msgstr "Сохранение файла...." +msgstr "Сохранение файла…." #: mainwindow.cpp:1226 msgid "" @@ -3435,11 +3438,11 @@ msgstr "Сохранять изображения вместе с файлом" #: mainwindow.cpp:1265 msgid "Saving file with a new filename..." -msgstr "Сохранение файла под другим именем..." +msgstr "Сохранение файла под другим именем…" #: mainwindow.cpp:1303 mainwindow.cpp:1353 msgid "Printing..." -msgstr "Идёт печать..." +msgstr "Идёт печать…" #: mainwindow.cpp:1312 msgid "" @@ -3451,11 +3454,11 @@ msgstr "" #: mainwindow.cpp:1337 msgid "Processing document..." -msgstr "Подождите..." +msgstr "Подождите…" #: mainwindow.cpp:1360 msgid "Exiting..." -msgstr "Выход..." +msgstr "Выход…" #: mainwindow.cpp:1498 #, c-format @@ -3490,7 +3493,7 @@ msgstr "Пожалуйста, проверьте свою инсталляцию #: mainwindow.cpp:1849 msgid "Importing data..." -msgstr "Импорт данных..." +msgstr "Импорт данных…" #: mainwindow.cpp:1858 msgid "Import File" @@ -3502,7 +3505,7 @@ msgstr "Импорт каталога" #: mainwindow.cpp:1885 msgid "Exporting data..." -msgstr "Экспортирование данных..." +msgstr "Экспортирование данных…" #: mainwindow.cpp:1907 msgid "Export As" @@ -3522,7 +3525,7 @@ msgstr "Строка" #: mainwindow.cpp:1999 msgid "Creating citations..." -msgstr "Идет создание цитат..." +msgstr "Идет создание цитат…" #: mainwindow.cpp:2104 msgid "Filters" @@ -3598,7 +3601,7 @@ msgstr "Удалить несколько записей" #: controller.cpp:626 msgid "&Edit Entries..." -msgstr "&Редактировать записи..." +msgstr "&Редактировать записи…" #: controller.cpp:627 msgid "D&uplicate Entries" @@ -3862,7 +3865,7 @@ msgstr "Дополнительные &параметры:" #: collectionfieldsdialog.cpp:217 msgid "&Set..." -msgstr "&Установить..." +msgstr "&Установить…" #: collectionfieldsdialog.cpp:221 msgid "" @@ -4242,11 +4245,11 @@ msgstr "" #: configdialog.cpp:380 msgid "&Preview..." -msgstr "&Пред-просмотр..." +msgstr "&Предпросмотр…" #: configdialog.cpp:381 msgid "Show a preview of the template" -msgstr "Показать пред-просмотр шаблона" +msgstr "Показать предпросмотр шаблона" #: configdialog.cpp:398 msgid "Font Options" @@ -4294,7 +4297,7 @@ msgstr "Управление шаблонами" #: configdialog.cpp:475 msgid "Install..." -msgstr "Установить..." +msgstr "Установить…" #: configdialog.cpp:478 msgid "Click to install a new template directly." @@ -4302,7 +4305,7 @@ msgstr "Нажмите для установки шаблона." #: configdialog.cpp:481 configdialog.cpp:537 msgid "Download..." -msgstr "Загрузить..." +msgstr "Загрузить…" #: configdialog.cpp:484 msgid "Click to download additional templates via the Internet." @@ -4310,7 +4313,7 @@ msgstr "Нажмите для загрузки дополнительных ша #: configdialog.cpp:487 msgid "Delete..." -msgstr "Удалить..." +msgstr "Удалить…" #: configdialog.cpp:490 msgid "Click to select and remove installed templates." @@ -4346,7 +4349,7 @@ msgstr "&Ниже" #: configdialog.cpp:528 msgid "&New..." -msgstr "&Новый..." +msgstr "&Новый…" #: configdialog.cpp:530 msgid "Click to add a new data source." @@ -4354,7 +4357,7 @@ msgstr "Нажмите для создания нового источника #: configdialog.cpp:531 msgid "&Modify..." -msgstr "&Редактировать..." +msgstr "&Редактировать…" #: configdialog.cpp:533 msgid "Click to modify the selected data source." @@ -4390,7 +4393,7 @@ msgstr "Вернуть из долга" #: loanview.cpp:76 msgid "Modify Loan..." -msgstr "Редактировать долг..." +msgstr "Редактировать долг…" #: loanview.cpp:93 msgid "Borrower (Sort by Count)" @@ -4556,7 +4559,7 @@ msgstr "Если отмечено, будет проведен многокра #: fetchdialog.cpp:138 msgid "Edit List..." -msgstr "Редактировать список..." +msgstr "Редактировать список…" #: fetchdialog.cpp:140 msgid "Click to open a text edit box for entering or editing multiple ISBN values." @@ -4606,11 +4609,11 @@ msgstr "Очистить все поля поиска и результаты" #: fetchdialog.cpp:298 msgid "Cancelling the search..." -msgstr "Отмена поиска..." +msgstr "Отмена поиска…" #: fetchdialog.cpp:313 fetchdialog.cpp:472 msgid "Searching..." -msgstr "Поиск..." +msgstr "Поиск…" #: fetchdialog.cpp:368 msgid "The search returned no items." @@ -4631,7 +4634,7 @@ msgstr "Никаких записей не было найдено по след #: fetchdialog.cpp:443 fetchdialog.cpp:495 msgid "Fetching %1..." -msgstr "Загрузка %1..." +msgstr "Загрузка %1…" #: fetchdialog.cpp:528 fetchdialog.cpp:708 msgid "No Internet sources are available for your current collection type." @@ -4647,7 +4650,7 @@ msgstr "Введите значения ISBN/UPC, по одному в ст #: fetchdialog.cpp:604 msgid "&Load From File..." -msgstr "&Загрузить из файла..." +msgstr "&Загрузить из файла…" #: fetchdialog.cpp:605 msgid "Load the list from a text file." @@ -4805,15 +4808,15 @@ msgstr "Калимуллин Артур, Песоцкий Денис" msgid "" "_: EMAIL OF TRANSLATORS\n" "Your emails" -msgstr "kalimullin@gmail.com, St.MPA3b@gmail.com" +msgstr "kalimullin@gmail.com, denis@kde.ru" #: entrymerger.cpp:35 msgid "Merging entries..." -msgstr "Объединение записей..." +msgstr "Объединение записей…" #: entrymerger.cpp:49 msgid "Total merged/scanned entries: %1/%2" -msgstr "Всего записей объединено/просканировано: %1" +msgstr "Всего записей объединено/просканировано: %1/%2" #: tips.cpp:3 msgid "" @@ -4823,7 +4826,7 @@ msgid "" "

Any other field which allows multiple values should be entered the\n" "same way, with a semi-colon (;) separating each value.

\n" msgstr "" -"

...что если книга имеет больше, чем одного автора, то вам следует " +"

…что если книга имеет больше, чем одного автора, то вам следует " "разделять\n" "точкой с запятой (;). Таким образом, Tellico будет разделять их имена.

\n" "

Любое другое поле также поддерживает эту функцию. Для этого вам следует\n" @@ -4835,7 +4838,7 @@ msgid "" "

...that you can change which fields are shown in the list view by\n" "right-clicking on the column header.\n" msgstr "" -"

...что вы можете выбрать какие поля следует показывать в списке записей,\n" +"

…что вы можете выбрать какие поля следует показывать в списке записей,\n" "кликнув правой кнопкой мыши на заголовке \"таблицы\".\n" #: tips.cpp:16 @@ -4846,7 +4849,7 @@ msgid "" "position of the field in the list, which affects the placement in the entry\n" "editor.

\n" msgstr "" -"

...что вы можете добавлять, редактировать или удалять поля в коллекции,\n" +"

…что вы можете добавлять, редактировать или удалять поля в коллекции,\n" "используя Редактор полей. Кнопки стрелок позволяют вам менять позицию полей " "в списке,\n" "которая влияет на расстановку в Редакторе записей.

\n" @@ -4861,7 +4864,7 @@ msgid "" "\"contains\" \"Science Fiction\" (no quotes) and the second rule to\n" "have \"Read\" \"does not contain\" \"true\" (no quotes).

\n" msgstr "" -"

...что если вы хотите отфильтровать записи по полю \"Выбор да/нет\",\n" +"

…что если вы хотите отфильтровать записи по полю \"Выбор да/нет\",\n" "то должно использоваться значение \"да\". Например, если вы хотите " "посмотреть, какие детективы вы ещё не читали,\n" "нажмите кнопку \"Соответствует всему следующему\",\n" @@ -4876,7 +4879,7 @@ msgid "" "

To show only books which are by Weber or Bujold, for example, then\n" "type \"weber|bujold\" (no quotes) in the filter box.

\n" msgstr "" -"

...что если в быстром фильтре используется символ, не входящий в слова " +"

…что если в быстром фильтре используется символ, не входящий в слова " "(напр., ^)\n" "текст интерпретируется как регулярное выражение.

\n" "

Например, чтобы посмотреть только книги, которые написали Пушкин и " @@ -4888,7 +4891,7 @@ msgid "" "

...that you can edit more than one entry at a time, by holding down\n" "the Shift or Ctrl key and selecting multiple entries.

\n" msgstr "" -"

...что за один раз вы можете отредактировать больше, чем одно поле.\n" +"

…что за один раз вы можете отредактировать больше, чем одно поле.\n" "Для этого выделите несколько полей, зажимая клавиши Shift или Ctrl.

\n" #: tips.cpp:45 @@ -4896,7 +4899,7 @@ msgid "" "

...that you can convert an existing book collection to a bibliography,\n" "which can then be exported to bibtex or Bibtexml format.

\n" msgstr "" -"

...что вы можете конвертировать текущую коллекцию книг в библиографию,\n" +"

…что вы можете конвертировать текущую коллекцию книг в библиографию,\n" "которая может быть экспортирована в формат Bibtex или Bibtexml.

\n" #: tips.cpp:50 @@ -4904,7 +4907,7 @@ msgid "" "

...that you can add, edit, and delete string macros for bibliographies.\n" msgstr "" -"

...что вы можете добавлять, редактировать и удалять строковые макросы для " +"

…что вы можете добавлять, редактировать и удалять строковые макросы для " "библиографий.

\n" #: tips.cpp:54 @@ -4915,7 +4918,7 @@ msgid "" "editors\n" "to be sorted or printed together, for example.

\n" msgstr "" -"

...что если более чем одно поле форматируется как \"имя\", то в " +"

…что если более чем одно поле форматируется как \"имя\", то в " "коллекцию\n" "добавляется дополнительная группа \"Люди\", например, для сортировки и " "печати вместе.

\n" @@ -4927,7 +4930,7 @@ msgid "" "CSS\n" "within the stylesheet governs things like the font, the margins, etc.

\n" msgstr "" -"

...что вы можете менять внешний вид, печатаемых отчетов, редактируя\n" +"

…что вы можете менять внешний вид, печатаемых отчетов, редактируя\n" "файл tellico-printing.xsl. Этот файл создает HTML и CSS\n" "с такими элементами как шрифт, размер и т.д.

\n" @@ -4936,12 +4939,12 @@ msgid "" "

...that you can import using any generic XSL stylesheet which\n" "outputs a valid Tellico XML file.

\n" msgstr "" -"

...что вы можете импортировать, используя стандартный\n" +"

…что вы можете импортировать, используя стандартный\n" "лист стилей XSL, на выходе получая правильный файл Tellico XML.

\n" #: tips.cpp:71 msgid "

...that double-clicking an entry item opens the Entry Editor.

\n" -msgstr "

...что двойной щелчок на записи открывает редактор записей.

\n" +msgstr "

…что двойной щелчок на записи открывает редактор записей.

\n" #: tips.cpp:75 msgid "" @@ -4949,7 +4952,7 @@ msgid "" "as\n" "<b>bold</b> or <i>italic</i>.

\n" msgstr "" -"

...что в любое поле типа \"Большой текст\" вы можете добавлять теги HTML, " +"

…что в любое поле типа \"Большой текст\" вы можете добавлять теги HTML, " "такие как \n" "<b>жирный шрифт</b> или <i>курсивный</i>.

\n" @@ -4958,7 +4961,7 @@ msgid "" "

...that in the Detailed View, you can press a letter on the\n" "keyboard to skip to the next entry that starts with that letter.

\n" msgstr "" -"

...что в подробном виде вы можете нажать кнопку буквы на клавиатуре для\n" +"

…что в подробном виде вы можете нажать кнопку буквы на клавиатуре для\n" "перехода к записи, начинающейся с этой буквы.

\n" #: tips.cpp:85 @@ -4973,9 +4976,9 @@ msgid "" "types by respecting proper sorting at the same time. Consider for example\n" "a number field followed by a text subfield with entries 3b, 14a.

\n" msgstr "" -"

...что вы можете использовать \"зависимые\" поля для комбинации\n" +"

…что вы можете использовать \"зависимые\" поля для комбинации\n" "нескольких раздельных полей в одно. Просто выберите тип \"зависимый\" \n" -"и используйте описание вроде \"Значение: %{поле1}%{поле2}\", где %{...}\n" +"и используйте описание вроде \"Значение: %{поле1}%{поле2}\", где %{…}\n" "заменяется на значение поля. Это полезно для использование различных\n" "полей в одном поле, т.е. для лучшей группировки и для комбинации полей\n" "различных типов с приоритетом правильной сортировки. Пример -\n" diff --git a/src/borrower.h b/src/borrower.h index 81a5dc2..261ab4d 100644 --- a/src/borrower.h +++ b/src/borrower.h @@ -78,7 +78,7 @@ public: const TQString& name() const { return m_name; } const LoanVec& loans() const { return m_loans; } bool isEmpty() const { return m_loans.isEmpty(); } - int count() const { return m_loans.count(); } + size_t count() const { return m_loans.count(); } Data::LoanPtr loan(Data::ConstEntryPtr entry); void addLoan(Data::LoanPtr loan); diff --git a/src/borroweritem.cpp b/src/borroweritem.cpp index f43e502..80a305f 100644 --- a/src/borroweritem.cpp +++ b/src/borroweritem.cpp @@ -25,7 +25,7 @@ BorrowerItem::BorrowerItem(GUI::ListView* parent_, Data::BorrowerPtr borrower_) setPixmap(0, SmallIcon(TQString::fromLatin1("kaddressbook"))); } -int BorrowerItem::count() const { +size_t BorrowerItem::count() const { return m_borrower ? m_borrower->count() : GUI::CountedItem::count(); } diff --git a/src/borroweritem.h b/src/borroweritem.h index ad0b7d6..9d15f3f 100644 --- a/src/borroweritem.h +++ b/src/borroweritem.h @@ -29,7 +29,7 @@ public: virtual bool isBorrowerItem() const { return true; } Data::BorrowerPtr borrower() { return m_borrower; } - virtual int count() const; + virtual size_t count() const; virtual Data::EntryVec entries() const; private: diff --git a/src/collection.cpp b/src/collection.cpp index 7d121e0..59cbef6 100644 --- a/src/collection.cpp +++ b/src/collection.cpp @@ -878,6 +878,9 @@ bool Collection::mergeEntry(EntryPtr e1, EntryPtr e2, bool overwrite_, bool askU if(ret) { e1->setField(field, vals1.join(TQString::fromLatin1("; "))); } +// remove the merging due to use comments +// maybe in the future have a more intelligent way +#if 0 } else if(field->flags() & Data::Field::AllowMultiple) { // if field F allows multiple values and not a Table (see above case), // e1's F values = (e1's F values) U (e2's F values) (union) @@ -894,6 +897,7 @@ bool Collection::mergeEntry(EntryPtr e1, EntryPtr e2, bool overwrite_, bool askU // items1.sort(); e1->setField(field, items1.join(TQString::fromLatin1("; "))); ret = true; +#endif } else if(askUser_ && e1->field(field) != e2->field(field)) { int ret = Kernel::self()->askAndMerge(e1, e2, field); if(ret == 0) { diff --git a/src/collectionfieldsdialog.cpp b/src/collectionfieldsdialog.cpp index ef3583f..7d1fc46 100644 --- a/src/collectionfieldsdialog.cpp +++ b/src/collectionfieldsdialog.cpp @@ -254,7 +254,6 @@ CollectionFieldsDialog::CollectionFieldsDialog(Data::CollPtr coll_, TQWidget* pa // need to stretch at bottom vbox->setStretchFactor(new TQWidget(vbox), 1); - TDEAcceleratorManager::manage(vbox); // keep a default collection m_defaultCollection = CollectionFactory::collection(m_coll->type(), true); @@ -279,6 +278,9 @@ CollectionFieldsDialog::~CollectionFieldsDialog() { } void CollectionFieldsDialog::slotSelectInitial() { + // the accel management is here so that it doesn't cause conflicts with the + // ones explicitly set in the constructor + TDEAcceleratorManager::manage(mainWidget()); m_fieldsBox->setSelected(0, true); } @@ -405,7 +407,7 @@ void CollectionFieldsDialog::slotNew() { } TQString name = TQString::fromLatin1("custom") + TQString::number(m_newFields.count()+1); - int count = m_newFields.count() + 1; + size_t count = m_newFields.count() + 1; TQString title = i18n("New Field") + TQString::fromLatin1(" %1").arg(count); while(m_fieldsBox->findItem(title)) { ++count; diff --git a/src/collections/filecatalog.cpp b/src/collections/filecatalog.cpp index 92d088f..afba7fc 100644 --- a/src/collections/filecatalog.cpp +++ b/src/collections/filecatalog.cpp @@ -102,4 +102,21 @@ Tellico::Data::FieldVec FileCatalog::defaultFields() { return list; } +int FileCatalog::sameEntry(Data::EntryPtr entry1_, Data::EntryPtr entry2_) const { + // equal urls are always equal, even if modification time or something is different + if(Entry::compareValues(entry1_, entry2_, TQString::fromLatin1("url"), this) > 0) { + return 100; // good match + } + // if volume or created time is different, it can't be same entry + if(Entry::compareValues(entry1_, entry2_, TQString::fromLatin1("volume"), this) == 0 || + Entry::compareValues(entry1_, entry2_, TQString::fromLatin1("created"), this) == 0 || + Entry::compareValues(entry1_, entry2_, TQString::fromLatin1("size"), this) == 0) { + return 0; + } + int res = Entry::compareValues(entry1_, entry2_, TQString::fromLatin1("title"), this); + res += Entry::compareValues(entry1_, entry2_, TQString::fromLatin1("description"), this); + res += Entry::compareValues(entry1_, entry2_, TQString::fromLatin1("mimetype"), this); + return res; +} + #include "filecatalog.moc" diff --git a/src/collections/filecatalog.h b/src/collections/filecatalog.h index f2ede29..6a08dc9 100644 --- a/src/collections/filecatalog.h +++ b/src/collections/filecatalog.h @@ -1,5 +1,5 @@ /*************************************************************************** - copyright : (C) 2005-2006 by Robby Stephenson + copyright : (C) 2005-2008 by Robby Stephenson email : robby@periapsis.org ***************************************************************************/ @@ -30,6 +30,7 @@ public: FileCatalog(bool addFields, const TQString& title = TQString()); virtual Type type() const { return File; } + virtual int sameEntry(Data::EntryPtr entry1, Data::EntryPtr entry2) const; static FieldVec defaultFields(); }; diff --git a/src/controller.cpp b/src/controller.cpp index f3afb2a..d4a1599 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -434,6 +434,7 @@ void Controller::slotDeleteSelectedEntries() { int ret = KMessageBox::warningContinueCancel(Kernel::self()->widget(), str, i18n("Delete Entry"), KGuiItem(i18n("&Delete"), TQString::fromLatin1("editdelete")), dontAsk); if(ret != KMessageBox::Continue) { + m_working = false; return; } } else { @@ -448,6 +449,7 @@ void Controller::slotDeleteSelectedEntries() { i18n("Delete Multiple Entries"), KGuiItem(i18n("&Delete"), TQString::fromLatin1("editdelete")), dontAsk); if(ret != KMessageBox::Continue) { + m_working = false; return; } } diff --git a/src/core/Makefile.am b/src/core/Makefile.am index 15fc0df..01bf5a8 100644 --- a/src/core/Makefile.am +++ b/src/core/Makefile.am @@ -17,6 +17,8 @@ drophandler.h drophandler.cpp \ tellico-rename.upd tellico.upd \ tellico-1-3-update.pl +dcopinterface_DCOPIDLNG = ALL + kde_kcfg_DATA = tellico_config.kcfg updatedir = $(kde_datadir)/tdeconf_update diff --git a/src/core/dcopinterface_skel.cpp b/src/core/dcopinterface_skel.cpp index 8de56bf..4e819ed 100644 --- a/src/core/dcopinterface_skel.cpp +++ b/src/core/dcopinterface_skel.cpp @@ -25,11 +25,11 @@ static const char* const ApplicationInterface_ftable[16][3] = { { "bool", "exportHTML(TQString)", "exportHTML(TQString file)" }, { "bool", "exportCSV(TQString)", "exportCSV(TQString file)" }, { "bool", "exportPilotDB(TQString)", "exportPilotDB(TQString file)" }, - { "TQValueList", "selectedEntries()", "selectedEntries()" }, - { "TQValueList", "filteredEntries()", "filteredEntries()" }, + { "TQValueList", "selectedEntries()", "selectedEntries()" }, + { "TQValueList", "filteredEntries()", "filteredEntries()" }, { "void", "openFile(TQString)", "openFile(TQString file)" }, { "void", "setFilter(TQString)", "setFilter(TQString text)" }, - { "bool", "showEntry(long int)", "showEntry(long int id)" }, + { "bool", "showEntry(long)", "showEntry(long id)" }, { 0, 0, 0 } }; static const int ApplicationInterface_ftable_hiddens[15] = { @@ -162,12 +162,12 @@ bool ApplicationInterface::process(const TQCString &fun, const TQByteArray &data TQDataStream _replyStream( replyData, IO_WriteOnly ); _replyStream << exportPilotDB(arg0 ); } break; - case 10: { // TQValueList selectedEntries() + case 10: { // TQValueList selectedEntries() replyType = ApplicationInterface_ftable[10][0]; TQDataStream _replyStream( replyData, IO_WriteOnly ); _replyStream << selectedEntries( ); } break; - case 11: { // TQValueList filteredEntries() + case 11: { // TQValueList filteredEntries() replyType = ApplicationInterface_ftable[11][0]; TQDataStream _replyStream( replyData, IO_WriteOnly ); _replyStream << filteredEntries( ); @@ -188,8 +188,8 @@ bool ApplicationInterface::process(const TQCString &fun, const TQByteArray &data replyType = ApplicationInterface_ftable[13][0]; setFilter(arg0 ); } break; - case 14: { // bool showEntry(long int) - long int arg0; + case 14: { // bool showEntry(long) + long arg0; TQDataStream arg( data, IO_ReadOnly ); if (arg.atEnd()) return false; arg >> arg0; @@ -233,14 +233,14 @@ namespace Tellico { static const int CollectionInterface_fhash = 11; static const char* const CollectionInterface_ftable[9][3] = { - { "long int", "addEntry()", "addEntry()" }, - { "bool", "removeEntry(long int)", "removeEntry(long int entryID)" }, + { "long", "addEntry()", "addEntry()" }, + { "bool", "removeEntry(long)", "removeEntry(long entryID)" }, { TQSTRINGLIST_OBJECT_NAME_STRING, "values(TQString)", "values(TQString fieldName)" }, - { TQSTRINGLIST_OBJECT_NAME_STRING, "values(long int,TQString)", "values(long int entryID,TQString fieldName)" }, + { TQSTRINGLIST_OBJECT_NAME_STRING, "values(long,TQString)", "values(long entryID,TQString fieldName)" }, { TQSTRINGLIST_OBJECT_NAME_STRING, "bibtexKeys()", "bibtexKeys()" }, - { TQSTRING_OBJECT_NAME_STRING, "bibtexKey(long int)", "bibtexKey(long int entryID)" }, - { "bool", "setFieldValue(long int,TQString,TQString)", "setFieldValue(long int entryID,TQString fieldName,TQString value)" }, - { "bool", "addFieldValue(long int,TQString,TQString)", "addFieldValue(long int entryID,TQString fieldName,TQString value)" }, + { TQSTRING_OBJECT_NAME_STRING, "bibtexKey(long)", "bibtexKey(long entryID)" }, + { "bool", "setFieldValue(long,TQString,TQString)", "setFieldValue(long entryID,TQString fieldName,TQString value)" }, + { "bool", "addFieldValue(long,TQString,TQString)", "addFieldValue(long entryID,TQString fieldName,TQString value)" }, { 0, 0, 0 } }; static const int CollectionInterface_ftable_hiddens[8] = { @@ -264,13 +264,13 @@ bool CollectionInterface::process(const TQCString &fun, const TQByteArray &data, } int* fp = fdict->find( fun ); switch ( fp?*fp:-1) { - case 0: { // long int addEntry() + case 0: { // long addEntry() replyType = CollectionInterface_ftable[0][0]; TQDataStream _replyStream( replyData, IO_WriteOnly ); _replyStream << addEntry( ); } break; - case 1: { // bool removeEntry(long int) - long int arg0; + case 1: { // bool removeEntry(long) + long arg0; TQDataStream arg( data, IO_ReadOnly ); if (arg.atEnd()) return false; arg >> arg0; @@ -287,8 +287,8 @@ bool CollectionInterface::process(const TQCString &fun, const TQByteArray &data, TQDataStream _replyStream( replyData, IO_WriteOnly ); _replyStream << values(arg0 ); } break; - case 3: { // TQStringList values(long int,TQString) - long int arg0; + case 3: { // TQStringList values(long,TQString) + long arg0; TQString arg1; TQDataStream arg( data, IO_ReadOnly ); if (arg.atEnd()) return false; @@ -304,8 +304,8 @@ bool CollectionInterface::process(const TQCString &fun, const TQByteArray &data, TQDataStream _replyStream( replyData, IO_WriteOnly ); _replyStream << bibtexKeys( ); } break; - case 5: { // TQString bibtexKey(long int) - long int arg0; + case 5: { // TQString bibtexKey(long) + long arg0; TQDataStream arg( data, IO_ReadOnly ); if (arg.atEnd()) return false; arg >> arg0; @@ -313,8 +313,8 @@ bool CollectionInterface::process(const TQCString &fun, const TQByteArray &data, TQDataStream _replyStream( replyData, IO_WriteOnly ); _replyStream << bibtexKey(arg0 ); } break; - case 6: { // bool setFieldValue(long int,TQString,TQString) - long int arg0; + case 6: { // bool setFieldValue(long,TQString,TQString) + long arg0; TQString arg1; TQString arg2; TQDataStream arg( data, IO_ReadOnly ); @@ -328,8 +328,8 @@ bool CollectionInterface::process(const TQCString &fun, const TQByteArray &data, TQDataStream _replyStream( replyData, IO_WriteOnly ); _replyStream << setFieldValue(arg0, arg1, arg2 ); } break; - case 7: { // bool addFieldValue(long int,TQString,TQString) - long int arg0; + case 7: { // bool addFieldValue(long,TQString,TQString) + long arg0; TQString arg1; TQString arg2; TQDataStream arg( data, IO_ReadOnly ); diff --git a/src/core/drophandler.cpp b/src/core/drophandler.cpp index e609e7b..8d4875d 100644 --- a/src/core/drophandler.cpp +++ b/src/core/drophandler.cpp @@ -15,9 +15,13 @@ #include "../mainwindow.h" #include "../tellico_kernel.h" #include "../tellico_debug.h" +#include "../translators/bibteximporter.h" +#include "../translators/risimporter.h" #include #include +#include +#include using Tellico::DropHandler; @@ -62,18 +66,37 @@ bool DropHandler::handleURL(const KURL::List& urls_) { bool hasUnknown = false; KURL::List tc, pdf, bib, ris; for(KURL::List::ConstIterator it = urls_.begin(); it != urls_.end(); ++it) { - KMimeType::Ptr ptr = KMimeType::findByURL(*it); + const KURL& url = *it; + KMimeType::Ptr ptr; + // findByURL doesn't work for http, so actually query + // the url itself + if(url.protocol() != TQString::fromLatin1("http")) { + ptr = KMimeType::findByURL(url); + } else { + TDEIO::MimetypeJob* job = TDEIO::mimetype(url, false /*progress*/); + TDEIO::NetAccess::synchronousRun(job, Kernel::self()->widget()); + ptr = KMimeType::mimeType(job->mimetype()); + } if(ptr->is(TQString::fromLatin1("application/x-tellico"))) { - tc << *it; + tc << url; } else if(ptr->is(TQString::fromLatin1("application/pdf"))) { - pdf << *it; + pdf << url; } else if(ptr->is(TQString::fromLatin1("text/x-bibtex")) || - ptr->is(TQString::fromLatin1("application/x-bibtex"))) { - bib << *it; + ptr->is(TQString::fromLatin1("application/x-bibtex")) || + ptr->is(TQString::fromLatin1("application/bibtex"))) { + bib << url; } else if(ptr->is(TQString::fromLatin1("application/x-research-info-systems"))) { - ris << *it; + ris << url; + } else if(url.fileName().endsWith(TQString::fromLatin1(".bib"))) { + bib << url; + } else if(url.fileName().endsWith(TQString::fromLatin1(".ris"))) { + ris << url; + } else if(ptr->is(TQString::fromLatin1("text/plain")) && Import::BibtexImporter::maybeBibtex(url)) { + bib << url; + } else if(ptr->is(TQString::fromLatin1("text/plain")) && Import::RISImporter::maybeRIS(url)) { + ris << url; } else { - myDebug() << "DropHandler::handleURL() - unrecognized type: " << ptr->name() << " (" << *it << ")" << endl; + myDebug() << "DropHandler::handleURL() - unrecognized type: " << ptr->name() << " (" << url << ")" << endl; hasUnknown = true; } } diff --git a/src/document.cpp b/src/document.cpp index 40a38dd..97a5c5a 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -15,6 +15,7 @@ #include "mainwindow.h" // needed for calling fileSave() #include "collectionfactory.h" #include "translators/tellicoimporter.h" +#include "translators/tellicosaximporter.h" #include "translators/tellicozipexporter.h" #include "translators/tellicoxmlexporter.h" #include "collection.h" @@ -109,7 +110,12 @@ bool Document::openDocument(const KURL& url_) { } delete m_importer; +#ifdef SAX_SUPPORT + myLog() << "Document::openDocument() - using SAX loader" << endl; + m_importer = new Import::TellicoSaxImporter(url_, m_loadAllImages); +#else m_importer = new Import::TellicoImporter(url_, m_loadAllImages); +#endif CollPtr coll = m_importer->collection(); // delayed image loading only works for zip files @@ -146,6 +152,8 @@ bool Document::openDocument(const KURL& url_) { TQTimer::singleShot(500, this, TQT_SLOT(slotLoadAllImages())); } else { emit signalCollectionImagesLoaded(m_coll); + m_importer->deleteLater(); + m_importer = 0; } return true; } diff --git a/src/document.h b/src/document.h index b270be6..6d3e99e 100644 --- a/src/document.h +++ b/src/document.h @@ -27,6 +27,7 @@ namespace Tellico { namespace Import { class TellicoImporter; + class TellicoSaxImporter; } namespace Data { @@ -227,7 +228,11 @@ private: bool m_loadAllImages : 1; KURL m_url; bool m_validFile : 1; +#ifdef SAX_SUPPORT + TQGuardedPtr m_importer; +#else TQGuardedPtr m_importer; +#endif bool m_cancelImageWriting : 1; int m_fileFormat; bool m_allImagesOnDisk : 1; diff --git a/src/entry.cpp b/src/entry.cpp index fc97354..a1274db 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -252,8 +252,13 @@ bool Entry::setField(const TQString& name_, const TQString& value_) { } // the string store is probable only useful for fields with auto-completion or choice/number/bool + bool shareType = f->type() == Field::Choice || + f->type() == Field::Bool || + f->type() == Field::Image || + f->type() == Field::Rating || + f->type() == Field::Number; if(!(f->flags() & Field::AllowMultiple) && - ((f->type() == Field::Choice || f->type() == Field::Bool || f->type() == Field::Number) || + (shareType || (f->type() == Field::Line && (f->flags() & Field::AllowCompletion)))) { m_fields.insert(Tellico::shareString(name_), Tellico::shareString(value_)); } else { @@ -415,6 +420,16 @@ int Entry::compareValues(EntryPtr e1, EntryPtr e2, FieldPtr f) { if(f->name() == Latin1Literal("lccn") && LCCNValidator::formalize(s1) == LCCNValidator::formalize(s2)) { return 5; } + if(f->name() == Latin1Literal("arxiv")) { + // normalize and unVersion arxiv ID + s1.remove(TQRegExp(TQString::fromLatin1("^arxiv:"), false)); + s1.remove(TQRegExp(TQString::fromLatin1("v\\d+$"))); + s2.remove(TQRegExp(TQString::fromLatin1("^arxiv:"), false)); + s2.remove(TQRegExp(TQString::fromLatin1("v\\d+$"))); + if(s1 == s2) { + return 5; + } + } if(f->formatFlag() == Field::FormatName) { s1 = e1->field(f, true).lower(); s2 = e2->field(f, true).lower(); diff --git a/src/entry.h b/src/entry.h index 92bda7c..de1ba66 100644 --- a/src/entry.h +++ b/src/entry.h @@ -84,11 +84,6 @@ public: * The assignment operator is overloaded, since the id must be different. */ Entry& operator=(const Entry& other); - /** - * two entries are equal if all their field values are equal, except for - * file catalogs which match on the url only - */ - bool operator==(const Entry& other); ~Entry(); @@ -231,6 +226,12 @@ public: static TQString dependentValue(ConstEntryPtr e, const TQString& formatString, bool formatted); private: + /** + * two entries are equal if all their field values are equal, except for + * file catalogs which match on the url only + */ + bool operator==(const Entry& other); + CollPtr m_coll; long m_id; StringMap m_fields; diff --git a/src/entrygroupitem.cpp b/src/entrygroupitem.cpp index 3d08169..3ddf6c1 100644 --- a/src/entrygroupitem.cpp +++ b/src/entrygroupitem.cpp @@ -131,7 +131,7 @@ TQString EntryGroupItem::key(int col_, bool) const { return m_key; } -int EntryGroupItem::count() const { +size_t EntryGroupItem::count() const { return m_group ? m_group->count() : GUI::CountedItem::count(); } diff --git a/src/entrygroupitem.h b/src/entrygroupitem.h index 68e9fd5..4531e95 100644 --- a/src/entrygroupitem.h +++ b/src/entrygroupitem.h @@ -51,7 +51,7 @@ public: */ virtual TQString key(int col, bool) const; - virtual int count() const; + virtual size_t count() const; virtual Data::EntryVec entries() const; private: diff --git a/src/entryview.cpp b/src/entryview.cpp index ab61616..66ad116 100644 --- a/src/entryview.cpp +++ b/src/entryview.cpp @@ -26,6 +26,7 @@ #include "document.h" #include "latin1literal.h" #include "../core/drophandler.h" +#include "../tellico_debug.h" #include #include @@ -37,10 +38,22 @@ #include #include +#include using Tellico::EntryView; +using Tellico::EntryViewWidget; -EntryView::EntryView(TQWidget* parent_, const char* name_) : TDEHTMLPart(parent_, name_), +EntryViewWidget::EntryViewWidget(TDEHTMLPart* part, TQWidget* parent) + : TDEHTMLView(part, parent) {} + +// for the life of me, I could not figure out how to call the actual +// TDEHTMLPartBrowserExtension::copy() slot, so this will have to do +void EntryViewWidget::copy() { + TQString text = part()->selectedText(); + TQApplication::clipboard()->setText(text, TQClipboard::Clipboard); +} + +EntryView::EntryView(TQWidget* parent_, const char* name_) : TDEHTMLPart(new EntryViewWidget(this, parent_), parent_, name_), m_entry(0), m_handler(0), m_run(0), m_tempFile(0), m_useGradientImages(true), m_checkCommonFile(true) { setJScriptEnabled(false); setJavaEnabled(false); diff --git a/src/entryview.h b/src/entryview.h index 2ddc7e7..b5dc3a3 100644 --- a/src/entryview.h +++ b/src/entryview.h @@ -20,6 +20,7 @@ class KTempFile; #include "datavectors.h" #include +#include #include @@ -103,5 +104,15 @@ private: bool m_checkCommonFile : 1; }; +// stupid naming on my part, I need to subclass the view to +// add a slot. EntryView is really a part though +class EntryViewWidget : public TDEHTMLView { +Q_OBJECT +public: + EntryViewWidget(TDEHTMLPart* part, TQWidget* parent); +public slots: + void copy(); +}; + } //end namespace #endif diff --git a/src/fetch/Makefile.am b/src/fetch/Makefile.am index 017ef60..2f56fa5 100644 --- a/src/fetch/Makefile.am +++ b/src/fetch/Makefile.am @@ -10,7 +10,7 @@ libfetch_a_SOURCES = amazonfetcher.cpp animenfofetcher.cpp arxivfetcher.cpp \ discogsfetcher.cpp entrezfetcher.cpp execexternalfetcher.cpp fetcher.cpp fetchmanager.cpp \ gcstarpluginfetcher.cpp googlescholarfetcher.cpp ibsfetcher.cpp imdbfetcher.cpp \ isbndbfetcher.cpp messagehandler.cpp srufetcher.cpp yahoofetcher.cpp z3950connection.cpp \ - z3950fetcher.cpp + z3950fetcher.cpp amazonrequest.cpp hmac_sha2.c sha2.c ####### tdevelop will overwrite this part!!! (end)############ @@ -40,6 +40,8 @@ citebasefetcher.h citebasefetcher.cpp \ bibsonomyfetcher.h bibsonomyfetcher.cpp \ googlescholarfetcher.h googlescholarfetcher.cpp \ discogsfetcher.h discogsfetcher.cpp \ +amazonrequest.h amazonrequest.cpp \ +hmac_sha2.h hmac_sha2.c sha2.h sha2.c \ z3950-servers.cfg appdir = $(kde_datadir)/tellico diff --git a/src/fetch/amazonfetcher.cpp b/src/fetch/amazonfetcher.cpp index 9088643..1cb6b0c 100644 --- a/src/fetch/amazonfetcher.cpp +++ b/src/fetch/amazonfetcher.cpp @@ -12,6 +12,7 @@ ***************************************************************************/ #include "amazonfetcher.h" +#include "amazonrequest.h" #include "messagehandler.h" #include "../translators/xslthandler.h" #include "../translators/tellicoimporter.h" @@ -47,7 +48,6 @@ namespace { static const int AMAZON_RETURNS_PER_REQUEST = 10; static const int AMAZON_MAX_RETURNS_TOTAL = 20; - static const char* AMAZON_ACCESS_KEY = "0834VQ4S71KYPVSYQD02"; static const char* AMAZON_ASSOC_TOKEN = "tellico-20"; // need to have these in the translation file static const char* linkText = I18N_NOOP("Amazon Link"); @@ -84,7 +84,6 @@ const AmazonFetcher::SiteData& AmazonFetcher::siteData(int site_) { AmazonFetcher::AmazonFetcher(Site site_, TQObject* parent_, const char* name_) : Fetcher(parent_, name_), m_xsltHandler(0), m_site(site_), m_imageSize(MediumImage), - m_access(TQString::fromLatin1(AMAZON_ACCESS_KEY)), m_assoc(TQString::fromLatin1(AMAZON_ASSOC_TOKEN)), m_addLinkField(true), m_limit(AMAZON_MAX_RETURNS_TOTAL), m_countOffset(0), m_page(1), m_total(-1), m_numResults(0), m_job(0), m_started(false) { m_name = siteData(site_).title; @@ -109,7 +108,8 @@ bool AmazonFetcher::canFetch(int type) const { || type == Data::Collection::Bibtex || type == Data::Collection::Album || type == Data::Collection::Video - || type == Data::Collection::Game; + || type == Data::Collection::Game + || type == Data::Collection::BoardGame; } void AmazonFetcher::readConfigHook(const TDEConfigGroup& config_) { @@ -117,6 +117,10 @@ void AmazonFetcher::readConfigHook(const TDEConfigGroup& config_) { if(!s.isEmpty()) { m_access = s; } + s = config_.readEntry("SecretKey"); + if(!s.isEmpty()) { + m_amazonKey = s; + } s = config_.readEntry("AssocToken"); if(!s.isEmpty()) { m_assoc = s; @@ -152,35 +156,41 @@ void AmazonFetcher::doSearch() { // myDebug() << "AmazonFetcher::doSearch() - getting page " << m_page << endl; const SiteData& data = siteData(m_site); - KURL u = data.url; - u.addQueryItem(TQString::fromLatin1("Service"), TQString::fromLatin1("AWSECommerceService")); - u.addQueryItem(TQString::fromLatin1("AssociateTag"), m_assoc); - u.addQueryItem(TQString::fromLatin1("AWSAccessKeyId"), m_access); - u.addQueryItem(TQString::fromLatin1("Operation"), TQString::fromLatin1("ItemSearch")); - u.addQueryItem(TQString::fromLatin1("ResponseGroup"), TQString::fromLatin1("Large")); - u.addQueryItem(TQString::fromLatin1("ItemPage"), TQString::number(m_page)); - u.addQueryItem(TQString::fromLatin1("Version"), TQString::fromLatin1("2007-10-29")); + + TQMap params; + params.insert(TQString::fromLatin1("Service"), TQString::fromLatin1("AWSECommerceService")); + params.insert(TQString::fromLatin1("AssociateTag"), m_assoc); + params.insert(TQString::fromLatin1("AWSAccessKeyId"), m_access); + params.insert(TQString::fromLatin1("Operation"), TQString::fromLatin1("ItemSearch")); + params.insert(TQString::fromLatin1("ResponseGroup"), TQString::fromLatin1("Large")); + params.insert(TQString::fromLatin1("ItemPage"), TQString::number(m_page)); + params.insert(TQString::fromLatin1("Version"), TQString::fromLatin1("2007-10-29")); const int type = Kernel::self()->collectionType(); switch(type) { case Data::Collection::Book: case Data::Collection::ComicBook: case Data::Collection::Bibtex: - u.addQueryItem(TQString::fromLatin1("SearchIndex"), TQString::fromLatin1("Books")); - u.addQueryItem(TQString::fromLatin1("SortIndex"), TQString::fromLatin1("relevancerank")); + params.insert(TQString::fromLatin1("SearchIndex"), TQString::fromLatin1("Books")); + params.insert(TQString::fromLatin1("SortIndex"), TQString::fromLatin1("relevancerank")); break; case Data::Collection::Album: - u.addQueryItem(TQString::fromLatin1("SearchIndex"), TQString::fromLatin1("Music")); + params.insert(TQString::fromLatin1("SearchIndex"), TQString::fromLatin1("Music")); break; case Data::Collection::Video: - u.addQueryItem(TQString::fromLatin1("SearchIndex"), TQString::fromLatin1("Video")); - u.addQueryItem(TQString::fromLatin1("SortIndex"), TQString::fromLatin1("relevancerank")); + params.insert(TQString::fromLatin1("SearchIndex"), TQString::fromLatin1("Video")); + params.insert(TQString::fromLatin1("SortIndex"), TQString::fromLatin1("relevancerank")); break; case Data::Collection::Game: - u.addQueryItem(TQString::fromLatin1("SearchIndex"), TQString::fromLatin1("VideoGames")); + params.insert(TQString::fromLatin1("SearchIndex"), TQString::fromLatin1("VideoGames")); + break; + + case Data::Collection::BoardGame: + params.insert(TQString::fromLatin1("SearchIndex"), TQString::fromLatin1("Toys")); + params.insert(TQString::fromLatin1("SortIndex"), TQString::fromLatin1("relevancerank")); break; case Data::Collection::Coin: @@ -188,7 +198,6 @@ void AmazonFetcher::doSearch() { case Data::Collection::Wine: case Data::Collection::Base: case Data::Collection::Card: - default: message(i18n("%1 does not allow searching for this collection type.").arg(source()), MessageHandler::Warning); stop(); return; @@ -207,29 +216,28 @@ void AmazonFetcher::doSearch() { switch(m_key) { case Title: - u.addQueryItem(TQString::fromLatin1("Title"), value, mib); + params.insert(TQString::fromLatin1("Title"), value); break; case Person: if(type == Data::Collection::Video) { - u.addQueryItem(TQString::fromLatin1("Actor"), value, mib); - u.addQueryItem(TQString::fromLatin1("Director"), value, mib); + params.insert(TQString::fromLatin1("Actor"), value); + params.insert(TQString::fromLatin1("Director"), value); } else if(type == Data::Collection::Album) { - u.addQueryItem(TQString::fromLatin1("Artist"), value, mib); + params.insert(TQString::fromLatin1("Artist"), value); } else if(type == Data::Collection::Game) { - u.addQueryItem(TQString::fromLatin1("Manufacturer"), value, mib); + params.insert(TQString::fromLatin1("Manufacturer"), value); } else { // books and bibtex TQString s = TQString::fromLatin1("author:%1 or publisher:%2").arg(value, value); -// u.addQueryItem(TQString::fromLatin1("Author"), value, mib); -// u.addQueryItem(TQString::fromLatin1("Publisher"), value, mib); - u.addQueryItem(TQString::fromLatin1("Power"), s, mib); +// params.insert(TQString::fromLatin1("Author"), value, mib); +// params.insert(TQString::fromLatin1("Publisher"), value, mib); + params.insert(TQString::fromLatin1("Power"), s); } break; case ISBN: { - u.removeQueryItem(TQString::fromLatin1("Operation")); - u.addQueryItem(TQString::fromLatin1("Operation"), TQString::fromLatin1("ItemLookup")); + params.insert(TQString::fromLatin1("Operation"), TQString::fromLatin1("ItemLookup")); TQString s = m_value; // not encValue!!! s.remove('-'); @@ -260,47 +268,46 @@ void AmazonFetcher::doSearch() { } } // the default search is by ASIN, which prohibits SearchIndex - u.removeQueryItem(TQString::fromLatin1("SearchIndex")); + params.remove(TQString::fromLatin1("SearchIndex")); } // limit to first 10 while(isbns.size() > 10) { isbns.pop_back(); } - u.addQueryItem(TQString::fromLatin1("ItemId"), isbns.join(TQString::fromLatin1(","))); + params.insert(TQString::fromLatin1("ItemId"), isbns.join(TQString::fromLatin1(","))); if(isbn13) { - u.addQueryItem(TQString::fromLatin1("IdType"), TQString::fromLatin1("EAN")); + params.insert(TQString::fromLatin1("IdType"), TQString::fromLatin1("EAN")); } } break; case UPC: { - u.removeQueryItem(TQString::fromLatin1("Operation")); - u.addQueryItem(TQString::fromLatin1("Operation"), TQString::fromLatin1("ItemLookup")); + params.insert(TQString::fromLatin1("Operation"), TQString::fromLatin1("ItemLookup")); // US allows UPC, all others are EAN if(m_site == US) { - u.addQueryItem(TQString::fromLatin1("IdType"), TQString::fromLatin1("UPC")); + params.insert(TQString::fromLatin1("IdType"), TQString::fromLatin1("UPC")); } else { - u.addQueryItem(TQString::fromLatin1("IdType"), TQString::fromLatin1("EAN")); + params.insert(TQString::fromLatin1("IdType"), TQString::fromLatin1("EAN")); } TQString s = m_value; // not encValue!!! s.remove('-'); // limit to first 10 s.replace(TQString::fromLatin1("; "), TQString::fromLatin1(",")); s = s.section(',', 0, 9); - u.addQueryItem(TQString::fromLatin1("ItemId"), s); + params.insert(TQString::fromLatin1("ItemId"), s); } break; case Keyword: - u.addQueryItem(TQString::fromLatin1("Keywords"), m_value, mib); + params.insert(TQString::fromLatin1("Keywords"), value); break; case Raw: { TQString key = value.section('=', 0, 0).stripWhiteSpace(); TQString str = value.section('=', 1).stripWhiteSpace(); - u.addQueryItem(key, str, mib); + params.insert(key, str); } break; @@ -309,9 +316,11 @@ void AmazonFetcher::doSearch() { stop(); return; } -// myDebug() << "AmazonFetcher::search() - url: " << u.url() << endl; + AmazonRequest request(siteData(m_site).url, m_amazonKey); + KURL newUrl = request.signedRequest(params); +// myDebug() << "AmazonFetcher::search() - url: " << newUrl.url() << endl; - m_job = TDEIO::get(u, false, false); + m_job = TDEIO::get(newUrl, false, false); connect(m_job, TQT_SIGNAL(data(TDEIO::Job*, const TQByteArray&)), TQT_SLOT(slotData(TDEIO::Job*, const TQByteArray&))); connect(m_job, TQT_SIGNAL(result(TDEIO::Job*)), @@ -520,6 +529,12 @@ void AmazonFetcher::slotComplete(TDEIO::Job* job_) { + entry->field(TQString::fromLatin1("year")); break; + case Data::Collection::BoardGame: + desc = entry->field(TQString::fromLatin1("publisher")) + + TQChar('/') + + entry->field(TQString::fromLatin1("year")); + break; + default: break; } @@ -889,11 +904,25 @@ AmazonFetcher::ConfigWidget::ConfigWidget(TQWidget* parent_, const AmazonFetcher TQWhatsThis::add(m_assocEdit, w); label->setBuddy(m_assocEdit); + label = new TQLabel(i18n("Access key: "), optionsWidget()); + l->addWidget(label, ++row, 0); + m_accessEdit = new KLineEdit(optionsWidget()); + connect(m_accessEdit, SIGNAL(textChanged(const TQString&)), SLOT(slotSetModified())); + l->addWidget(m_accessEdit, row, 1); + + label = new TQLabel(i18n("Secret Key: "), optionsWidget()); + l->addWidget(label, ++row, 0); + m_secretKeyEdit = new KLineEdit(optionsWidget()); + connect(m_secretKeyEdit, SIGNAL(textChanged(const TQString&)), SLOT(slotSetModified())); + l->addWidget(m_secretKeyEdit, row, 1); + l->setRowStretch(++row, 10); if(fetcher_) { m_siteCombo->setCurrentData(fetcher_->m_site); m_assocEdit->setText(fetcher_->m_assoc); + m_accessEdit->setText(fetcher_->m_access); + m_secretKeyEdit->setText(fetcher_->m_amazonKey); m_imageCombo->setCurrentData(fetcher_->m_imageSize); } else { // defaults m_assocEdit->setText(TQString::fromLatin1(AMAZON_ASSOC_TOKEN)); @@ -912,6 +941,14 @@ void AmazonFetcher::ConfigWidget::saveConfig(TDEConfigGroup& config_) { if(!s.isEmpty()) { config_.writeEntry("AssocToken", s); } + s = m_accessEdit->text().stripWhiteSpace(); + if(!s.isEmpty()) { + config_.writeEntry("AccessKey", s); + } + s = m_secretKeyEdit->text().stripWhiteSpace(); + if(!s.isEmpty()) { + config_.writeEntry("SecretKey", s); + } n = m_imageCombo->currentData().toInt(); config_.writeEntry("Image Size", n); diff --git a/src/fetch/amazonfetcher.h b/src/fetch/amazonfetcher.h index 03aed7d..8628b2c 100644 --- a/src/fetch/amazonfetcher.h +++ b/src/fetch/amazonfetcher.h @@ -118,6 +118,7 @@ private: ImageSize m_imageSize; TQString m_access; + TQString m_amazonKey; TQString m_assoc; bool m_addLinkField; int m_limit; @@ -151,6 +152,8 @@ private slots: private: KLineEdit* m_assocEdit; + KLineEdit* m_accessEdit; + KLineEdit* m_secretKeyEdit; GUI::ComboBox* m_siteCombo; GUI::ComboBox* m_imageCombo; }; diff --git a/src/fetch/amazonrequest.cpp b/src/fetch/amazonrequest.cpp new file mode 100644 index 0000000..bb8d729 --- /dev/null +++ b/src/fetch/amazonrequest.cpp @@ -0,0 +1,72 @@ +/*************************************************************************** + Copyright (C) 2007-2009 Robby Stephenson + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 2 of * + * the License or (at your option) version 3 or any later version * + * accepted by the membership of KDE e.V. (or its successor approved * + * by the membership of KDE e.V.), which shall act as a proxy * + * defined in Section 14 of version 3 of the license. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ***************************************************************************/ + +#include "amazonrequest.h" +#include "hmac_sha2.h" +#include "../tellico_debug.h" + +#include + +#include + +using Tellico::Fetch::AmazonRequest; + +AmazonRequest::AmazonRequest(const KURL& site_, const TQString& key_) : m_siteUrl(site_), m_key(key_) { +} + +KURL AmazonRequest::signedRequest(const TQMap& params_) const { + TQMap allParams = params_; + allParams.insert(TQString::fromLatin1("Timestamp"), + TQDateTime::currentDateTime(TQt::UTC).toString(TQt::ISODate)); + + TQString query; + // has to be a map so that the query elements are sorted + TQMap::Iterator it; + for ( it = allParams.begin(); it != allParams.end(); ++it ) { + query += KURL::encode_string(it.key()); + query += '='; + query += KURL::encode_string(it.data()); + query += '&'; + } + // remove last '&' + query.truncate(query.length()-1); + + const TQCString toSign = "GET\n" + + m_siteUrl.host().utf8() + '\n' + + m_siteUrl.path().utf8() + '\n' + + query.latin1(); + + TQByteArray hmac_buffer; + hmac_buffer.fill('\0', SHA256_DIGEST_SIZE); + // subtract one from string size for toSign, not exactly sure why + hmac_sha256(reinterpret_cast(const_cast(m_key.latin1())), m_key.length(), + reinterpret_cast(toSign.data()), toSign.size()-1, + reinterpret_cast(hmac_buffer.data()), hmac_buffer.size()); + const TQString sig = KURL::encode_string(KCodecs::base64Encode(hmac_buffer)); +// myDebug() << sig << endl; + + KURL url = m_siteUrl; + url.setQuery(query + "&Signature=" + sig); + return url; +} diff --git a/src/fetch/amazonrequest.h b/src/fetch/amazonrequest.h new file mode 100644 index 0000000..d1d9017 --- /dev/null +++ b/src/fetch/amazonrequest.h @@ -0,0 +1,52 @@ +/*************************************************************************** + Copyright (C) 2007-2009 Robby Stephenson + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 2 of * + * the License or (at your option) version 3 or any later version * + * accepted by the membership of KDE e.V. (or its successor approved * + * by the membership of KDE e.V.), which shall act as a proxy * + * defined in Section 14 of version 3 of the license. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ***************************************************************************/ + +#ifndef TELLICO_FETCH_AMAZONREQUEST_H +#define TELLICO_FETCH_AMAZONREQUEST_H + +#include + +#include + +namespace Tellico { + namespace Fetch { + +/** + * @author Robby Stephenson + */ +class AmazonRequest { +public: + AmazonRequest(const KURL& site, const TQString& key); + + KURL signedRequest(const TQMap& params) const; + +private: + KURL m_siteUrl; + TQString m_key; +}; + + } // end Fetch namespace +} // end Tellico namespace + +#endif diff --git a/src/fetch/arxivfetcher.cpp b/src/fetch/arxivfetcher.cpp index f59d246..ec3f8fb 100644 --- a/src/fetch/arxivfetcher.cpp +++ b/src/fetch/arxivfetcher.cpp @@ -226,6 +226,13 @@ Tellico::Data::EntryPtr ArxivFetcher::fetchEntry(uint uid_) { } } } + TQRegExp versionRx(TQString::fromLatin1("v\\d+$")); + // if the original search was not for a versioned ID, remove it + if(m_key != ArxivID || !m_value.contains(versionRx)) { + TQString arxiv = entry->field(TQString::fromLatin1("arxiv")); + arxiv.remove(versionRx); + entry->setField(TQString::fromLatin1("arxiv"), arxiv); + } return entry; } diff --git a/src/fetch/citebasefetcher.cpp b/src/fetch/citebasefetcher.cpp index f5e8cd6..2b5a8db 100644 --- a/src/fetch/citebasefetcher.cpp +++ b/src/fetch/citebasefetcher.cpp @@ -163,7 +163,15 @@ void CitebaseFetcher::slotComplete(TDEIO::Job* job_) { } Tellico::Data::EntryPtr CitebaseFetcher::fetchEntry(uint uid_) { - return m_entries[uid_]; + Data::EntryPtr entry = m_entries[uid_]; + TQRegExp versionRx(TQString::fromLatin1("v\\d+$")); + // if the original search was not for a versioned ID, remove it + if(m_key != ArxivID || !m_value.contains(versionRx)) { + TQString arxiv = entry->field(TQString::fromLatin1("arxiv")); + arxiv.remove(versionRx); + entry->setField(TQString::fromLatin1("arxiv"), arxiv); + } + return entry; } KURL CitebaseFetcher::searchURL(FetchKey key_, const TQString& value_) const { diff --git a/src/fetch/entrezfetcher.cpp b/src/fetch/entrezfetcher.cpp index 07066b8..b1d2789 100644 --- a/src/fetch/entrezfetcher.cpp +++ b/src/fetch/entrezfetcher.cpp @@ -34,7 +34,7 @@ //#define ENTREZ_TEST namespace { - static const int ENTREZ_MAX_RETURNS_TOTAL = 25; + static const size_t ENTREZ_MAX_RETURNS_TOTAL = 25; static const char* ENTREZ_BASE_URL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/"; static const char* ENTREZ_SEARCH_CGI = "esearch.fcgi"; static const char* ENTREZ_SUMMARY_CGI = "esummary.fcgi"; diff --git a/src/fetch/entrezfetcher.h b/src/fetch/entrezfetcher.h index 87e13ae..7a9a0a1 100644 --- a/src/fetch/entrezfetcher.h +++ b/src/fetch/entrezfetcher.h @@ -92,8 +92,8 @@ private: XSLTHandler* m_xsltHandler; TQString m_dbname; - int m_start; - int m_total; + size_t m_start; + size_t m_total; TQByteArray m_data; TQMap m_entries; // map from search result id to entry diff --git a/src/fetch/googlescholarfetcher.cpp b/src/fetch/googlescholarfetcher.cpp index 19e69c6..8ac7d4d 100644 --- a/src/fetch/googlescholarfetcher.cpp +++ b/src/fetch/googlescholarfetcher.cpp @@ -28,7 +28,7 @@ #include namespace { - static const int GOOGLE_MAX_RETURNS_TOTAL = 20; + static const size_t GOOGLE_MAX_RETURNS_TOTAL = 20; static const char* SCHOLAR_BASE_URL = "http://scholar.google.com/scholar"; } @@ -157,7 +157,7 @@ void GoogleScholarFetcher::slotComplete(TDEIO::Job* job_) { TQString text = TQString::fromUtf8(m_data, m_data.size()); TQString bibtex; - int count = 0; + size_t count = 0; for(int pos = text.find(m_bibtexRx); count < m_limit && pos > -1; pos = text.find(m_bibtexRx, pos+m_bibtexRx.matchedLength()), ++count) { KURL bibtexUrl(TQString::fromLatin1(SCHOLAR_BASE_URL), m_bibtexRx.cap(1)); // myDebug() << bibtexUrl << endl; diff --git a/src/fetch/googlescholarfetcher.h b/src/fetch/googlescholarfetcher.h index 8ef91da..5c0b8a1 100644 --- a/src/fetch/googlescholarfetcher.h +++ b/src/fetch/googlescholarfetcher.h @@ -83,9 +83,9 @@ private slots: private: void doSearch(); - int m_limit; - int m_start; - int m_total; + size_t m_limit; + size_t m_start; + size_t m_total; TQByteArray m_data; TQMap m_entries; diff --git a/src/fetch/hmac_sha2.c b/src/fetch/hmac_sha2.c new file mode 100644 index 0000000..dd7c24a --- /dev/null +++ b/src/fetch/hmac_sha2.c @@ -0,0 +1,544 @@ +/*- + * HMAC-SHA-224/256/384/512 implementation + * Last update: 06/15/2005 + * Issue date: 06/15/2005 + * + * Copyright (C) 2005 Olivier Gay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include "hmac_sha2.h" + +/* HMAC-SHA-224 functions */ + +void hmac_sha224_init(hmac_sha224_ctx *ctx, unsigned char *key, + unsigned int key_size) +{ + unsigned int fill; + unsigned int num; + + unsigned char *key_used; + unsigned char key_temp[SHA224_DIGEST_SIZE]; + int i; + + if (key_size == SHA224_BLOCK_SIZE) { + key_used = key; + num = SHA224_BLOCK_SIZE; + } else { + if (key_size > SHA224_BLOCK_SIZE){ + key_used = key_temp; + num = SHA224_DIGEST_SIZE; + sha224(key, key_size, key_used); + } else { /* key_size > SHA224_BLOCK_SIZE */ + key_used = key; + num = key_size; + } + fill = SHA224_BLOCK_SIZE - num; + + memset(ctx->block_ipad + num, 0x36, fill); + memset(ctx->block_opad + num, 0x5c, fill); + } + + for (i = 0; i < num; i++) { + ctx->block_ipad[i] = key_used[i] ^ 0x36; + ctx->block_opad[i] = key_used[i] ^ 0x5c; + } + + sha224_init(&ctx->ctx_inside); + sha224_update(&ctx->ctx_inside, ctx->block_ipad, SHA224_BLOCK_SIZE); + + sha224_init(&ctx->ctx_outside); + sha224_update(&ctx->ctx_outside, ctx->block_opad, + SHA224_BLOCK_SIZE); + + /* for hmac_reinit */ + memcpy(&ctx->ctx_inside_reinit, &ctx->ctx_inside, + sizeof(sha224_ctx)); + memcpy(&ctx->ctx_outside_reinit, &ctx->ctx_outside, + sizeof(sha224_ctx)); +} + +void hmac_sha224_reinit(hmac_sha224_ctx *ctx) +{ + memcpy(&ctx->ctx_inside, &ctx->ctx_inside_reinit, + sizeof(sha224_ctx)); + memcpy(&ctx->ctx_outside, &ctx->ctx_outside_reinit, + sizeof(sha224_ctx)); +} + +void hmac_sha224_update(hmac_sha224_ctx *ctx, unsigned char *message, + unsigned int message_len) +{ + sha224_update(&ctx->ctx_inside, message, message_len); +} + +void hmac_sha224_final(hmac_sha224_ctx *ctx, unsigned char *mac, + unsigned int mac_size) +{ + unsigned char digest_inside[SHA224_DIGEST_SIZE]; + unsigned char mac_temp[SHA224_DIGEST_SIZE]; + + sha224_final(&ctx->ctx_inside, digest_inside); + sha224_update(&ctx->ctx_outside, digest_inside, SHA224_DIGEST_SIZE); + sha224_final(&ctx->ctx_outside, mac_temp); + memcpy(mac, mac_temp, mac_size); +} + +void hmac_sha224(unsigned char *key, unsigned int key_size, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size) +{ + hmac_sha224_ctx ctx; + + hmac_sha224_init(&ctx, key, key_size); + hmac_sha224_update(&ctx, message, message_len); + hmac_sha224_final(&ctx, mac, mac_size); +} + +/* HMAC-SHA-256 functions */ + +void hmac_sha256_init(hmac_sha256_ctx *ctx, unsigned char *key, + unsigned int key_size) +{ + unsigned int fill; + unsigned int num; + + unsigned char *key_used; + unsigned char key_temp[SHA256_DIGEST_SIZE]; + int i; + + if (key_size == SHA256_BLOCK_SIZE) { + key_used = key; + num = SHA256_BLOCK_SIZE; + } else { + if (key_size > SHA256_BLOCK_SIZE){ + key_used = key_temp; + num = SHA256_DIGEST_SIZE; + sha256(key, key_size, key_used); + } else { /* key_size > SHA256_BLOCK_SIZE */ + key_used = key; + num = key_size; + } + fill = SHA256_BLOCK_SIZE - num; + + memset(ctx->block_ipad + num, 0x36, fill); + memset(ctx->block_opad + num, 0x5c, fill); + } + + for (i = 0; i < num; i++) { + ctx->block_ipad[i] = key_used[i] ^ 0x36; + ctx->block_opad[i] = key_used[i] ^ 0x5c; + } + + sha256_init(&ctx->ctx_inside); + sha256_update(&ctx->ctx_inside, ctx->block_ipad, SHA256_BLOCK_SIZE); + + sha256_init(&ctx->ctx_outside); + sha256_update(&ctx->ctx_outside, ctx->block_opad, + SHA256_BLOCK_SIZE); + + /* for hmac_reinit */ + memcpy(&ctx->ctx_inside_reinit, &ctx->ctx_inside, + sizeof(sha256_ctx)); + memcpy(&ctx->ctx_outside_reinit, &ctx->ctx_outside, + sizeof(sha256_ctx)); +} + +void hmac_sha256_reinit(hmac_sha256_ctx *ctx) +{ + memcpy(&ctx->ctx_inside, &ctx->ctx_inside_reinit, + sizeof(sha256_ctx)); + memcpy(&ctx->ctx_outside, &ctx->ctx_outside_reinit, + sizeof(sha256_ctx)); +} + +void hmac_sha256_update(hmac_sha256_ctx *ctx, unsigned char *message, + unsigned int message_len) +{ + sha256_update(&ctx->ctx_inside, message, message_len); +} + +void hmac_sha256_final(hmac_sha256_ctx *ctx, unsigned char *mac, + unsigned int mac_size) +{ + unsigned char digest_inside[SHA256_DIGEST_SIZE]; + unsigned char mac_temp[SHA256_DIGEST_SIZE]; + + sha256_final(&ctx->ctx_inside, digest_inside); + sha256_update(&ctx->ctx_outside, digest_inside, SHA256_DIGEST_SIZE); + sha256_final(&ctx->ctx_outside, mac_temp); + memcpy(mac, mac_temp, mac_size); +} + +void hmac_sha256(unsigned char *key, unsigned int key_size, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size) +{ + hmac_sha256_ctx ctx; + + hmac_sha256_init(&ctx, key, key_size); + hmac_sha256_update(&ctx, message, message_len); + hmac_sha256_final(&ctx, mac, mac_size); +} + +/* HMAC-SHA-384 functions */ + +void hmac_sha384_init(hmac_sha384_ctx *ctx, unsigned char *key, + unsigned int key_size) +{ + unsigned int fill; + unsigned int num; + + unsigned char *key_used; + unsigned char key_temp[SHA384_DIGEST_SIZE]; + int i; + + if (key_size == SHA384_BLOCK_SIZE) { + key_used = key; + num = SHA384_BLOCK_SIZE; + } else { + if (key_size > SHA384_BLOCK_SIZE){ + key_used = key_temp; + num = SHA384_DIGEST_SIZE; + sha384(key, key_size, key_used); + } else { /* key_size > SHA384_BLOCK_SIZE */ + key_used = key; + num = key_size; + } + fill = SHA384_BLOCK_SIZE - num; + + memset(ctx->block_ipad + num, 0x36, fill); + memset(ctx->block_opad + num, 0x5c, fill); + } + + for (i = 0; i < num; i++) { + ctx->block_ipad[i] = key_used[i] ^ 0x36; + ctx->block_opad[i] = key_used[i] ^ 0x5c; + } + + sha384_init(&ctx->ctx_inside); + sha384_update(&ctx->ctx_inside, ctx->block_ipad, SHA384_BLOCK_SIZE); + + sha384_init(&ctx->ctx_outside); + sha384_update(&ctx->ctx_outside, ctx->block_opad, + SHA384_BLOCK_SIZE); + + /* for hmac_reinit */ + memcpy(&ctx->ctx_inside_reinit, &ctx->ctx_inside, + sizeof(sha384_ctx)); + memcpy(&ctx->ctx_outside_reinit, &ctx->ctx_outside, + sizeof(sha384_ctx)); +} + +void hmac_sha384_reinit(hmac_sha384_ctx *ctx) +{ + memcpy(&ctx->ctx_inside, &ctx->ctx_inside_reinit, + sizeof(sha384_ctx)); + memcpy(&ctx->ctx_outside, &ctx->ctx_outside_reinit, + sizeof(sha384_ctx)); +} + +void hmac_sha384_update(hmac_sha384_ctx *ctx, unsigned char *message, + unsigned int message_len) +{ + sha384_update(&ctx->ctx_inside, message, message_len); +} + +void hmac_sha384_final(hmac_sha384_ctx *ctx, unsigned char *mac, + unsigned int mac_size) +{ + unsigned char digest_inside[SHA384_DIGEST_SIZE]; + unsigned char mac_temp[SHA384_DIGEST_SIZE]; + + sha384_final(&ctx->ctx_inside, digest_inside); + sha384_update(&ctx->ctx_outside, digest_inside, SHA384_DIGEST_SIZE); + sha384_final(&ctx->ctx_outside, mac_temp); + memcpy(mac, mac_temp, mac_size); +} + +void hmac_sha384(unsigned char *key, unsigned int key_size, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size) +{ + hmac_sha384_ctx ctx; + + hmac_sha384_init(&ctx, key, key_size); + hmac_sha384_update(&ctx, message, message_len); + hmac_sha384_final(&ctx, mac, mac_size); +} + +/* HMAC-SHA-512 functions */ + +void hmac_sha512_init(hmac_sha512_ctx *ctx, unsigned char *key, + unsigned int key_size) +{ + unsigned int fill; + unsigned int num; + + unsigned char *key_used; + unsigned char key_temp[SHA512_DIGEST_SIZE]; + int i; + + if (key_size == SHA512_BLOCK_SIZE) { + key_used = key; + num = SHA512_BLOCK_SIZE; + } else { + if (key_size > SHA512_BLOCK_SIZE){ + key_used = key_temp; + num = SHA512_DIGEST_SIZE; + sha512(key, key_size, key_used); + } else { /* key_size > SHA512_BLOCK_SIZE */ + key_used = key; + num = key_size; + } + fill = SHA512_BLOCK_SIZE - num; + + memset(ctx->block_ipad + num, 0x36, fill); + memset(ctx->block_opad + num, 0x5c, fill); + } + + for (i = 0; i < num; i++) { + ctx->block_ipad[i] = key_used[i] ^ 0x36; + ctx->block_opad[i] = key_used[i] ^ 0x5c; + } + + sha512_init(&ctx->ctx_inside); + sha512_update(&ctx->ctx_inside, ctx->block_ipad, SHA512_BLOCK_SIZE); + + sha512_init(&ctx->ctx_outside); + sha512_update(&ctx->ctx_outside, ctx->block_opad, + SHA512_BLOCK_SIZE); + + /* for hmac_reinit */ + memcpy(&ctx->ctx_inside_reinit, &ctx->ctx_inside, + sizeof(sha512_ctx)); + memcpy(&ctx->ctx_outside_reinit, &ctx->ctx_outside, + sizeof(sha512_ctx)); +} + +void hmac_sha512_reinit(hmac_sha512_ctx *ctx) +{ + memcpy(&ctx->ctx_inside, &ctx->ctx_inside_reinit, + sizeof(sha512_ctx)); + memcpy(&ctx->ctx_outside, &ctx->ctx_outside_reinit, + sizeof(sha512_ctx)); +} + +void hmac_sha512_update(hmac_sha512_ctx *ctx, unsigned char *message, + unsigned int message_len) +{ + sha512_update(&ctx->ctx_inside, message, message_len); +} + +void hmac_sha512_final(hmac_sha512_ctx *ctx, unsigned char *mac, + unsigned int mac_size) +{ + unsigned char digest_inside[SHA512_DIGEST_SIZE]; + unsigned char mac_temp[SHA512_DIGEST_SIZE]; + + sha512_final(&ctx->ctx_inside, digest_inside); + sha512_update(&ctx->ctx_outside, digest_inside, SHA512_DIGEST_SIZE); + sha512_final(&ctx->ctx_outside, mac_temp); + memcpy(mac, mac_temp, mac_size); +} + +void hmac_sha512(unsigned char *key, unsigned int key_size, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size) +{ + hmac_sha512_ctx ctx; + + hmac_sha512_init(&ctx, key, key_size); + hmac_sha512_update(&ctx, message, message_len); + hmac_sha512_final(&ctx, mac, mac_size); +} + +#ifdef TEST_VECTORS + +/* IETF Validation tests */ + +#include +#include + +void test(unsigned char *vector, unsigned char *digest, + unsigned int digest_size) +{ + unsigned char output[2 * SHA512_DIGEST_SIZE + 1]; + int i; + + output[2 * digest_size] = '\0'; + + for (i = 0; i < digest_size ; i++) { + sprintf((char *) output + 2*i, "%02x", digest[i]); + } + + printf("H: %s\n", output); + if (strcmp((char *) vector, (char *) output)) { + fprintf(stderr, "Test failed.\n"); + exit(1); + } +} + +int main() +{ + static unsigned char *vectors[] = + { + /* HMAC-SHA-224 */ + "896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22", + "a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44", + "7fb3cb3588c6c1f6ffa9694d7d6ad2649365b0c1f65d69d1ec8333ea", + "6c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5a", + "0e2aea68a90c8d37c988bcdb9fca6fa8", + "95e9a0db962095adaebe9b2d6f0dbce2d499f112f2d2b7273fa6870e", + "3a854166ac5d9f023f54d517d0b39dbd946770db9c2b95c9f6f565d1", + /* HMAC-SHA-256 */ + "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7", + "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843", + "773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe", + "82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b", + "a3b6167473100ee06e0c796c2955552b", + "60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54", + "9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2", + /* HMAC-SHA-384 */ + "afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c7cebc59c" + "faea9ea9076ede7f4af152e8b2fa9cb6", + "af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e" + "8e2240ca5e69e2c78b3239ecfab21649", + "88062608d3e6ad8a0aa2ace014c8a86f0aa635d947ac9febe83ef4e55966144b" + "2a5ab39dc13814b94e3ab6e101a34f27", + "3e8a69b7783c25851933ab6290af6ca77a9981480850009cc5577c6e1f573b4e" + "6801dd23c4a7d679ccf8a386c674cffb", + "3abf34c3503b2a23a46efc619baef897", + "4ece084485813e9088d2c63a041bc5b44f9ef1012a2b588f3cd11f05033ac4c6" + "0c2ef6ab4030fe8296248df163f44952", + "6617178e941f020d351e2f254e8fd32c602420feb0b8fb9adccebb82461e99c5" + "a678cc31e799176d3860e6110c46523e", + /* HMAC-SHA-512 */ + "87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cde" + "daa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854", + "164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea250554" + "9758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737", + "fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39" + "bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fb", + "b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3db" + "a91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dd", + "415fad6271580a531d4179bc891d87a6", + "80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b013783f8f352" + "6b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec8b915a985d786598", + "e37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d20cdc944" + "b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58" + }; + + static unsigned char *messages[] = + { + "Hi There", + "what do ya want for nothing?", + NULL, + NULL, + "Test With Truncation", + "Test Using Larger Than Block-Size Key - Hash Key First", + "This is a test using a larger than block-size key " + "and a larger than block-size data. The key needs" + " to be hashed before being used by the HMAC algorithm." + }; + + unsigned char mac[SHA512_DIGEST_SIZE]; + unsigned char *keys[7]; + unsigned int keys_len[7] = {20, 4, 20, 25, 20, 131, 131}; + unsigned int messages2and3_len = 50; + unsigned int mac_224_size, mac_256_size, mac_384_size, mac_512_size; + int i; + + for (i = 0; i < 7; i++) { + keys[i] = malloc(keys_len[i]); + if (keys[i] == NULL) { + fprintf(stderr, "Can't allocate memory\n"); + return 1; + } + } + + memset(keys[0], 0x0b, keys_len[0]); + strcpy(keys[1], "Jefe"); + memset(keys[2], 0xaa, keys_len[2]); + for (i = 0; i < keys_len[3]; i++) + keys[3][i] = (unsigned char) i + 1; + memset(keys[4], 0x0c, keys_len[4]); + memset(keys[5], 0xaa, keys_len[5]); + memset(keys[6], 0xaa, keys_len[6]); + + messages[2] = malloc(messages2and3_len + 1); + messages[3] = malloc(messages2and3_len + 1); + + if (messages[2] == NULL || messages[3] == NULL) { + fprintf(stderr, "Can't allocate memory\n"); + return 1; + } + + messages[2][messages2and3_len] = '\0'; + messages[3][messages2and3_len] = '\0'; + + memset(messages[2], 0xdd, messages2and3_len); + memset(messages[3], 0xcd, messages2and3_len); + + printf("HMAC-SHA-2 IETF Validation tests\n\n"); + + for (i = 0; i < 7; i++) { + if (i != 4) { + mac_224_size = SHA224_DIGEST_SIZE; + mac_256_size = SHA256_DIGEST_SIZE; + mac_384_size = SHA384_DIGEST_SIZE; + mac_512_size = SHA512_DIGEST_SIZE; + } else { + mac_224_size = 128 / 8; mac_256_size = 128 / 8; + mac_384_size = 128 / 8; mac_512_size = 128 / 8; + } + + printf("Test %d:\n", i + 1); + + hmac_sha224(keys[i], keys_len[i], messages[i], strlen(messages[i]), + mac, mac_224_size); + test(vectors[i], mac, mac_224_size ); + hmac_sha256(keys[i], keys_len[i], messages[i], strlen(messages[i]), + mac, mac_256_size); + test(vectors[7 + i], mac, mac_256_size); + hmac_sha384(keys[i], keys_len[i], messages[i], strlen(messages[i]), + mac, mac_384_size); + test(vectors[14 + i], mac, mac_384_size); + hmac_sha512(keys[i], keys_len[i], messages[i], strlen(messages[i]), + mac, mac_512_size); + test(vectors[21 + i], mac, mac_512_size); + } + + printf("All tests passed.\n"); + + return 0; +} + +#endif /* TEST_VECTORS */ + diff --git a/src/fetch/hmac_sha2.h b/src/fetch/hmac_sha2.h new file mode 100644 index 0000000..f10fb49 --- /dev/null +++ b/src/fetch/hmac_sha2.h @@ -0,0 +1,140 @@ +/*- + * HMAC-SHA-224/256/384/512 implementation + * Last update: 06/15/2005 + * Issue date: 06/15/2005 + * + * Copyright (C) 2005 Olivier Gay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _HMAC_SHA2_H +#define _HMAC_SHA2_H + +#include "sha2.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + sha224_ctx ctx_inside; + sha224_ctx ctx_outside; + + /* for hmac_reinit */ + sha224_ctx ctx_inside_reinit; + sha224_ctx ctx_outside_reinit; + + unsigned char block_ipad[SHA224_BLOCK_SIZE]; + unsigned char block_opad[SHA224_BLOCK_SIZE]; +} hmac_sha224_ctx; + +typedef struct { + sha256_ctx ctx_inside; + sha256_ctx ctx_outside; + + /* for hmac_reinit */ + sha256_ctx ctx_inside_reinit; + sha256_ctx ctx_outside_reinit; + + unsigned char block_ipad[SHA256_BLOCK_SIZE]; + unsigned char block_opad[SHA256_BLOCK_SIZE]; +} hmac_sha256_ctx; + +typedef struct { + sha384_ctx ctx_inside; + sha384_ctx ctx_outside; + + /* for hmac_reinit */ + sha384_ctx ctx_inside_reinit; + sha384_ctx ctx_outside_reinit; + + unsigned char block_ipad[SHA384_BLOCK_SIZE]; + unsigned char block_opad[SHA384_BLOCK_SIZE]; +} hmac_sha384_ctx; + +typedef struct { + sha512_ctx ctx_inside; + sha512_ctx ctx_outside; + + /* for hmac_reinit */ + sha512_ctx ctx_inside_reinit; + sha512_ctx ctx_outside_reinit; + + unsigned char block_ipad[SHA512_BLOCK_SIZE]; + unsigned char block_opad[SHA512_BLOCK_SIZE]; +} hmac_sha512_ctx; + +void hmac_sha224_init(hmac_sha224_ctx *ctx, unsigned char *key, + unsigned int key_size); +void hmac_sha224_reinit(hmac_sha224_ctx *ctx); +void hmac_sha224_update(hmac_sha224_ctx *ctx, unsigned char *message, + unsigned int message_len); +void hmac_sha224_final(hmac_sha224_ctx *ctx, unsigned char *mac, + unsigned int mac_size); +void hmac_sha224(unsigned char *key, unsigned int key_size, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size); + +void hmac_sha256_init(hmac_sha256_ctx *ctx, unsigned char *key, + unsigned int key_size); +void hmac_sha256_reinit(hmac_sha256_ctx *ctx); +void hmac_sha256_update(hmac_sha256_ctx *ctx, unsigned char *message, + unsigned int message_len); +void hmac_sha256_final(hmac_sha256_ctx *ctx, unsigned char *mac, + unsigned int mac_size); +void hmac_sha256(unsigned char *key, unsigned int key_size, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size); + +void hmac_sha384_init(hmac_sha384_ctx *ctx, unsigned char *key, + unsigned int key_size); +void hmac_sha384_reinit(hmac_sha384_ctx *ctx); +void hmac_sha384_update(hmac_sha384_ctx *ctx, unsigned char *message, + unsigned int message_len); +void hmac_sha384_final(hmac_sha384_ctx *ctx, unsigned char *mac, + unsigned int mac_size); +void hmac_sha384(unsigned char *key, unsigned int key_size, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size); + +void hmac_sha512_init(hmac_sha512_ctx *ctx, unsigned char *key, + unsigned int key_size); +void hmac_sha512_reinit(hmac_sha512_ctx *ctx); +void hmac_sha512_update(hmac_sha512_ctx *ctx, unsigned char *message, + unsigned int message_len); +void hmac_sha512_final(hmac_sha512_ctx *ctx, unsigned char *mac, + unsigned int mac_size); +void hmac_sha512(unsigned char *key, unsigned int key_size, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size); + +#ifdef __cplusplus +} +#endif + +#endif /* ! _HMAC_SHA2_H */ + diff --git a/src/fetch/ibsfetcher.cpp b/src/fetch/ibsfetcher.cpp index e715e5b..404bc1c 100644 --- a/src/fetch/ibsfetcher.cpp +++ b/src/fetch/ibsfetcher.cpp @@ -156,7 +156,8 @@ void IBSFetcher::slotComplete(TDEIO::Job* job_) { TQString s = Tellico::decodeHTML(TQString(m_data)); // really specific regexp - TQString pat = TQString::fromLatin1("http://www.internetbookshop.it/code/"); + //TQString pat = TQString::fromLatin1("http://www.internetbookshop.it/code/"); + TQString pat = TQString::fromLatin1("http://www.ibs.it/code/"); TQRegExp anchorRx(TQString::fromLatin1("]*href\\s*=\\s*[\"'](") + TQRegExp::escape(pat) + TQString::fromLatin1("[^\"]*)\"[^>]*>([^<]+)<"), false); diff --git a/src/fetch/imdbfetcher.cpp b/src/fetch/imdbfetcher.cpp index a9c0dd0..36b19a1 100644 --- a/src/fetch/imdbfetcher.cpp +++ b/src/fetch/imdbfetcher.cpp @@ -799,7 +799,7 @@ void IMDBFetcher::doPlot(const TQString& str_, Data::EntryPtr entry_, const KURL TQString thisPlot; // match until next opening tag - TQRegExp plotRx(TQString::fromLatin1("plot (?:outline|summary):(.*)<[^/].* -1) { TQString userPlot = plotRx.cap(1); userPlot.remove(*s_tagRx); // remove HTML tags + // remove last little "written by", if there + userPlot.remove(TQRegExp(TQString::fromLatin1("\\s*written by.*$"), false)); entry_->setField(TQString::fromLatin1("plot"), Tellico::decodeHTML(userPlot)); } } diff --git a/src/fetch/sha2.c b/src/fetch/sha2.c new file mode 100644 index 0000000..a32427e --- /dev/null +++ b/src/fetch/sha2.c @@ -0,0 +1,950 @@ +/* + * FIPS 180-2 SHA-224/256/384/512 implementation + * Last update: 02/02/2007 + * Issue date: 04/30/2005 + * + * Copyright (C) 2005, 2007 Olivier Gay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if 0 +#define UNROLL_LOOPS /* Enable loops unrolling */ +#endif + +#include + +#include "sha2.h" + +#define SHFR(x, n) (x >> n) +#define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) +#define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) +#define CH(x, y, z) ((x & y) ^ (~x & z)) +#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) + +#define SHA256_F1(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define SHA256_F2(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) +#define SHA256_F3(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHFR(x, 3)) +#define SHA256_F4(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHFR(x, 10)) + +#define SHA512_F1(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39)) +#define SHA512_F2(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41)) +#define SHA512_F3(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHFR(x, 7)) +#define SHA512_F4(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHFR(x, 6)) + +#define UNPACK32(x, str) \ +{ \ + *((str) + 3) = (uint8) ((x) ); \ + *((str) + 2) = (uint8) ((x) >> 8); \ + *((str) + 1) = (uint8) ((x) >> 16); \ + *((str) + 0) = (uint8) ((x) >> 24); \ +} + +#define PACK32(str, x) \ +{ \ + *(x) = ((uint32) *((str) + 3) ) \ + | ((uint32) *((str) + 2) << 8) \ + | ((uint32) *((str) + 1) << 16) \ + | ((uint32) *((str) + 0) << 24); \ +} + +#define UNPACK64(x, str) \ +{ \ + *((str) + 7) = (uint8) ((x) ); \ + *((str) + 6) = (uint8) ((x) >> 8); \ + *((str) + 5) = (uint8) ((x) >> 16); \ + *((str) + 4) = (uint8) ((x) >> 24); \ + *((str) + 3) = (uint8) ((x) >> 32); \ + *((str) + 2) = (uint8) ((x) >> 40); \ + *((str) + 1) = (uint8) ((x) >> 48); \ + *((str) + 0) = (uint8) ((x) >> 56); \ +} + +#define PACK64(str, x) \ +{ \ + *(x) = ((uint64) *((str) + 7) ) \ + | ((uint64) *((str) + 6) << 8) \ + | ((uint64) *((str) + 5) << 16) \ + | ((uint64) *((str) + 4) << 24) \ + | ((uint64) *((str) + 3) << 32) \ + | ((uint64) *((str) + 2) << 40) \ + | ((uint64) *((str) + 1) << 48) \ + | ((uint64) *((str) + 0) << 56); \ +} + +/* Macros used for loops unrolling */ + +#define SHA256_SCR(i) \ +{ \ + w[i] = SHA256_F4(w[i - 2]) + w[i - 7] \ + + SHA256_F3(w[i - 15]) + w[i - 16]; \ +} + +#define SHA512_SCR(i) \ +{ \ + w[i] = SHA512_F4(w[i - 2]) + w[i - 7] \ + + SHA512_F3(w[i - 15]) + w[i - 16]; \ +} + +#define SHA256_EXP(a, b, c, d, e, f, g, h, j) \ +{ \ + t1 = wv[h] + SHA256_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \ + + sha256_k[j] + w[j]; \ + t2 = SHA256_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \ + wv[d] += t1; \ + wv[h] = t1 + t2; \ +} + +#define SHA512_EXP(a, b, c, d, e, f, g ,h, j) \ +{ \ + t1 = wv[h] + SHA512_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \ + + sha512_k[j] + w[j]; \ + t2 = SHA512_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \ + wv[d] += t1; \ + wv[h] = t1 + t2; \ +} + +uint32 sha224_h0[8] = + {0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4}; + +uint32 sha256_h0[8] = + {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; + +uint64 sha384_h0[8] = + {0xcbbb9d5dc1059ed8ULL, 0x629a292a367cd507ULL, + 0x9159015a3070dd17ULL, 0x152fecd8f70e5939ULL, + 0x67332667ffc00b31ULL, 0x8eb44a8768581511ULL, + 0xdb0c2e0d64f98fa7ULL, 0x47b5481dbefa4fa4ULL}; + +uint64 sha512_h0[8] = + {0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, + 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, + 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, + 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL}; + +uint32 sha256_k[64] = + {0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; + +uint64 sha512_k[80] = + {0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, + 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, + 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, + 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, + 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, + 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, + 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, + 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, + 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, + 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, + 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, + 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, + 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, + 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, + 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, + 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, + 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, + 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, + 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, + 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, + 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, + 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, + 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, + 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, + 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, + 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, + 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, + 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, + 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, + 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, + 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, + 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, + 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, + 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL}; + +/* SHA-256 functions */ + +void sha256_transf(sha256_ctx *ctx, const unsigned char *message, + unsigned int block_nb) +{ + uint32 w[64]; + uint32 wv[8]; + uint32 t1, t2; + const unsigned char *sub_block; + int i; + +#ifndef UNROLL_LOOPS + int j; +#endif + + for (i = 0; i < (int) block_nb; i++) { + sub_block = message + (i << 6); + +#ifndef UNROLL_LOOPS + for (j = 0; j < 16; j++) { + PACK32(&sub_block[j << 2], &w[j]); + } + + for (j = 16; j < 64; j++) { + SHA256_SCR(j); + } + + for (j = 0; j < 8; j++) { + wv[j] = ctx->h[j]; + } + + for (j = 0; j < 64; j++) { + t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + + sha256_k[j] + w[j]; + t2 = SHA256_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]); + wv[7] = wv[6]; + wv[6] = wv[5]; + wv[5] = wv[4]; + wv[4] = wv[3] + t1; + wv[3] = wv[2]; + wv[2] = wv[1]; + wv[1] = wv[0]; + wv[0] = t1 + t2; + } + + for (j = 0; j < 8; j++) { + ctx->h[j] += wv[j]; + } +#else + PACK32(&sub_block[ 0], &w[ 0]); PACK32(&sub_block[ 4], &w[ 1]); + PACK32(&sub_block[ 8], &w[ 2]); PACK32(&sub_block[12], &w[ 3]); + PACK32(&sub_block[16], &w[ 4]); PACK32(&sub_block[20], &w[ 5]); + PACK32(&sub_block[24], &w[ 6]); PACK32(&sub_block[28], &w[ 7]); + PACK32(&sub_block[32], &w[ 8]); PACK32(&sub_block[36], &w[ 9]); + PACK32(&sub_block[40], &w[10]); PACK32(&sub_block[44], &w[11]); + PACK32(&sub_block[48], &w[12]); PACK32(&sub_block[52], &w[13]); + PACK32(&sub_block[56], &w[14]); PACK32(&sub_block[60], &w[15]); + + SHA256_SCR(16); SHA256_SCR(17); SHA256_SCR(18); SHA256_SCR(19); + SHA256_SCR(20); SHA256_SCR(21); SHA256_SCR(22); SHA256_SCR(23); + SHA256_SCR(24); SHA256_SCR(25); SHA256_SCR(26); SHA256_SCR(27); + SHA256_SCR(28); SHA256_SCR(29); SHA256_SCR(30); SHA256_SCR(31); + SHA256_SCR(32); SHA256_SCR(33); SHA256_SCR(34); SHA256_SCR(35); + SHA256_SCR(36); SHA256_SCR(37); SHA256_SCR(38); SHA256_SCR(39); + SHA256_SCR(40); SHA256_SCR(41); SHA256_SCR(42); SHA256_SCR(43); + SHA256_SCR(44); SHA256_SCR(45); SHA256_SCR(46); SHA256_SCR(47); + SHA256_SCR(48); SHA256_SCR(49); SHA256_SCR(50); SHA256_SCR(51); + SHA256_SCR(52); SHA256_SCR(53); SHA256_SCR(54); SHA256_SCR(55); + SHA256_SCR(56); SHA256_SCR(57); SHA256_SCR(58); SHA256_SCR(59); + SHA256_SCR(60); SHA256_SCR(61); SHA256_SCR(62); SHA256_SCR(63); + + wv[0] = ctx->h[0]; wv[1] = ctx->h[1]; + wv[2] = ctx->h[2]; wv[3] = ctx->h[3]; + wv[4] = ctx->h[4]; wv[5] = ctx->h[5]; + wv[6] = ctx->h[6]; wv[7] = ctx->h[7]; + + SHA256_EXP(0,1,2,3,4,5,6,7, 0); SHA256_EXP(7,0,1,2,3,4,5,6, 1); + SHA256_EXP(6,7,0,1,2,3,4,5, 2); SHA256_EXP(5,6,7,0,1,2,3,4, 3); + SHA256_EXP(4,5,6,7,0,1,2,3, 4); SHA256_EXP(3,4,5,6,7,0,1,2, 5); + SHA256_EXP(2,3,4,5,6,7,0,1, 6); SHA256_EXP(1,2,3,4,5,6,7,0, 7); + SHA256_EXP(0,1,2,3,4,5,6,7, 8); SHA256_EXP(7,0,1,2,3,4,5,6, 9); + SHA256_EXP(6,7,0,1,2,3,4,5,10); SHA256_EXP(5,6,7,0,1,2,3,4,11); + SHA256_EXP(4,5,6,7,0,1,2,3,12); SHA256_EXP(3,4,5,6,7,0,1,2,13); + SHA256_EXP(2,3,4,5,6,7,0,1,14); SHA256_EXP(1,2,3,4,5,6,7,0,15); + SHA256_EXP(0,1,2,3,4,5,6,7,16); SHA256_EXP(7,0,1,2,3,4,5,6,17); + SHA256_EXP(6,7,0,1,2,3,4,5,18); SHA256_EXP(5,6,7,0,1,2,3,4,19); + SHA256_EXP(4,5,6,7,0,1,2,3,20); SHA256_EXP(3,4,5,6,7,0,1,2,21); + SHA256_EXP(2,3,4,5,6,7,0,1,22); SHA256_EXP(1,2,3,4,5,6,7,0,23); + SHA256_EXP(0,1,2,3,4,5,6,7,24); SHA256_EXP(7,0,1,2,3,4,5,6,25); + SHA256_EXP(6,7,0,1,2,3,4,5,26); SHA256_EXP(5,6,7,0,1,2,3,4,27); + SHA256_EXP(4,5,6,7,0,1,2,3,28); SHA256_EXP(3,4,5,6,7,0,1,2,29); + SHA256_EXP(2,3,4,5,6,7,0,1,30); SHA256_EXP(1,2,3,4,5,6,7,0,31); + SHA256_EXP(0,1,2,3,4,5,6,7,32); SHA256_EXP(7,0,1,2,3,4,5,6,33); + SHA256_EXP(6,7,0,1,2,3,4,5,34); SHA256_EXP(5,6,7,0,1,2,3,4,35); + SHA256_EXP(4,5,6,7,0,1,2,3,36); SHA256_EXP(3,4,5,6,7,0,1,2,37); + SHA256_EXP(2,3,4,5,6,7,0,1,38); SHA256_EXP(1,2,3,4,5,6,7,0,39); + SHA256_EXP(0,1,2,3,4,5,6,7,40); SHA256_EXP(7,0,1,2,3,4,5,6,41); + SHA256_EXP(6,7,0,1,2,3,4,5,42); SHA256_EXP(5,6,7,0,1,2,3,4,43); + SHA256_EXP(4,5,6,7,0,1,2,3,44); SHA256_EXP(3,4,5,6,7,0,1,2,45); + SHA256_EXP(2,3,4,5,6,7,0,1,46); SHA256_EXP(1,2,3,4,5,6,7,0,47); + SHA256_EXP(0,1,2,3,4,5,6,7,48); SHA256_EXP(7,0,1,2,3,4,5,6,49); + SHA256_EXP(6,7,0,1,2,3,4,5,50); SHA256_EXP(5,6,7,0,1,2,3,4,51); + SHA256_EXP(4,5,6,7,0,1,2,3,52); SHA256_EXP(3,4,5,6,7,0,1,2,53); + SHA256_EXP(2,3,4,5,6,7,0,1,54); SHA256_EXP(1,2,3,4,5,6,7,0,55); + SHA256_EXP(0,1,2,3,4,5,6,7,56); SHA256_EXP(7,0,1,2,3,4,5,6,57); + SHA256_EXP(6,7,0,1,2,3,4,5,58); SHA256_EXP(5,6,7,0,1,2,3,4,59); + SHA256_EXP(4,5,6,7,0,1,2,3,60); SHA256_EXP(3,4,5,6,7,0,1,2,61); + SHA256_EXP(2,3,4,5,6,7,0,1,62); SHA256_EXP(1,2,3,4,5,6,7,0,63); + + ctx->h[0] += wv[0]; ctx->h[1] += wv[1]; + ctx->h[2] += wv[2]; ctx->h[3] += wv[3]; + ctx->h[4] += wv[4]; ctx->h[5] += wv[5]; + ctx->h[6] += wv[6]; ctx->h[7] += wv[7]; +#endif /* !UNROLL_LOOPS */ + } +} + +void sha256(const unsigned char *message, unsigned int len, unsigned char *digest) +{ + sha256_ctx ctx; + + sha256_init(&ctx); + sha256_update(&ctx, message, len); + sha256_final(&ctx, digest); +} + +void sha256_init(sha256_ctx *ctx) +{ +#ifndef UNROLL_LOOPS + int i; + for (i = 0; i < 8; i++) { + ctx->h[i] = sha256_h0[i]; + } +#else + ctx->h[0] = sha256_h0[0]; ctx->h[1] = sha256_h0[1]; + ctx->h[2] = sha256_h0[2]; ctx->h[3] = sha256_h0[3]; + ctx->h[4] = sha256_h0[4]; ctx->h[5] = sha256_h0[5]; + ctx->h[6] = sha256_h0[6]; ctx->h[7] = sha256_h0[7]; +#endif /* !UNROLL_LOOPS */ + + ctx->len = 0; + ctx->tot_len = 0; +} + +void sha256_update(sha256_ctx *ctx, const unsigned char *message, + unsigned int len) +{ + unsigned int block_nb; + unsigned int new_len, rem_len, tmp_len; + const unsigned char *shifted_message; + + tmp_len = SHA256_BLOCK_SIZE - ctx->len; + rem_len = len < tmp_len ? len : tmp_len; + + memcpy(&ctx->block[ctx->len], message, rem_len); + + if (ctx->len + len < SHA256_BLOCK_SIZE) { + ctx->len += len; + return; + } + + new_len = len - rem_len; + block_nb = new_len / SHA256_BLOCK_SIZE; + + shifted_message = message + rem_len; + + sha256_transf(ctx, ctx->block, 1); + sha256_transf(ctx, shifted_message, block_nb); + + rem_len = new_len % SHA256_BLOCK_SIZE; + + memcpy(ctx->block, &shifted_message[block_nb << 6], + rem_len); + + ctx->len = rem_len; + ctx->tot_len += (block_nb + 1) << 6; +} + +void sha256_final(sha256_ctx *ctx, unsigned char *digest) +{ + unsigned int block_nb; + unsigned int pm_len; + unsigned int len_b; + +#ifndef UNROLL_LOOPS + int i; +#endif + + block_nb = (1 + ((SHA256_BLOCK_SIZE - 9) + < (ctx->len % SHA256_BLOCK_SIZE))); + + len_b = (ctx->tot_len + ctx->len) << 3; + pm_len = block_nb << 6; + + memset(ctx->block + ctx->len, 0, pm_len - ctx->len); + ctx->block[ctx->len] = 0x80; + UNPACK32(len_b, ctx->block + pm_len - 4); + + sha256_transf(ctx, ctx->block, block_nb); + +#ifndef UNROLL_LOOPS + for (i = 0 ; i < 8; i++) { + UNPACK32(ctx->h[i], &digest[i << 2]); + } +#else + UNPACK32(ctx->h[0], &digest[ 0]); + UNPACK32(ctx->h[1], &digest[ 4]); + UNPACK32(ctx->h[2], &digest[ 8]); + UNPACK32(ctx->h[3], &digest[12]); + UNPACK32(ctx->h[4], &digest[16]); + UNPACK32(ctx->h[5], &digest[20]); + UNPACK32(ctx->h[6], &digest[24]); + UNPACK32(ctx->h[7], &digest[28]); +#endif /* !UNROLL_LOOPS */ +} + +/* SHA-512 functions */ + +void sha512_transf(sha512_ctx *ctx, const unsigned char *message, + unsigned int block_nb) +{ + uint64 w[80]; + uint64 wv[8]; + uint64 t1, t2; + const unsigned char *sub_block; + int i, j; + + for (i = 0; i < (int) block_nb; i++) { + sub_block = message + (i << 7); + +#ifndef UNROLL_LOOPS + for (j = 0; j < 16; j++) { + PACK64(&sub_block[j << 3], &w[j]); + } + + for (j = 16; j < 80; j++) { + SHA512_SCR(j); + } + + for (j = 0; j < 8; j++) { + wv[j] = ctx->h[j]; + } + + for (j = 0; j < 80; j++) { + t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + + sha512_k[j] + w[j]; + t2 = SHA512_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]); + wv[7] = wv[6]; + wv[6] = wv[5]; + wv[5] = wv[4]; + wv[4] = wv[3] + t1; + wv[3] = wv[2]; + wv[2] = wv[1]; + wv[1] = wv[0]; + wv[0] = t1 + t2; + } + + for (j = 0; j < 8; j++) { + ctx->h[j] += wv[j]; + } +#else + PACK64(&sub_block[ 0], &w[ 0]); PACK64(&sub_block[ 8], &w[ 1]); + PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]); + PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]); + PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]); + PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]); + PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]); + PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]); + PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]); + + SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19); + SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23); + SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27); + SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31); + SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35); + SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39); + SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43); + SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47); + SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51); + SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55); + SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59); + SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63); + SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67); + SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71); + SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75); + SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79); + + wv[0] = ctx->h[0]; wv[1] = ctx->h[1]; + wv[2] = ctx->h[2]; wv[3] = ctx->h[3]; + wv[4] = ctx->h[4]; wv[5] = ctx->h[5]; + wv[6] = ctx->h[6]; wv[7] = ctx->h[7]; + + j = 0; + + do { + SHA512_EXP(0,1,2,3,4,5,6,7,j); j++; + SHA512_EXP(7,0,1,2,3,4,5,6,j); j++; + SHA512_EXP(6,7,0,1,2,3,4,5,j); j++; + SHA512_EXP(5,6,7,0,1,2,3,4,j); j++; + SHA512_EXP(4,5,6,7,0,1,2,3,j); j++; + SHA512_EXP(3,4,5,6,7,0,1,2,j); j++; + SHA512_EXP(2,3,4,5,6,7,0,1,j); j++; + SHA512_EXP(1,2,3,4,5,6,7,0,j); j++; + } while (j < 80); + + ctx->h[0] += wv[0]; ctx->h[1] += wv[1]; + ctx->h[2] += wv[2]; ctx->h[3] += wv[3]; + ctx->h[4] += wv[4]; ctx->h[5] += wv[5]; + ctx->h[6] += wv[6]; ctx->h[7] += wv[7]; +#endif /* !UNROLL_LOOPS */ + } +} + +void sha512(const unsigned char *message, unsigned int len, + unsigned char *digest) +{ + sha512_ctx ctx; + + sha512_init(&ctx); + sha512_update(&ctx, message, len); + sha512_final(&ctx, digest); +} + +void sha512_init(sha512_ctx *ctx) +{ +#ifndef UNROLL_LOOPS + int i; + for (i = 0; i < 8; i++) { + ctx->h[i] = sha512_h0[i]; + } +#else + ctx->h[0] = sha512_h0[0]; ctx->h[1] = sha512_h0[1]; + ctx->h[2] = sha512_h0[2]; ctx->h[3] = sha512_h0[3]; + ctx->h[4] = sha512_h0[4]; ctx->h[5] = sha512_h0[5]; + ctx->h[6] = sha512_h0[6]; ctx->h[7] = sha512_h0[7]; +#endif /* !UNROLL_LOOPS */ + + ctx->len = 0; + ctx->tot_len = 0; +} + +void sha512_update(sha512_ctx *ctx, const unsigned char *message, + unsigned int len) +{ + unsigned int block_nb; + unsigned int new_len, rem_len, tmp_len; + const unsigned char *shifted_message; + + tmp_len = SHA512_BLOCK_SIZE - ctx->len; + rem_len = len < tmp_len ? len : tmp_len; + + memcpy(&ctx->block[ctx->len], message, rem_len); + + if (ctx->len + len < SHA512_BLOCK_SIZE) { + ctx->len += len; + return; + } + + new_len = len - rem_len; + block_nb = new_len / SHA512_BLOCK_SIZE; + + shifted_message = message + rem_len; + + sha512_transf(ctx, ctx->block, 1); + sha512_transf(ctx, shifted_message, block_nb); + + rem_len = new_len % SHA512_BLOCK_SIZE; + + memcpy(ctx->block, &shifted_message[block_nb << 7], + rem_len); + + ctx->len = rem_len; + ctx->tot_len += (block_nb + 1) << 7; +} + +void sha512_final(sha512_ctx *ctx, unsigned char *digest) +{ + unsigned int block_nb; + unsigned int pm_len; + unsigned int len_b; + +#ifndef UNROLL_LOOPS + int i; +#endif + + block_nb = 1 + ((SHA512_BLOCK_SIZE - 17) + < (ctx->len % SHA512_BLOCK_SIZE)); + + len_b = (ctx->tot_len + ctx->len) << 3; + pm_len = block_nb << 7; + + memset(ctx->block + ctx->len, 0, pm_len - ctx->len); + ctx->block[ctx->len] = 0x80; + UNPACK32(len_b, ctx->block + pm_len - 4); + + sha512_transf(ctx, ctx->block, block_nb); + +#ifndef UNROLL_LOOPS + for (i = 0 ; i < 8; i++) { + UNPACK64(ctx->h[i], &digest[i << 3]); + } +#else + UNPACK64(ctx->h[0], &digest[ 0]); + UNPACK64(ctx->h[1], &digest[ 8]); + UNPACK64(ctx->h[2], &digest[16]); + UNPACK64(ctx->h[3], &digest[24]); + UNPACK64(ctx->h[4], &digest[32]); + UNPACK64(ctx->h[5], &digest[40]); + UNPACK64(ctx->h[6], &digest[48]); + UNPACK64(ctx->h[7], &digest[56]); +#endif /* !UNROLL_LOOPS */ +} + +/* SHA-384 functions */ + +void sha384(const unsigned char *message, unsigned int len, + unsigned char *digest) +{ + sha384_ctx ctx; + + sha384_init(&ctx); + sha384_update(&ctx, message, len); + sha384_final(&ctx, digest); +} + +void sha384_init(sha384_ctx *ctx) +{ +#ifndef UNROLL_LOOPS + int i; + for (i = 0; i < 8; i++) { + ctx->h[i] = sha384_h0[i]; + } +#else + ctx->h[0] = sha384_h0[0]; ctx->h[1] = sha384_h0[1]; + ctx->h[2] = sha384_h0[2]; ctx->h[3] = sha384_h0[3]; + ctx->h[4] = sha384_h0[4]; ctx->h[5] = sha384_h0[5]; + ctx->h[6] = sha384_h0[6]; ctx->h[7] = sha384_h0[7]; +#endif /* !UNROLL_LOOPS */ + + ctx->len = 0; + ctx->tot_len = 0; +} + +void sha384_update(sha384_ctx *ctx, const unsigned char *message, + unsigned int len) +{ + unsigned int block_nb; + unsigned int new_len, rem_len, tmp_len; + const unsigned char *shifted_message; + + tmp_len = SHA384_BLOCK_SIZE - ctx->len; + rem_len = len < tmp_len ? len : tmp_len; + + memcpy(&ctx->block[ctx->len], message, rem_len); + + if (ctx->len + len < SHA384_BLOCK_SIZE) { + ctx->len += len; + return; + } + + new_len = len - rem_len; + block_nb = new_len / SHA384_BLOCK_SIZE; + + shifted_message = message + rem_len; + + sha512_transf(ctx, ctx->block, 1); + sha512_transf(ctx, shifted_message, block_nb); + + rem_len = new_len % SHA384_BLOCK_SIZE; + + memcpy(ctx->block, &shifted_message[block_nb << 7], + rem_len); + + ctx->len = rem_len; + ctx->tot_len += (block_nb + 1) << 7; +} + +void sha384_final(sha384_ctx *ctx, unsigned char *digest) +{ + unsigned int block_nb; + unsigned int pm_len; + unsigned int len_b; + +#ifndef UNROLL_LOOPS + int i; +#endif + + block_nb = (1 + ((SHA384_BLOCK_SIZE - 17) + < (ctx->len % SHA384_BLOCK_SIZE))); + + len_b = (ctx->tot_len + ctx->len) << 3; + pm_len = block_nb << 7; + + memset(ctx->block + ctx->len, 0, pm_len - ctx->len); + ctx->block[ctx->len] = 0x80; + UNPACK32(len_b, ctx->block + pm_len - 4); + + sha512_transf(ctx, ctx->block, block_nb); + +#ifndef UNROLL_LOOPS + for (i = 0 ; i < 6; i++) { + UNPACK64(ctx->h[i], &digest[i << 3]); + } +#else + UNPACK64(ctx->h[0], &digest[ 0]); + UNPACK64(ctx->h[1], &digest[ 8]); + UNPACK64(ctx->h[2], &digest[16]); + UNPACK64(ctx->h[3], &digest[24]); + UNPACK64(ctx->h[4], &digest[32]); + UNPACK64(ctx->h[5], &digest[40]); +#endif /* !UNROLL_LOOPS */ +} + +/* SHA-224 functions */ + +void sha224(const unsigned char *message, unsigned int len, + unsigned char *digest) +{ + sha224_ctx ctx; + + sha224_init(&ctx); + sha224_update(&ctx, message, len); + sha224_final(&ctx, digest); +} + +void sha224_init(sha224_ctx *ctx) +{ +#ifndef UNROLL_LOOPS + int i; + for (i = 0; i < 8; i++) { + ctx->h[i] = sha224_h0[i]; + } +#else + ctx->h[0] = sha224_h0[0]; ctx->h[1] = sha224_h0[1]; + ctx->h[2] = sha224_h0[2]; ctx->h[3] = sha224_h0[3]; + ctx->h[4] = sha224_h0[4]; ctx->h[5] = sha224_h0[5]; + ctx->h[6] = sha224_h0[6]; ctx->h[7] = sha224_h0[7]; +#endif /* !UNROLL_LOOPS */ + + ctx->len = 0; + ctx->tot_len = 0; +} + +void sha224_update(sha224_ctx *ctx, const unsigned char *message, + unsigned int len) +{ + unsigned int block_nb; + unsigned int new_len, rem_len, tmp_len; + const unsigned char *shifted_message; + + tmp_len = SHA224_BLOCK_SIZE - ctx->len; + rem_len = len < tmp_len ? len : tmp_len; + + memcpy(&ctx->block[ctx->len], message, rem_len); + + if (ctx->len + len < SHA224_BLOCK_SIZE) { + ctx->len += len; + return; + } + + new_len = len - rem_len; + block_nb = new_len / SHA224_BLOCK_SIZE; + + shifted_message = message + rem_len; + + sha256_transf(ctx, ctx->block, 1); + sha256_transf(ctx, shifted_message, block_nb); + + rem_len = new_len % SHA224_BLOCK_SIZE; + + memcpy(ctx->block, &shifted_message[block_nb << 6], + rem_len); + + ctx->len = rem_len; + ctx->tot_len += (block_nb + 1) << 6; +} + +void sha224_final(sha224_ctx *ctx, unsigned char *digest) +{ + unsigned int block_nb; + unsigned int pm_len; + unsigned int len_b; + +#ifndef UNROLL_LOOPS + int i; +#endif + + block_nb = (1 + ((SHA224_BLOCK_SIZE - 9) + < (ctx->len % SHA224_BLOCK_SIZE))); + + len_b = (ctx->tot_len + ctx->len) << 3; + pm_len = block_nb << 6; + + memset(ctx->block + ctx->len, 0, pm_len - ctx->len); + ctx->block[ctx->len] = 0x80; + UNPACK32(len_b, ctx->block + pm_len - 4); + + sha256_transf(ctx, ctx->block, block_nb); + +#ifndef UNROLL_LOOPS + for (i = 0 ; i < 7; i++) { + UNPACK32(ctx->h[i], &digest[i << 2]); + } +#else + UNPACK32(ctx->h[0], &digest[ 0]); + UNPACK32(ctx->h[1], &digest[ 4]); + UNPACK32(ctx->h[2], &digest[ 8]); + UNPACK32(ctx->h[3], &digest[12]); + UNPACK32(ctx->h[4], &digest[16]); + UNPACK32(ctx->h[5], &digest[20]); + UNPACK32(ctx->h[6], &digest[24]); +#endif /* !UNROLL_LOOPS */ +} + +#ifdef TEST_VECTORS + +/* FIPS 180-2 Validation tests */ + +#include +#include + +void test(const unsigned char *vector, unsigned char *digest, + unsigned int digest_size) +{ + unsigned char output[2 * SHA512_DIGEST_SIZE + 1]; + int i; + + output[2 * digest_size] = '\0'; + + for (i = 0; i < (int) digest_size ; i++) { + sprintf((char *) output + 2 * i, "%02x", digest[i]); + } + + printf("H: %s\n", output); + if (strcmp((char *) vector, (char *) output)) { + fprintf(stderr, "Test failed.\n"); + exit(EXIT_FAILURE); + } +} + +int main() +{ + static const unsigned char *vectors[4][3] = + { /* SHA-224 */ + { + "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7", + "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525", + "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67", + }, + /* SHA-256 */ + { + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", + "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", + "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0", + }, + /* SHA-384 */ + { + "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed" + "8086072ba1e7cc2358baeca134c825a7", + "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712" + "fcc7c71a557e2db966c3e9fa91746039", + "9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b" + "07b8b3dc38ecc4ebae97ddd87f3d8985", + }, + /* SHA-512 */ + { + "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" + "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", + "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018" + "501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909", + "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973eb" + "de0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b" + } + }; + + static const unsigned char message1[] = "abc"; + static const unsigned char message2a[] = "abcdbcdecdefdefgefghfghighijhi" + "jkijkljklmklmnlmnomnopnopq"; + static const unsigned char message2b[] = + "abcdefghbcdefghicdefghijdefghijkefghij" + "klfghijklmghijklmnhijklmnoijklmnopjklm" + "nopqklmnopqrlmnopqrsmnopqrstnopqrstu"; + unsigned char *message3; + unsigned int message3_len = 1000000; + unsigned char digest[SHA512_DIGEST_SIZE]; + + message3 = malloc(message3_len); + if (message3 == NULL) { + fprintf(stderr, "Can't allocate memory\n"); + return -1; + } + memset(message3, 'a', message3_len); + + printf("SHA-2 FIPS 180-2 Validation tests\n\n"); + printf("SHA-224 Test vectors\n"); + + sha224(message1, strlen((char *) message1), digest); + test(vectors[0][0], digest, SHA224_DIGEST_SIZE); + sha224(message2a, strlen((char *) message2a), digest); + test(vectors[0][1], digest, SHA224_DIGEST_SIZE); + sha224(message3, message3_len, digest); + test(vectors[0][2], digest, SHA224_DIGEST_SIZE); + printf("\n"); + + printf("SHA-256 Test vectors\n"); + + sha256(message1, strlen((char *) message1), digest); + test(vectors[1][0], digest, SHA256_DIGEST_SIZE); + sha256(message2a, strlen((char *) message2a), digest); + test(vectors[1][1], digest, SHA256_DIGEST_SIZE); + sha256(message3, message3_len, digest); + test(vectors[1][2], digest, SHA256_DIGEST_SIZE); + printf("\n"); + + printf("SHA-384 Test vectors\n"); + + sha384(message1, strlen((char *) message1), digest); + test(vectors[2][0], digest, SHA384_DIGEST_SIZE); + sha384(message2b, strlen((char *) message2b), digest); + test(vectors[2][1], digest, SHA384_DIGEST_SIZE); + sha384(message3, message3_len, digest); + test(vectors[2][2], digest, SHA384_DIGEST_SIZE); + printf("\n"); + + printf("SHA-512 Test vectors\n"); + + sha512(message1, strlen((char *) message1), digest); + test(vectors[3][0], digest, SHA512_DIGEST_SIZE); + sha512(message2b, strlen((char *) message2b), digest); + test(vectors[3][1], digest, SHA512_DIGEST_SIZE); + sha512(message3, message3_len, digest); + test(vectors[3][2], digest, SHA512_DIGEST_SIZE); + printf("\n"); + + printf("All tests passed.\n"); + + return 0; +} + +#endif /* TEST_VECTORS */ + diff --git a/src/fetch/sha2.h b/src/fetch/sha2.h new file mode 100644 index 0000000..60f52e3 --- /dev/null +++ b/src/fetch/sha2.h @@ -0,0 +1,108 @@ +/* + * FIPS 180-2 SHA-224/256/384/512 implementation + * Last update: 02/02/2007 + * Issue date: 04/30/2005 + * + * Copyright (C) 2005, 2007 Olivier Gay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef SHA2_H +#define SHA2_H + +#define SHA224_DIGEST_SIZE ( 224 / 8) +#define SHA256_DIGEST_SIZE ( 256 / 8) +#define SHA384_DIGEST_SIZE ( 384 / 8) +#define SHA512_DIGEST_SIZE ( 512 / 8) + +#define SHA256_BLOCK_SIZE ( 512 / 8) +#define SHA512_BLOCK_SIZE (1024 / 8) +#define SHA384_BLOCK_SIZE SHA512_BLOCK_SIZE +#define SHA224_BLOCK_SIZE SHA256_BLOCK_SIZE + +#ifndef SHA2_TYPES +#define SHA2_TYPES +typedef unsigned char uint8; +typedef unsigned int uint32; +typedef unsigned long long uint64; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned int tot_len; + unsigned int len; + unsigned char block[2 * SHA256_BLOCK_SIZE]; + uint32 h[8]; +} sha256_ctx; + +typedef struct { + unsigned int tot_len; + unsigned int len; + unsigned char block[2 * SHA512_BLOCK_SIZE]; + uint64 h[8]; +} sha512_ctx; + +typedef sha512_ctx sha384_ctx; +typedef sha256_ctx sha224_ctx; + +void sha224_init(sha224_ctx *ctx); +void sha224_update(sha224_ctx *ctx, const unsigned char *message, + unsigned int len); +void sha224_final(sha224_ctx *ctx, unsigned char *digest); +void sha224(const unsigned char *message, unsigned int len, + unsigned char *digest); + +void sha256_init(sha256_ctx * ctx); +void sha256_update(sha256_ctx *ctx, const unsigned char *message, + unsigned int len); +void sha256_final(sha256_ctx *ctx, unsigned char *digest); +void sha256(const unsigned char *message, unsigned int len, + unsigned char *digest); + +void sha384_init(sha384_ctx *ctx); +void sha384_update(sha384_ctx *ctx, const unsigned char *message, + unsigned int len); +void sha384_final(sha384_ctx *ctx, unsigned char *digest); +void sha384(const unsigned char *message, unsigned int len, + unsigned char *digest); + +void sha512_init(sha512_ctx *ctx); +void sha512_update(sha512_ctx *ctx, const unsigned char *message, + unsigned int len); +void sha512_final(sha512_ctx *ctx, unsigned char *digest); +void sha512(const unsigned char *message, unsigned int len, + unsigned char *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* !SHA2_H */ + diff --git a/src/fetch/z3950-servers.cfg b/src/fetch/z3950-servers.cfg index f4f6157..b30b661 100644 --- a/src/fetch/z3950-servers.cfg +++ b/src/fetch/z3950-servers.cfg @@ -43,9 +43,9 @@ Locale=it Syntax=unimarc [porbase] -Host=z3950.bn.pt +Host=z3950.porbase.org Port=210 -Database=bnd +Database=Default Name=Portuguese National Library Charset=iso-8859-1 Locale=pt diff --git a/src/fetch/z3950fetcher.cpp b/src/fetch/z3950fetcher.cpp index 7e70aa4..bd517ae 100644 --- a/src/fetch/z3950fetcher.cpp +++ b/src/fetch/z3950fetcher.cpp @@ -175,13 +175,13 @@ void Z3950Fetcher::search(FetchKey key_, const TQString& value_) { isbnList.insert(it, isbn10); } } - const int count = isbnList.count(); + const size_t count = isbnList.count(); if(count > 1) { m_pqn = TQString::fromLatin1("@or "); } - for(int i = 0; i < count; ++i) { + for(size_t i = 0; i < count; ++i) { m_pqn += TQString::fromLatin1(" @attr 1=7 ") + isbnList[i]; - if(i < count-2) { + if(count > 1 && i < count-2) { m_pqn += TQString::fromLatin1(" @or"); } } diff --git a/src/fetchdialog.cpp b/src/fetchdialog.cpp index ab9d91b..9586b13 100644 --- a/src/fetchdialog.cpp +++ b/src/fetchdialog.cpp @@ -591,6 +591,10 @@ void FetchDialog::slotMultipleISBN(bool toggle_) { m_valueLineEdit->setText(val); } m_editISBN->setEnabled(toggle_); + if(toggle_) { + // if we're editing multiple values, it makes sense to popup the dialog now + slotEditMultipleISBN(); + } } void FetchDialog::slotEditMultipleISBN() { diff --git a/src/field.cpp b/src/field.cpp index 4ad2fa7..793de90 100644 --- a/src/field.cpp +++ b/src/field.cpp @@ -32,6 +32,7 @@ namespace { using Tellico::Data::Field; //these get overwritten, but are here since they're static +TQStringList Field::s_articles; TQStringList Field::s_articlesApos; TQRegExp Field::s_delimiter = TQRegExp(TQString::fromLatin1("\\s*;\\s*")); @@ -171,7 +172,7 @@ const TQString& Field::defaultValue() const { } void Field::setDefaultValue(const TQString& value_) { - if(m_type != Choice || m_allowed.findIndex(value_) > -1) { + if(value_.isEmpty() || m_type != Choice || m_allowed.findIndex(value_) > -1) { setProperty(TQString::fromLatin1("default"), value_); } } @@ -260,8 +261,7 @@ TQString Field::formatTitle(const TQString& title_) { if(Config::autoFormat()) { const TQString lower = newTitle.lower(); // TODO if the title has ",the" at the end, put it at the front - const TQStringList& articles = Config::articleList(); - for(TQStringList::ConstIterator it = articles.begin(); it != articles.end(); ++it) { + for(TQStringList::ConstIterator it = s_articles.constBegin(); it != s_articles.constEnd(); ++it) { // assume white space is already stripped // the articles are already in lower-case if(lower.startsWith(*it + TQChar(' '))) { @@ -415,7 +415,7 @@ TQString Field::capitalize(TQString str_) { TQString word = str_.mid(0, pos); // now check to see if words starts with apostrophe list - for(TQStringList::ConstIterator it = s_articlesApos.begin(); it != s_articlesApos.end(); ++it) { + for(TQStringList::ConstIterator it = s_articlesApos.constBegin(); it != s_articlesApos.constEnd(); ++it) { if(word.lower().startsWith(*it)) { uint l = (*it).length(); str_.replace(l, 1, str_.at(l).upper()); @@ -432,7 +432,7 @@ TQString Field::capitalize(TQString str_) { word = str_.mid(pos+1, nextPos-pos-1); bool aposMatch = false; // now check to see if words starts with apostrophe list - for(TQStringList::ConstIterator it = s_articlesApos.begin(); it != s_articlesApos.end(); ++it) { + for(TQStringList::ConstIterator it = s_articlesApos.constBegin(); it != s_articlesApos.constEnd(); ++it) { if(word.lower().startsWith(*it)) { uint l = (*it).length(); str_.replace(pos+l+1, 1, str_.at(pos+l+1).upper()); @@ -455,8 +455,7 @@ TQString Field::capitalize(TQString str_) { TQString Field::sortKeyTitle(const TQString& title_) { const TQString lower = title_.lower(); - const TQStringList& articles = Config::articleList(); - for(TQStringList::ConstIterator it = articles.begin(); it != articles.end(); ++it) { + for(TQStringList::ConstIterator it = s_articles.constBegin(); it != s_articles.constEnd(); ++it) { // assume white space is already stripped // the articles are already in lower-case if(lower.startsWith(*it + TQChar(' '))) { @@ -464,7 +463,7 @@ TQString Field::sortKeyTitle(const TQString& title_) { } } // check apostrophes, too - for(TQStringList::ConstIterator it = s_articlesApos.begin(); it != s_articlesApos.end(); ++it) { + for(TQStringList::ConstIterator it = s_articlesApos.constBegin(); it != s_articlesApos.constEnd(); ++it) { if(lower.startsWith(*it)) { return title_.mid((*it).length()); } @@ -474,9 +473,9 @@ TQString Field::sortKeyTitle(const TQString& title_) { // articles should all be in lower-case void Field::articlesUpdated() { - const TQStringList articles = Config::articleList(); + s_articles = Config::articleList(); s_articlesApos.clear(); - for(TQStringList::ConstIterator it = articles.begin(); it != articles.end(); ++it) { + for(TQStringList::ConstIterator it = s_articles.constBegin(); it != s_articles.constEnd(); ++it) { if((*it).endsWith(TQChar('\''))) { s_articlesApos += (*it); } @@ -581,11 +580,10 @@ long Field::getID() { } void Field::stripArticles(TQString& value) { - const TQStringList articles = Config::articleList(); - if(articles.isEmpty()) { + if(s_articles.isEmpty()) { return; } - for(TQStringList::ConstIterator it = articles.begin(); it != articles.end(); ++it) { + for(TQStringList::ConstIterator it = s_articles.constBegin(); it != s_articles.constEnd(); ++it) { TQRegExp rx(TQString::fromLatin1("\\b") + *it + TQString::fromLatin1("\\b")); value.remove(rx); } diff --git a/src/field.h b/src/field.h index f0b591a..c271705 100644 --- a/src/field.h +++ b/src/field.h @@ -385,6 +385,7 @@ private: FormatFlag m_formatFlag; StringMap m_properties; + static TQStringList s_articles; // need to remember articles with apostrophes for capitalization static TQStringList s_articlesApos; static TQRegExp s_delimiter; diff --git a/src/gui/counteditem.h b/src/gui/counteditem.h index 3aff0b7..4275696 100644 --- a/src/gui/counteditem.h +++ b/src/gui/counteditem.h @@ -39,8 +39,8 @@ public: int column, int width, int align); virtual int width(const TQFontMetrics& fm, const TQListView* lv, int c) const; - virtual int count() const { return childCount(); } - virtual int realChildCount() const { return count(); } + virtual size_t count() const { return childCount(); } + virtual size_t realChildCount() const { return count(); } }; } // end namespace diff --git a/src/gui/listview.h b/src/gui/listview.h index ccb0867..5e1137b 100644 --- a/src/gui/listview.h +++ b/src/gui/listview.h @@ -139,7 +139,7 @@ public: ListViewItem(ListViewItem* parent, const TQString& text) : TDEListViewItem(parent, text), m_sortWeight(-1) {} virtual ~ListViewItem(); - virtual int realChildCount() const { return childCount(); } + virtual size_t realChildCount() const { return childCount(); } virtual void clear(); virtual bool isEntryGroupItem() const { return false; } diff --git a/src/gui/tabcontrol.cpp b/src/gui/tabcontrol.cpp index f3c2bf2..92afec6 100644 --- a/src/gui/tabcontrol.cpp +++ b/src/gui/tabcontrol.cpp @@ -29,6 +29,9 @@ TQTabBar* TabControl::tabBar() const { void TabControl::setFocusToFirstChild() { TQWidget* page = currentPage(); Q_ASSERT(page); + if(!page) { + return; + } TQObjectList* list = page->queryList(TQWIDGET_OBJECT_NAME_STRING); for(TQObjectListIt it(*list); it.current(); ++it) { TQWidget* w = TQT_TQWIDGET(it.current()); diff --git a/src/image.cpp b/src/image.cpp index 8cb6fa4..cc015ae 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -14,6 +14,7 @@ #include "image.h" #include "imagefactory.h" #include "tellico_debug.h" +#include "tellico_utils.h" #include #include @@ -105,7 +106,7 @@ TQByteArray Image::byteArray(const TQImage& img_, const TQCString& outputFormat_ TQString Image::idClean(const TQString& id_) { static const TQRegExp rx('[' + TQRegExp::escape(TQString::fromLatin1("/@<>#\"&%?={}|^~[]'`\\:+")) + ']'); TQString clean = id_; - return clean.remove(rx); + return shareString(clean.remove(rx)); } void Image::setID(const TQString& id_) { diff --git a/src/imagefactory.cpp b/src/imagefactory.cpp index 574b199..0cc6acb 100644 --- a/src/imagefactory.cpp +++ b/src/imagefactory.cpp @@ -316,7 +316,7 @@ bool ImageFactory::writeCachedImage(const TQString& id_, CacheDir dir_, bool for const Tellico::Data::Image& ImageFactory::imageById(const TQString& id_) { if(id_.isEmpty()) { - myDebug() << "ImageFactory::imageById() - empty id" << endl; +// myDebug() << "ImageFactory::imageById() - empty id" << endl; return s_null; } // myLog() << "ImageFactory::imageById() - " << id_ << endl; @@ -348,7 +348,7 @@ const Tellico::Data::Image& ImageFactory::imageById(const TQString& id_) { if((s_imageInfoMap.contains(id_) && s_imageInfoMap[id_].linkOnly) || !KURL::isRelativeURL(id_)) { KURL u = id_; if(u.isValid()) { - return addImageImpl(u, false, KURL(), true); + return addImageImpl(u, true, KURL(), true); } } @@ -385,43 +385,53 @@ const Tellico::Data::Image& ImageFactory::imageById(const TQString& id_) { } } - // don't check Config::writeImagesInFile(), someday we might have problems - // and the image will exist in the data dir, but the app thinks everything should - // be in the zip file instead - bool exists = TQFile::exists(dataDir() + id_); - if(exists) { - // if we're loading from the application data dir, but images are being saved in the - // data file instead, then consider the document to be modified since it needs - // the image saved - if(Config::imageLocation() != Config::ImagesInAppDir) { + if(Config::imageLocation() == Config::ImagesInLocalDir) { + bool exists = TQFile::exists(localDir() + id_); + if(exists) { + const Data::Image& img2 = addCachedImageImpl(id_, LocalDir); + if(img2.isNull()) { + myDebug() << "ImageFactory::imageById() - tried to add from LocalDir, but failed: " << id_ << endl; + } else { +// myLog() << "...imageById() - found in local dir" << endl; + return img2; + } + } + // not an else statement, it might be null + if(TQFile::exists(dataDir() + id_)) { + // the img is in the other location + // consider the document to be modified since it needs the image saved Data::Document::self()->slotSetModified(true); + const Data::Image& img2 = addCachedImageImpl(id_, DataDir); + if(img2.isNull()) { + myDebug() << "ImageFactory::imageById() - tried to add from DataDir, but failed: " << id_ << endl; + } else { +// myLog() << "...imageById() - found in data dir" << endl; + return img2; + } } - const Data::Image& img2 = addCachedImageImpl(id_, DataDir); - if(img2.isNull()) { - myDebug() << "ImageFactory::imageById() - tried to add from DataDir, but failed: " << id_ << endl; - } else { -// myLog() << "...imageById() - found in data dir" << endl; - return img2; + } else if(Config::imageLocation() == Config::ImagesInAppDir) { + bool exists = TQFile::exists(dataDir() + id_); + if(exists) { + const Data::Image& img2 = addCachedImageImpl(id_, DataDir); + if(img2.isNull()) { + myDebug() << "ImageFactory::imageById() - tried to add from DataDir, but failed: " << id_ << endl; + } else { +// myLog() << "...imageById() - found in data dir" << endl; + return img2; + } } - } - // if localDir() == DataDir(), then there's nothing left to check - if(localDir() == dataDir()) { - return s_null; - } - exists = TQFile::exists(localDir() + id_); - if(exists) { - // if we're loading from the application data dir, but images are being saved in the - // data file instead, then consider the document to be modified since it needs - // the image saved - if(Config::imageLocation() != Config::ImagesInLocalDir) { + // not an else statement, it might be null + if(TQFile::exists(localDir() + id_)) { + // the img is in the other location + // consider the document to be modified since it needs the image saved Data::Document::self()->slotSetModified(true); - } - const Data::Image& img2 = addCachedImageImpl(id_, LocalDir); - if(img2.isNull()) { - myDebug() << "ImageFactory::imageById() - tried to add from LocalDir, but failed: " << id_ << endl; - } else { -// myLog() << "...imageById() - found in data dir" << endl; - return img2; + const Data::Image& img2 = addCachedImageImpl(id_, LocalDir); + if(img2.isNull()) { + myDebug() << "ImageFactory::imageById() - tried to add from LocalDir, but failed: " << id_ << endl; + } else { +// myLog() << "...imageById() - found in local dir" << endl; + return img2; + } } } myDebug() << "***ImageFactory::imageById() - not found: " << id_ << endl; diff --git a/src/isbnvalidator.cpp b/src/isbnvalidator.cpp index 4832cdd..d6ae49f 100644 --- a/src/isbnvalidator.cpp +++ b/src/isbnvalidator.cpp @@ -12,6 +12,7 @@ ***************************************************************************/ #include "isbnvalidator.h" +#include "upcvalidator.h" #include "tellico_debug.h" using Tellico::ISBNValidator; @@ -58,6 +59,13 @@ ISBNValidator::ISBNValidator(TQObject* parent_, const char* name_/*=0*/) } TQValidator::State ISBNValidator::validate(TQString& input_, int& pos_) const { + // check if it's a cuecat first + State catState = CueCat::decode(input_); + if(catState != Invalid) { + pos_ = input_.length(); + return catState; + } + if(input_.startsWith(TQString::fromLatin1("978")) || input_.startsWith(TQString::fromLatin1("979"))) { return validate13(input_, pos_); diff --git a/src/lccnvalidator.cpp b/src/lccnvalidator.cpp index cf0e850..b177d55 100644 --- a/src/lccnvalidator.cpp +++ b/src/lccnvalidator.cpp @@ -65,7 +65,7 @@ TQString LCCNValidator::formalize(const TQString& value_) { // now check for non digits in the serial pos = 0; - for( ; pos < serial.length() && serial.at(pos).isNumber(); ++pos) { ; } + for( ; pos < static_cast(serial.length()) && serial.at(pos).isNumber(); ++pos) { ; } TQString suffix = serial.mid(pos); serial = serial.left(pos); // serial must be left-padded with zeros to 6 characters diff --git a/src/listviewcomparison.cpp b/src/listviewcomparison.cpp index b78de94..c03d402 100644 --- a/src/listviewcomparison.cpp +++ b/src/listviewcomparison.cpp @@ -48,6 +48,8 @@ Tellico::ListViewComparison* Tellico::ListViewComparison::create(Data::ConstFiel return new DependentComparison(field_); } else if(field_->type() == Data::Field::Date || field_->formatFlag() == Data::Field::FormatDate) { return new ISODateComparison(field_); + } else if(field_->type() == Data::Field::Choice) { + return new ChoiceComparison(field_); } else if(field_->formatFlag() == Data::Field::FormatTitle) { // Dependent could be title, so put this test after return new TitleComparison(field_); @@ -277,3 +279,11 @@ int Tellico::ISODateComparison::compare(const TQString& str1, const TQString& st } return 0; } + +Tellico::ChoiceComparison::ChoiceComparison(Data::ConstFieldPtr field) : ListViewComparison(field) { + m_values = field->allowed(); +} + +int Tellico::ChoiceComparison::compare(const TQString& str1, const TQString& str2) { + return m_values.findIndex(str1) - m_values.findIndex(str2); +} diff --git a/src/listviewcomparison.h b/src/listviewcomparison.h index 28a3878..3615df4 100644 --- a/src/listviewcomparison.h +++ b/src/listviewcomparison.h @@ -112,5 +112,16 @@ protected: virtual int compare(const TQString& str1, const TQString& str2); }; +class ChoiceComparison : public ListViewComparison { +public: + ChoiceComparison(Data::ConstFieldPtr field); + +protected: + virtual int compare(const TQString& str1, const TQString& str2); + +private: + TQStringList m_values; +}; + } #endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 74451ac..54aac95 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -336,7 +336,7 @@ void MainWindow::initActions() { action = new TDEAction(actionCollection(), "file_import_csv"); action->setText(i18n("Import CSV Data...")); action->setToolTip(i18n("Import a CSV file")); - action->setIcon(MIME_ICON("text/x-csv")); + action->setIcon(MIME_ICON("text/csv")); importMenu->insert(action); connect(action, TQT_SIGNAL(activated()), importMapper, TQT_SLOT(map())); importMapper->setMapping(action, Import::CSV); @@ -506,7 +506,7 @@ void MainWindow::initActions() { action = new TDEAction(actionCollection(), "file_export_csv"); action->setText(i18n("Export to CSV...")); action->setToolTip(i18n("Export to a comma-separated values file")); - action->setIcon(MIME_ICON("text/x-csv")); + action->setIcon(MIME_ICON("text/csv")); exportMenu->insert(action); connect(action, TQT_SIGNAL(activated()), exportMapper, TQT_SLOT(map())); exportMapper->setMapping(action, Export::CSV); @@ -750,6 +750,7 @@ void MainWindow::initActions() { // want to update every time the filter text changes connect(m_quickFilter, TQT_SIGNAL(textChanged(const TQString&)), TQT_TQOBJECT(this), TQT_SLOT(slotQueueFilter())); + m_quickFilter->installEventFilter(this); // intercept keyEvents KWidgetAction* wAction = new KWidgetAction(m_quickFilter, i18n("Filter"), 0, 0, 0, actionCollection(), "quick_filter"); @@ -907,12 +908,12 @@ void MainWindow::saveOptions() { Config::setGroupViewSortAscending(m_groupView->ascendingSort()); if(m_loanView) { - Config::setLoanViewSortAscending(m_loanView->sortStyle()); // ok to use SortColumn key, save semantics + Config::setLoanViewSortColumn(m_loanView->sortStyle()); // ok to use SortColumn key, save semantics Config::setLoanViewSortAscending(m_loanView->ascendingSort()); } if(m_filterView) { - Config::setFilterViewSortAscending(m_filterView->sortStyle()); // ok to use SortColumn key, save semantics + Config::setFilterViewSortColumn(m_filterView->sortStyle()); // ok to use SortColumn key, save semantics Config::setFilterViewSortAscending(m_filterView->ascendingSort()); } @@ -991,7 +992,7 @@ void MainWindow::saveCollectionOptions(Data::CollPtr coll_) { configIndex = i; } } - uint limit = TQMIN(urls.count(), Config::maxCustomURLSettings()); + size_t limit = TQMIN(urls.count(), Config::maxCustomURLSettings()); for(uint i = 0; i < limit; ++i) { config.writeEntry(TQString::fromLatin1("URL_%1").arg(i), urls[i].url()); config.writeEntry(TQString::fromLatin1("Group By_%1").arg(i), groupBys[i]); @@ -1531,11 +1532,11 @@ void MainWindow::slotEntryCount() { return; } - int count = coll->entryCount(); + size_t count = coll->entryCount(); TQString text = i18n("Total entries: %1").arg(count); - int selectCount = Controller::self()->selectedEntries().count(); - int filterCount = m_detailedView->visibleItems(); + size_t selectCount = Controller::self()->selectedEntries().count(); + size_t filterCount = m_detailedView->visibleItems(); // if more than one book is selected, add the number of selected books if(filterCount < count && selectCount > 1) { text += TQChar(' '); @@ -1847,6 +1848,10 @@ void MainWindow::setFilter(const TQString& text_) { } else { // if it isn't valid, hold off on applying the filter TQRegExp tx(text); + if(!tx.isValid()) { + text = TQRegExp::escape(text); + tx.setPattern(text); + } if(!tx.isValid()) { myDebug() << "MainWindow::slotUpdateFilter() - invalid regexp: " << text << endl; return; @@ -2389,4 +2394,15 @@ void MainWindow::slotURLAction(const KURL& url_) { } } +bool MainWindow::eventFilter(TQObject* obj_, TQEvent* ev_) { + if(ev_->type() == TQEvent::KeyPress && obj_ == m_quickFilter) { + switch(static_cast(ev_)->key()) { + case TQt::Key_Escape: + m_quickFilter->clear(); + return true; + } + } + return false; +} + #include "mainwindow.moc" diff --git a/src/mainwindow.h b/src/mainwindow.h index 6b790e1..535085c 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -123,6 +123,8 @@ public: virtual void setFilter(const TQString& text); virtual bool showEntry(long id); + bool eventFilter(TQObject* watched, TQEvent* event); + public slots: /** * Initializes some stuff after the object is created. diff --git a/src/reportdialog.cpp b/src/reportdialog.cpp index c47766e..6f6533a 100644 --- a/src/reportdialog.cpp +++ b/src/reportdialog.cpp @@ -197,7 +197,7 @@ void ReportDialog::slotSaveAs() { if(!u.isEmpty() && u.isValid()) { TDEConfigGroup config(TDEGlobal::config(), "ExportOptions"); bool encode = config.readBoolEntry("EncodeUTF8", true); - int oldOpt = m_exporter->options(); + long oldOpt = m_exporter->options(); // turn utf8 off long options = oldOpt & ~Export::ExportUTF8; diff --git a/src/tellico_debug.h b/src/tellico_debug.h index ea65518..08a4912 100644 --- a/src/tellico_debug.h +++ b/src/tellico_debug.h @@ -22,7 +22,7 @@ // std::clock_t #include -// linux has __GNUC_PREREQ, NetBSD has __GNUC_PREQ__ +// linux has __GNUC_PREREQ, NetBSD has __GNUC_PREREQ__ #if defined(__GNUC_PREREQ) && !defined(__GNUC_PREREQ__) #define __GNUC_PREREQ__ __GNUC_PREREQ #endif diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index a0cdd59..3dc9d98 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -16,7 +16,7 @@ METASOURCES = AUTO DISTCLEANFILES = *~ *.Po $(CLEANFILES) isbntest_SOURCES = isbntest.cpp -isbntest_LDADD = ../isbnvalidator.o $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) +isbntest_LDADD = ../isbnvalidator.o ../upcvalidator.o $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) latin1test_SOURCES = latin1test.cpp latin1test_LDADD = $(LIB_QT) $(LIB_TDECORE) diff --git a/src/translators/Makefile.am b/src/translators/Makefile.am index fbbb11b..f0e8520 100644 --- a/src/translators/Makefile.am +++ b/src/translators/Makefile.am @@ -12,9 +12,9 @@ libtranslators_a_SOURCES = alexandriaexporter.cpp alexandriaimporter.cpp \ filelistingimporter.cpp freedb_util.cpp freedbimporter.cpp gcfilmsexporter.cpp \ gcfilmsimporter.cpp griffithimporter.cpp grs1importer.cpp htmlexporter.cpp libcsv.c \ onixexporter.cpp pdfimporter.cpp pilotdbexporter.cpp referencerimporter.cpp \ - risimporter.cpp tellico_xml.cpp tellicoimporter.cpp tellicoxmlexporter.cpp \ - tellicozipexporter.cpp textimporter.cpp xmlimporter.cpp xsltexporter.cpp xslthandler.cpp \ - xsltimporter.cpp + risimporter.cpp tellico_xml.cpp tellicoimporter.cpp tellicosaximporter.cpp \ + tellicoxmlexporter.cpp tellicoxmlhandler.cpp tellicozipexporter.cpp textimporter.cpp \ + xmlimporter.cpp xmlstatehandler.cpp xsltexporter.cpp xslthandler.cpp xsltimporter.cpp if !USE_LIBBTPARSE SUBDIR_LIBBTPARSE = btparse @@ -51,7 +51,10 @@ dcimporter.h dcimporter.cpp griffithimporter.h \ griffithimporter.cpp griffith2tellico.py pdfimporter.h \ pdfimporter.cpp referencerimporter.h referencerimporter.cpp \ libcsv.h libcsv.c \ -deliciousimporter.h deliciousimporter.cpp +deliciousimporter.h deliciousimporter.cpp \ +tellicosaximporter.h tellicosaximporter.cpp \ +tellicoxmlhandler.h tellicoxmlhandler.cpp \ +xmlstatehandler.h xmlstatehandler.cpp ####### tdevelop will overwrite this part!!! (end)############ @@ -68,3 +71,4 @@ KDE_OPTIONS = noautodist appdir = $(kde_datadir)/tellico app_DATA = bibtex-translation.xml app_SCRIPTS = griffith2tellico.py + diff --git a/src/translators/alexandriaexporter.cpp b/src/translators/alexandriaexporter.cpp index de64fbb..633864f 100644 --- a/src/translators/alexandriaexporter.cpp +++ b/src/translators/alexandriaexporter.cpp @@ -77,7 +77,7 @@ bool AlexandriaExporter::exec() { ProgressItem& item = ProgressManager::self()->newProgressItem(this, TQString(), false); item.setTotalSteps(entries().count()); ProgressItem::Done done(this); - const uint stepSize = TQMIN(1, entries().count()/100); + const uint stepSize = TQMAX(1, entries().count()/100); const bool showProgress = options() & ExportProgress; GUI::CursorSaver cs; diff --git a/src/translators/bibteximporter.cpp b/src/translators/bibteximporter.cpp index fb52f95..d3668d4 100644 --- a/src/translators/bibteximporter.cpp +++ b/src/translators/bibteximporter.cpp @@ -308,5 +308,47 @@ TQWidget* BibtexImporter::widget(TQWidget* parent_, const char* name_/*=0*/) { return m_widget; } +bool BibtexImporter::maybeBibtex(const KURL& url_) { + TQString text = FileHandler::readTextFile(url_, true /*quiet*/); + if(text.isEmpty()) { + return false; + } + + bt_initialize(); + TQRegExp rx(TQString::fromLatin1("[{}]")); + + ushort bt_options = 0; // ushort is defined in btparse.h + boolean ok; // boolean is defined in btparse.h as an int + bool foundOne = false; + int brace = 0; + int startpos = 0; + int pos = text.find(rx, 0); + while(pos > 0) { + if(text[pos] == '{') { + ++brace; + } else if(text[pos] == '}' && brace > 0) { + --brace; + } + if(brace == 0) { + TQString entry = text.mid(startpos, pos-startpos+1).stripWhiteSpace(); + // All the downstream text processing on the AST node will assume utf-8 + AST* node = bt_parse_entry_s(const_cast(entry.utf8().data()), + const_cast(url_.fileName().local8Bit().data()), + 0, bt_options, &ok); + if(ok && node) { + foundOne = true; + break; + } + startpos = pos+1; + } + pos = text.find(rx, pos+1); + } + if(foundOne) { + // clean up some structures + bt_parse_entry_s(0, 0, 1, 0, 0); + } + bt_cleanup(); + return foundOne; +} #include "bibteximporter.moc" diff --git a/src/translators/bibteximporter.h b/src/translators/bibteximporter.h index 6d1b878..09e1ec3 100644 --- a/src/translators/bibteximporter.h +++ b/src/translators/bibteximporter.h @@ -67,6 +67,8 @@ public: virtual TQWidget* widget(TQWidget* parent, const char* name=0); virtual bool canImport(int type) const; + static bool maybeBibtex(const KURL& url); + public slots: void slotCancel(); diff --git a/src/translators/csvimporter.cpp b/src/translators/csvimporter.cpp index 8a53ff9..d6198d0 100644 --- a/src/translators/csvimporter.cpp +++ b/src/translators/csvimporter.cpp @@ -50,15 +50,26 @@ extern "C" { using Tellico::Import::CSVImporter; +typedef int(*SpaceFunc)(char); + static void writeToken(char* buffer, size_t len, void* data); static void writeRow(char buffer, void* data); +static int isSpace(char c); +static int isSpaceOrTab(char c); +static int isTab(char c); class CSVImporter::Parser { public: Parser(const TQString& str) : stream(new TQTextIStream(&str)) { csv_init(&parser, 0); } ~Parser() { csv_free(parser); delete stream; stream = 0; } - void setDelimiter(const TQString& s) { Q_ASSERT(s.length() == 1); csv_set_delim(parser, s[0].latin1()); } + void setDelimiter(const TQString& s) { + Q_ASSERT(s.length() == 1); + csv_set_delim(parser, s[0].latin1()); + if(s[0] == '\t') csv_set_space_func(parser, isSpace); + else if(s[0] == ' ') csv_set_space_func(parser, isTab); + else csv_set_space_func(parser, isSpaceOrTab); + } void reset(const TQString& str) { delete stream; stream = new TQTextIStream(&str); }; bool hasNext() { return !stream->atEnd(); } void skipLine() { stream->readLine(); } @@ -95,6 +106,21 @@ static void writeRow(char c, void* data) { p->setRowDone(true); } +static int isSpace(char c) { + if (c == CSV_SPACE) return 1; + return 0; +} + +static int isSpaceOrTab(char c) { + if (c == CSV_SPACE || c == CSV_TAB) return 1; + return 0; +} + +static int isTab(char c) { + if (c == CSV_TAB) return 1; + return 0; +} + CSVImporter::CSVImporter(const KURL& url_) : Tellico::Import::TextImporter(url_), m_coll(0), m_existingCollection(0), diff --git a/src/translators/deliciousimporter.cpp b/src/translators/deliciousimporter.cpp index a82c006..be6fe3e 100644 --- a/src/translators/deliciousimporter.cpp +++ b/src/translators/deliciousimporter.cpp @@ -35,7 +35,9 @@ DeliciousImporter::DeliciousImporter(const KURL& url_) : XSLTImporter(url_) { } bool DeliciousImporter::canImport(int type) const { - return type == Data::Collection::Book; + return type == Data::Collection::Book || + type == Data::Collection::Video || + type == Data::Collection::Game; } Tellico::Data::CollPtr DeliciousImporter::collection() { @@ -51,7 +53,18 @@ Tellico::Data::CollPtr DeliciousImporter::collection() { << TQString::fromLatin1("Medium Covers/") << TQString::fromLatin1("Small Covers/") << TQString::fromLatin1("Plain Covers/"); - const TQString commField = TQString::fromLatin1("comments"); + TQString commField; + switch(coll->type()) { + case Data::Collection::Book: + commField = TQString::fromLatin1("comments"); break; + case Data::Collection::Video: + commField = TQString::fromLatin1("plot"); break; + case Data::Collection::Game: + commField = TQString::fromLatin1("description"); break; + default: + myWarning() << "bad collection type:" << coll->type() << endl; + } + const TQString uuidField = TQString::fromLatin1("uuid"); const TQString coverField = TQString::fromLatin1("cover"); const bool isLocal = url().isLocalFile(); diff --git a/src/translators/freedb_util.cpp b/src/translators/freedb_util.cpp index 07292af..2a2e5ed 100644 --- a/src/translators/freedb_util.cpp +++ b/src/translators/freedb_util.cpp @@ -365,7 +365,7 @@ FreeDBImporter::CDText FreeDBImporter::getCDText(const TQCString& drive_) { } } if(cdtext.trackTitles.size() != cdtext.trackArtists.size()) { - int size = TQMAX(cdtext.trackTitles.size(), cdtext.trackArtists.size()); + size_t size = TQMAX(cdtext.trackTitles.size(), cdtext.trackArtists.size()); cdtext.trackTitles.resize(size); cdtext.trackArtists.resize(size); } diff --git a/src/translators/htmlexporter.cpp b/src/translators/htmlexporter.cpp index e27d6e5..e8bb95d 100644 --- a/src/translators/htmlexporter.cpp +++ b/src/translators/htmlexporter.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -192,6 +193,9 @@ bool HTMLExporter::loadXSLTFile() { m_handler = 0; return false; } + m_handler->addStringParam("date", TQDate::currentDate().toString(TQt::ISODate).latin1()); + m_handler->addStringParam("time", TQTime::currentTime().toString(TQt::ISODate).latin1()); + m_handler->addStringParam("user", KUser(KUser::UseRealUserID).loginName().latin1()); if(m_exportEntryFiles) { // export entries to same place as all the other date files diff --git a/src/translators/risimporter.cpp b/src/translators/risimporter.cpp index 735368c..0158708 100644 --- a/src/translators/risimporter.cpp +++ b/src/translators/risimporter.cpp @@ -188,7 +188,7 @@ void RISImporter::readURL(const KURL& url_, int n, const TQDict& ri // technically, the spec requires a space immediately after the hyphen // however, at least one website (Springer) outputs RIS with no space after the final "ER -" // so just strip the white space later - // also be gracious and allow only any amount of space before hyphen + // also be gracious and allow any amount of space before hyphen TQRegExp rx(TQString::fromLatin1("^(\\w\\w)\\s+-(.*)$")); TQString currLine, nextLine; for(currLine = t.readLine(); !m_cancelled && !currLine.isNull(); currLine = nextLine, j += currLine.length()) { @@ -312,4 +312,25 @@ void RISImporter::slotCancel() { m_cancelled = true; } +bool RISImporter::maybeRIS(const KURL& url_) { + TQString text = FileHandler::readTextFile(url_, true /*quiet*/); + if(text.isEmpty()) { + return false; + } + + // bare bones check, strip white space at beginning + // and then first text line must be valid RIS + TQTextIStream t(&text); + + TQRegExp rx(TQString::fromLatin1("^(\\w\\w)\\s+-(.*)$")); + TQString currLine; + for(currLine = t.readLine(); !currLine.isNull(); currLine = t.readLine()) { + if(currLine.stripWhiteSpace().isEmpty()) { + continue; + } + break; + } + return rx.exactMatch(currLine); +} + #include "risimporter.moc" diff --git a/src/translators/risimporter.h b/src/translators/risimporter.h index fa581ba..a572283 100644 --- a/src/translators/risimporter.h +++ b/src/translators/risimporter.h @@ -50,6 +50,8 @@ public: virtual TQWidget* widget(TQWidget*, const char*) { return 0; } virtual bool canImport(int type) const; + static bool maybeRIS(const KURL& url); + public slots: void slotCancel(); diff --git a/src/translators/tellico_xml.cpp b/src/translators/tellico_xml.cpp index bcfb412..3a927d6 100644 --- a/src/translators/tellico_xml.cpp +++ b/src/translators/tellico_xml.cpp @@ -63,6 +63,12 @@ TQString Tellico::XML::dtdTellico(int version) { return TQString::fromLatin1("http://periapsis.org/tellico/dtd/v%1/tellico.dtd").arg(version); } +// returns true if the file has to be converted +// version 9 to 10 requires no conversion since it only added board games +bool Tellico::XML::versionConversion(uint from, uint to) { + return from < to && (from != 9 || to != 10); +} + bool Tellico::XML::validXMLElementName(const TQString& name_) { return xmlValidateNameValue((xmlChar *)name_.utf8().data()); } diff --git a/src/translators/tellico_xml.h b/src/translators/tellico_xml.h index 6ff4c1b..6ffda10 100644 --- a/src/translators/tellico_xml.h +++ b/src/translators/tellico_xml.h @@ -28,6 +28,8 @@ namespace Tellico { TQString pubTellico(int version = syntaxVersion); TQString dtdTellico(int version = syntaxVersion); + bool versionConversion(uint from, uint to); + extern const TQString nsBookcase; extern const TQString nsDublinCore; extern const TQString nsZing; diff --git a/src/translators/tellicoimporter.cpp b/src/translators/tellicoimporter.cpp index a8dfb62..d722c0c 100644 --- a/src/translators/tellicoimporter.cpp +++ b/src/translators/tellicoimporter.cpp @@ -39,11 +39,6 @@ using Tellico::Import::TellicoImporter; -bool TellicoImporter::versionConversion(uint from, uint to) { - // version 10 only added board games to version 9 - return from < to && (from != 9 || to != 10); -} - TellicoImporter::TellicoImporter(const KURL& url_, bool loadAllImages_) : DataImporter(url_), m_coll(0), m_loadAllImages(loadAllImages_), m_format(Unknown), m_modified(false), m_cancelled(false), m_hasImages(false), m_buffer(0), m_zip(0), m_imgDir(0) { @@ -157,7 +152,7 @@ void TellicoImporter::loadXMLData(const TQByteArray& data_, bool loadImages_) { } m_format = Error; return; - } else if(versionConversion(syntaxVersion, XML::syntaxVersion)) { + } else if(XML::versionConversion(syntaxVersion, XML::syntaxVersion)) { // going form version 9 to 10, there's no conversion needed TQString str = i18n("Tellico is converting the file to a more recent document format. " "Information loss may occur if an older version of Tellico is used " @@ -374,7 +369,7 @@ void TellicoImporter::readField(uint syntaxVersion_, const TQDomElement& elem_) Data::FieldPtr field; if(type == Data::Field::Choice) { - TQStringList allowed = TQStringList::split(TQString::fromLatin1(";"), + TQStringList allowed = TQStringList::split(TQRegExp(TQString::fromLatin1("\\s*;\\s*")), elem_.attribute(TQString::fromLatin1("allowed"))); if(isI18n) { for(TQStringList::Iterator it = allowed.begin(); it != allowed.end(); ++it) { @@ -652,8 +647,9 @@ void TellicoImporter::readEntry(uint syntaxVersion_, const TQDomElement& entryEl void TellicoImporter::readImage(const TQDomElement& elem_, bool loadImage_) { TQString format = elem_.attribute(TQString::fromLatin1("format")); const bool link = elem_.attribute(TQString::fromLatin1("link")) == Latin1Literal("true"); - TQString id = shareString(link ? elem_.attribute(TQString::fromLatin1("id")) - : Data::Image::idClean(elem_.attribute(TQString::fromLatin1("id")))); + // idClean() already calls shareString() + TQString id = link ? shareString(elem_.attribute(TQString::fromLatin1("id"))) + : Data::Image::idClean(elem_.attribute(TQString::fromLatin1("id"))); bool readInfo = true; if(loadImage_) { diff --git a/src/translators/tellicoimporter.h b/src/translators/tellicoimporter.h index 93cf7da..6ea0ac5 100644 --- a/src/translators/tellicoimporter.h +++ b/src/translators/tellicoimporter.h @@ -70,8 +70,6 @@ public slots: void slotCancel(); private: - static bool versionConversion(uint from, uint to); - void loadXMLData(const TQByteArray& data, bool loadImages); void loadZipData(); diff --git a/src/translators/tellicosaximporter.cpp b/src/translators/tellicosaximporter.cpp new file mode 100644 index 0000000..de60c63 --- /dev/null +++ b/src/translators/tellicosaximporter.cpp @@ -0,0 +1,293 @@ +/*************************************************************************** + copyright : (C) 2008 by Robby Stephenson + email : robby@periapsis.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +// before tellicosaxmporter.h because of QT_NO_CAST_ASCII issues +#include "tellicoxmlhandler.h" +#include "tellicosaximporter.h" +#include "tellico_xml.h" +#include "../collectionfactory.h" +#include "../collections/bibtexcollection.h" +#include "../entry.h" +#include "../field.h" +#include "../imagefactory.h" +#include "../image.h" +#include "../isbnvalidator.h" +#include "../latin1literal.h" +#include "../tellico_strings.h" +#include "../tellico_kernel.h" +#include "../tellico_utils.h" +#include "../tellico_debug.h" +#include "../progressmanager.h" + +#include +#include +#include +#include + +#include +#include +#include + +using Tellico::Import::TellicoSaxImporter; + +TellicoSaxImporter::TellicoSaxImporter(const KURL& url_, bool loadAllImages_) : DataImporter(url_), + m_coll(0), m_loadAllImages(loadAllImages_), m_format(Unknown), m_modified(false), + m_cancelled(false), m_hasImages(false), m_buffer(0), m_zip(0), m_imgDir(0) { +} + +TellicoSaxImporter::TellicoSaxImporter(const TQString& text_) : DataImporter(text_), + m_coll(0), m_loadAllImages(true), m_format(Unknown), m_modified(false), + m_cancelled(false), m_hasImages(false), m_buffer(0), m_zip(0), m_imgDir(0) { +} + +TellicoSaxImporter::~TellicoSaxImporter() { + if(m_zip) { + m_zip->close(); + } + delete m_zip; + m_zip = 0; + delete m_buffer; + m_buffer = 0; +} + +Tellico::Data::CollPtr TellicoSaxImporter::collection() { + if(m_coll) { + return m_coll; + } + + TQCString s; // read first 5 characters + if(source() == URL) { + if(!fileRef().open()) { + return 0; + } + TQIODevice* f = fileRef().file(); + for(uint i = 0; i < 5; ++i) { + s += static_cast(f->getch()); + } + f->reset(); + } else { + if(data().size() < 5) { + m_format = Error; + return 0; + } + s = TQCString(data(), 6); + } + + // need to decide if the data is xml text, or a zip file + // if the first 5 characters are readAll() : data(), true); + } else { + m_format = Zip; + loadZipData(); + } + return m_coll; +} + +void TellicoSaxImporter::loadXMLData(const TQByteArray& data_, bool loadImages_) { + ProgressItem& item = ProgressManager::self()->newProgressItem(this, progressLabel(), true); + item.setTotalSteps(data_.size()); + connect(&item, SIGNAL(signalCancelled(ProgressItem*)), SLOT(slotCancel())); + ProgressItem::Done done(this); + + const bool showProgress = options() & ImportProgress; + + TellicoXMLHandler handler; + handler.setLoadImages(loadImages_); + + TQXmlSimpleReader reader; + reader.setContentHandler(&handler); + + TQXmlInputSource source; + bool success = reader.parse(&source, true); + + const uint blockSize = data_.size()/100 + 1; + uint pos = 0; + TQByteArray block; + + while(success && !m_cancelled && pos < data_.size()) { + uint size = TQMIN(blockSize, data_.size() - pos); + block.setRawData(data_.data() + pos, size); + source.setData(block); + success = reader.parseContinue(); + block.resetRawData(data_.data() + pos, size); + pos += blockSize; + if(showProgress) { + ProgressManager::self()->setProgress(this, pos); + kapp->processEvents(); + } + } + + if(!success) { + m_format = Error; + TQString error; + if(!url().isEmpty()) { + error = i18n(errorLoad).arg(url().fileName()) + TQChar('\n'); + } + error += handler.errorString(); + myDebug() << error << endl; + setStatusMessage(error); + return; + } + + if(!m_cancelled) { + m_hasImages = handler.hasImages(); + m_coll = handler.collection(); + } +} + +void TellicoSaxImporter::loadZipData() { + delete m_buffer; + delete m_zip; + if(source() == URL) { + m_buffer = 0; + m_zip = new KZip(fileRef().fileName()); + } else { + m_buffer = new TQBuffer(data()); + m_zip = new KZip(m_buffer); + } + if(!m_zip->open(IO_ReadOnly)) { + setStatusMessage(i18n(errorLoad).arg(url().fileName())); + m_format = Error; + delete m_zip; + m_zip = 0; + delete m_buffer; + m_buffer = 0; + return; + } + + const KArchiveDirectory* dir = m_zip->directory(); + if(!dir) { + TQString str = i18n(errorLoad).arg(url().fileName()) + TQChar('\n'); + str += i18n("The file is empty."); + setStatusMessage(str); + m_format = Error; + m_zip->close(); + delete m_zip; + m_zip = 0; + delete m_buffer; + m_buffer = 0; + return; + } + + // main file was changed from bookcase.xml to tellico.xml as of version 0.13 + const KArchiveEntry* entry = dir->entry(TQString::fromLatin1("tellico.xml")); + if(!entry) { + entry = dir->entry(TQString::fromLatin1("bookcase.xml")); + } + if(!entry || !entry->isFile()) { + TQString str = i18n(errorLoad).arg(url().fileName()) + TQChar('\n'); + str += i18n("The file contains no collection data."); + setStatusMessage(str); + m_format = Error; + m_zip->close(); + delete m_zip; + m_zip = 0; + delete m_buffer; + m_buffer = 0; + return; + } + + const TQByteArray xmlData = static_cast(entry)->data(); + loadXMLData(xmlData, false); + if(!m_coll) { + m_format = Error; + m_zip->close(); + delete m_zip; + m_zip = 0; + delete m_buffer; + m_buffer = 0; + return; + } + + if(m_cancelled) { + m_zip->close(); + delete m_zip; + m_zip = 0; + delete m_buffer; + m_buffer = 0; + return; + } + + const KArchiveEntry* imgDirEntry = dir->entry(TQString::fromLatin1("images")); + if(!imgDirEntry || !imgDirEntry->isDirectory()) { + m_zip->close(); + delete m_zip; + m_zip = 0; + delete m_buffer; + m_buffer = 0; + return; + } + m_imgDir = static_cast(imgDirEntry); + m_images.clear(); + m_images.add(m_imgDir->entries()); + m_hasImages = !m_images.isEmpty(); + + // if all the images are not to be loaded, then we're done + if(!m_loadAllImages) { +// myLog() << "TellicoSaxImporter::loadZipData() - delayed loading for " << m_images.count() << " images" << endl; + return; + } + + const TQStringList images = static_cast(imgDirEntry)->entries(); + const uint stepSize = TQMAX(s_stepSize, images.count()/100); + + uint j = 0; + for(TQStringList::ConstIterator it = images.begin(); !m_cancelled && it != images.end(); ++it, ++j) { + const KArchiveEntry* file = m_imgDir->entry(*it); + if(file && file->isFile()) { + ImageFactory::addImage(static_cast(file)->data(), + (*it).section('.', -1).upper(), (*it)); + m_images.remove(*it); + } + if(j%stepSize == 0) { + kapp->processEvents(); + } + } + + if(m_images.isEmpty()) { + // give it some time + TQTimer::singleShot(3000, this, SLOT(deleteLater())); + } +} + +bool TellicoSaxImporter::hasImages() const { + return m_hasImages; +} + +bool TellicoSaxImporter::loadImage(const TQString& id_) { +// myLog() << "TellicoSaxImporter::loadImage() - id = " << id_ << endl; + if(m_format != Zip || !m_imgDir) { + return false; + } + const KArchiveEntry* file = m_imgDir->entry(id_); + if(!file || !file->isFile()) { + return false; + } + TQString newID = ImageFactory::addImage(static_cast(file)->data(), + id_.section('.', -1).upper(), id_); + m_images.remove(id_); + if(m_images.isEmpty()) { + // give it some time + TQTimer::singleShot(3000, this, SLOT(deleteLater())); + } + return !newID.isEmpty(); +} + +void TellicoSaxImporter::slotCancel() { + m_cancelled = true; + m_format = Cancel; +} + +#include "tellicosaximporter.moc" diff --git a/src/translators/tellicosaximporter.h b/src/translators/tellicosaximporter.h new file mode 100644 index 0000000..056f60f --- /dev/null +++ b/src/translators/tellicosaximporter.h @@ -0,0 +1,87 @@ +/*************************************************************************** + copyright : (C) 2008 by Robby Stephenson + email : robby@periapsis.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#ifndef TELLICO_IMPORT_TELLICOSAXIMPORTER_H +#define TELLICO_IMPORT_TELLICOSAXIMPORTER_H + +#include "dataimporter.h" +#include "../datavectors.h" +#include "../stringset.h" + +class TQBuffer; +class KZip; +class KArchiveDirectory; + +namespace Tellico { + namespace Import { + +/** + * @author Robby Stephenson + */ +class TellicoSaxImporter : public DataImporter { +Q_OBJECT + +public: + enum Format { Unknown, Error, XML, Zip, Cancel }; + + /** + * @param url The tellico data file. + */ + TellicoSaxImporter(const KURL& url, bool loadAllImages=true); + /** + * Constructor used to convert arbitrary text to a @ref Collection + * + * @param text The text + */ + TellicoSaxImporter(const TQString& text); + virtual ~TellicoSaxImporter(); + + /** + * sometimes, a new document format might add data + */ + bool modifiedOriginal() const { return m_modified; } + + /** + */ + virtual Data::CollPtr collection(); + Format format() const { return m_format; } + + bool hasImages() const; + bool loadImage(const TQString& id_); + + static bool loadAllImages(const KURL& url); + +public slots: + void slotCancel(); + +private: + void loadXMLData(const TQByteArray& data, bool loadImages); + void loadZipData(); + + Data::CollPtr m_coll; + bool m_loadAllImages; + TQString m_namespace; + Format m_format; + bool m_modified : 1; + bool m_cancelled : 1; + bool m_hasImages : 1; + StringSet m_images; + + TQBuffer* m_buffer; + KZip* m_zip; + const KArchiveDirectory* m_imgDir; +}; + + } // end namespace +} // end namespace +#endif diff --git a/src/translators/tellicoxmlhandler.cpp b/src/translators/tellicoxmlhandler.cpp new file mode 100644 index 0000000..5b3f063 --- /dev/null +++ b/src/translators/tellicoxmlhandler.cpp @@ -0,0 +1,74 @@ +/*************************************************************************** + copyright : (C) 2008 by Robby Stephenson + email : robby@periapsis.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#include "tellicoxmlhandler.h" +#include "../collection.h" +#include "../tellico_debug.h" + +using Tellico::Import::TellicoXMLHandler; + +TellicoXMLHandler::TellicoXMLHandler() : TQXmlDefaultHandler(), m_data(new SAX::StateData) { + m_handlers.setAutoDelete(true); + m_handlers.push(new SAX::RootHandler(m_data)); +} + +TellicoXMLHandler::~TellicoXMLHandler() { + delete m_data; + m_data = 0; +} + +bool TellicoXMLHandler::startElement(const TQString& nsURI_, const TQString& localName_, + const TQString& qName_, const TQXmlAttributes& atts_) { + SAX::StateHandler* handler = m_handlers.top()->nextHandler(nsURI_, localName_, qName_); + Q_ASSERT(handler); + m_handlers.push(handler); + return handler->start(nsURI_, localName_, qName_, atts_); +} + +bool TellicoXMLHandler::endElement(const TQString& nsURI_, const TQString& localName_, + const TQString& qName_) { + m_data->text = m_data->text.stripWhiteSpace(); +/* + if(!m_data->text.isEmpty()) { + myDebug() << " text: " << m_text << endl; + } +*/ + + SAX::StateHandler* handler = m_handlers.pop(); + bool res = handler->end(nsURI_, localName_, qName_); + // need to reset character data, too + m_data->text = TQString(); + delete handler; + return res; +} + +bool TellicoXMLHandler::characters(const TQString& ch_) { + m_data->text += ch_; + return true; +} + +TQString TellicoXMLHandler::errorString() { + return m_data->error; +} + +Tellico::Data::CollPtr TellicoXMLHandler::collection() const { + return m_data->coll; +} + +bool TellicoXMLHandler::hasImages() const { + return m_data->hasImages; +} + +void TellicoXMLHandler::setLoadImages(bool loadImages_) { + m_data->loadImages = loadImages_; +} diff --git a/src/translators/tellicoxmlhandler.h b/src/translators/tellicoxmlhandler.h new file mode 100644 index 0000000..1edeacc --- /dev/null +++ b/src/translators/tellicoxmlhandler.h @@ -0,0 +1,49 @@ +/*************************************************************************** + copyright : (C) 2008 by Robby Stephenson + email : robby@periapsis.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#ifndef TELLICO_IMPORT_TELLICOXMLHANDLER_H +#define TELLICO_IMPORT_TELLICOXMLHANDLER_H + +#include "xmlstatehandler.h" + +#include + +namespace Tellico { + namespace Import { + +class TellicoXMLHandler : public TQXmlDefaultHandler { +public: + TellicoXMLHandler(); + ~TellicoXMLHandler(); + + virtual bool startElement(const TQString& namespaceURI, const TQString& localName, + const TQString& qName, const TQXmlAttributes& atts); + virtual bool endElement(const TQString& namespaceURI, const TQString& localName, + const TQString& qName); + virtual bool characters(const TQString& ch); + + virtual TQString errorString(); + + Data::CollPtr collection() const; + bool hasImages() const; + + void setLoadImages(bool loadImages); + +private: + TQPtrStack m_handlers; + SAX::StateData* m_data; +}; + + } +} +#endif diff --git a/src/translators/xmlstatehandler.cpp b/src/translators/xmlstatehandler.cpp new file mode 100644 index 0000000..48d52d6 --- /dev/null +++ b/src/translators/xmlstatehandler.cpp @@ -0,0 +1,772 @@ +/*************************************************************************** + copyright : (C) 2008 by Robby Stephenson + email : robby@periapsis.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#include "xmlstatehandler.h" +#include "tellico_xml.h" +#include "../latin1literal.h" +#include "../collection.h" +#include "../collectionfactory.h" +#include "../collections/bibtexcollection.h" +#include "../image.h" +#include "../imagefactory.h" +#include "../isbnvalidator.h" +#include "../tellico_utils.h" +#include "../tellico_debug.h" + +#include +#include + +namespace { + +inline +TQString attValue(const TQXmlAttributes& atts, const char* name, const TQString& defaultValue=TQString()) { + int idx = atts.index(TQString::fromLatin1(name)); + return idx < 0 ? defaultValue : atts.value(idx); +} + +inline +TQString attValue(const TQXmlAttributes& atts, const char* name, const char* defaultValue) { + Q_ASSERT(defaultValue); + return attValue(atts, name, TQString::fromLatin1(defaultValue)); +} + +} + +using Tellico::Import::SAX::StateHandler; +using Tellico::Import::SAX::NullHandler; +using Tellico::Import::SAX::RootHandler; +using Tellico::Import::SAX::DocumentHandler; +using Tellico::Import::SAX::CollectionHandler; +using Tellico::Import::SAX::FieldsHandler; +using Tellico::Import::SAX::FieldHandler; +using Tellico::Import::SAX::FieldPropertyHandler; +using Tellico::Import::SAX::BibtexPreambleHandler; +using Tellico::Import::SAX::BibtexMacrosHandler; +using Tellico::Import::SAX::BibtexMacroHandler; +using Tellico::Import::SAX::EntryHandler; +using Tellico::Import::SAX::FieldValueContainerHandler; +using Tellico::Import::SAX::FieldValueHandler; +using Tellico::Import::SAX::DateValueHandler; +using Tellico::Import::SAX::TableColumnHandler; +using Tellico::Import::SAX::ImagesHandler; +using Tellico::Import::SAX::ImageHandler; +using Tellico::Import::SAX::FiltersHandler; +using Tellico::Import::SAX::FilterHandler; +using Tellico::Import::SAX::FilterRuleHandler; +using Tellico::Import::SAX::BorrowersHandler; +using Tellico::Import::SAX::BorrowerHandler; +using Tellico::Import::SAX::LoanHandler; + +StateHandler* StateHandler::nextHandler(const TQString& ns_, const TQString& localName_, const TQString& qName_) { + StateHandler* handler = nextHandlerImpl(ns_, localName_, qName_); + if(!handler) { + myWarning() << "StateHandler::nextHandler() - no handler for " << localName_ << endl; + } + return handler ? handler : new NullHandler(d); +} + +StateHandler* RootHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("tellico") || localName_ == Latin1Literal("bookcase")) { + return new DocumentHandler(d); + } + return new RootHandler(d); +} + +StateHandler* DocumentHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("collection")) { + return new CollectionHandler(d); + } else if(localName_ == Latin1Literal("filters")) { + return new FiltersHandler(d); + } else if(localName_ == Latin1Literal("borrowers")) { + return new BorrowersHandler(d); + } + return 0; +} + +bool DocumentHandler::start(const TQString&, const TQString& localName_, const TQString&, const TQXmlAttributes& atts_) { + // the syntax version field name changed from "version" to "syntaxVersion" in version 3 + int idx = atts_.index(TQString::fromLatin1("syntaxVersion")); + if(idx < 0) { + idx = atts_.index(TQString::fromLatin1("version")); + } + if(idx < 0) { + myWarning() << "RootHandler::start() - no syntax version" << endl; + return false; + } + d->syntaxVersion = atts_.value(idx).toUInt(); + if(d->syntaxVersion > Tellico::XML::syntaxVersion) { + d->error = i18n("It is from a future version of Tellico."); + return false; + } else if(Tellico::XML::versionConversion(d->syntaxVersion, Tellico::XML::syntaxVersion)) { + // going from version 9 to 10, there's no conversion needed + TQString str = i18n("Tellico is converting the file to a more recent document format. " + "Information loss may occur if an older version of Tellico is used " + "to read this file in the future."); + myDebug() << str << endl; + } + if((d->syntaxVersion > 6 && localName_ != Latin1Literal("tellico")) || + (d->syntaxVersion < 7 && localName_ != Latin1Literal("bookcase"))) { + // no error message + myWarning() << "RootHandler::start() - bad root element name" << endl; + return false; + } + d->ns = d->syntaxVersion > 6 ? Tellico::XML::nsTellico : Tellico::XML::nsBookcase; + return true; +} + +bool DocumentHandler::end(const TQString&, const TQString&, const TQString&) { + return true; +} + +StateHandler* CollectionHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if((d->syntaxVersion > 3 && localName_ == Latin1Literal("fields")) || + (d->syntaxVersion < 4 && localName_ == Latin1Literal("attributes"))) { + return new FieldsHandler(d); + } else if(localName_ == Latin1Literal("bibtex-preamble")) { + return new BibtexPreambleHandler(d); + } else if(localName_ == Latin1Literal("macros")) { + return new BibtexMacrosHandler(d); + } else if(localName_ == d->entryName) { + return new EntryHandler(d); + } else if(localName_ == Latin1Literal("images")) { + return new ImagesHandler(d); + } + return 0; +} + +bool CollectionHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + d->collTitle = attValue(atts_, "title"); + d->collType = attValue(atts_, "type").toInt(); + d->entryName = attValue(atts_, "unit"); + + Q_ASSERT(d->collType); + return true; +} + +bool CollectionHandler::end(const TQString&, const TQString&, const TQString&) { + d->coll->addEntries(d->entries); + // a little hidden capability was to just have a local path as an image file name + // and on reading the xml file, Tellico would load the image file, too + // here, we need to scan all the image values in all the entries and check + // maybe this is too costly, especially since the capability wasn't advertised? + Data::FieldVec fields = d->coll->imageFields(); + for(Data::EntryVecIt entry = d->entries.begin(); entry != d->entries.end(); ++entry) { + for(Data::FieldVecIt field = fields.begin(); field != fields.end(); ++field) { + TQString value = entry->field(field, false); + // image info should have already been loaded + const Data::ImageInfo& info = ImageFactory::imageInfo(value); + // possible that value needs to be cleaned first in which case info is null + if(info.isNull() || !info.linkOnly) { + // for local files only, allow paths here + KURL u = KURL::fromPathOrURL(value); + if(u.isValid() && u.isLocalFile()) { + TQString result = ImageFactory::addImage(u, false /* quiet */); + if(!result.isEmpty()) { + value = result; + } + } + value = Data::Image::idClean(value); + entry->setField(field->name(), value); + } + } + } + return true; +} + +StateHandler* FieldsHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if((d->syntaxVersion > 3 && localName_ == Latin1Literal("field")) || + (d->syntaxVersion < 4 && localName_ == Latin1Literal("attribute"))) { + return new FieldHandler(d); + } + return 0; +} + +bool FieldsHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { + d->defaultFields = false; + return true; +} + +bool FieldsHandler::end(const TQString&, const TQString&, const TQString&) { + // add default fields if there was a default field name, or no names at all + const bool addFields = d->defaultFields || d->fields.isEmpty(); + // in syntax 4, the element name was changed to "entry", always, rather than depending on + // on the entryName of the collection. + if(d->syntaxVersion > 3) { + d->entryName = TQString::fromLatin1("entry"); + Data::Collection::Type type = static_cast(d->collType); + d->coll = CollectionFactory::collection(type, addFields); + } else { + d->coll = CollectionFactory::collection(d->entryName, addFields); + } + + if(!d->collTitle.isEmpty()) { + d->coll->setTitle(d->collTitle); + } + + d->coll->addFields(d->fields); + +// as a special case, for old book collections with a bibtex-id field, convert to Bibtex + if(d->syntaxVersion < 4 && d->collType == Data::Collection::Book + && d->coll->hasField(TQString::fromLatin1("bibtex-id"))) { + d->coll = Data::BibtexCollection::convertBookCollection(d->coll); + } + + return true; +} + +StateHandler* FieldHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("prop")) { + return new FieldPropertyHandler(d); + } + return 0; +} + +bool FieldHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + // special case: if the i18n attribute equals true, then translate the title, description, and category + const bool isI18n = attValue(atts_, "i18n") == Latin1Literal("true"); + + TQString name = attValue(atts_, "name", "unknown"); + if(name == Latin1Literal("_default")) { + d->defaultFields = true; + return true; + } + + TQString title = attValue(atts_, "title", i18n("Unknown")); + if(isI18n) { + title = i18n(title.utf8()); + } + + TQString typeStr = attValue(atts_, "type", TQString::number(Data::Field::Line)); + Data::Field::Type type = static_cast(typeStr.toInt()); + + Data::FieldPtr field; + if(type == Data::Field::Choice) { + TQStringList allowed = TQStringList::split(TQRegExp(TQString::fromLatin1("\\s*;\\s*")), + attValue(atts_, "allowed")); + if(isI18n) { + for(TQStringList::Iterator word = allowed.begin(); word != allowed.end(); ++word) { + (*word) = i18n((*word).utf8()); + } + } + field = new Data::Field(name, title, allowed); + } else { + field = new Data::Field(name, title, type); + } + + int idx = atts_.index(TQString::fromLatin1("category")); + if(idx > -1) { + // at one point, the categories had keyboard accels + TQString cat = atts_.value(idx); + if(d->syntaxVersion < 9 && cat.find('&') > -1) { + cat.remove('&'); + } + if(isI18n) { + cat = i18n(cat.utf8()); + } + field->setCategory(cat); + } + + idx = atts_.index(TQString::fromLatin1("flags")); + if(idx > -1) { + int flags = atts_.value(idx).toInt(); + // I also changed the enum values for syntax 3, but the only custom field + // would have been bibtex-id + if(d->syntaxVersion < 3 && name == Latin1Literal("bibtex-id")) { + flags = 0; + } + + // in syntax version 4, added a flag to disallow deleting attributes + // if it's a version before that and is the title, then add the flag + if(d->syntaxVersion < 4 && name == Latin1Literal("title")) { + flags |= Data::Field::NoDelete; + } + field->setFlags(flags); + } + + TQString formatStr = attValue(atts_, "format", TQString::number(Data::Field::FormatNone)); + Data::Field::FormatFlag format = static_cast(formatStr.toInt()); + field->setFormatFlag(format); + + idx = atts_.index(TQString::fromLatin1("description")); + if(idx > -1) { + TQString desc = atts_.value(idx); + if(isI18n) { + desc = i18n(desc.utf8()); + } + field->setDescription(desc); + } + + if(d->syntaxVersion < 5 && atts_.index(TQString::fromLatin1("bibtex-field")) > -1) { + field->setProperty(TQString::fromLatin1("bibtex"), attValue(atts_, "bibtex-field")); + } + + // Table2 is deprecated + if(type == Data::Field::Table2) { + field->setType(Data::Field::Table); + field->setProperty(TQString::fromLatin1("columns"), TQChar('2')); + } + + // for syntax 8, rating fields got their own type + if(d->syntaxVersion < 8) { + Data::Field::convertOldRating(field); // does all its own checking + } + d->fields.append(field); + + return true; +} + +bool FieldHandler::end(const TQString&, const TQString&, const TQString&) { + return true; +} + +bool FieldPropertyHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + // there should be at least one field already so we can add properties to it + Q_ASSERT(!d->fields.isEmpty()); + Data::FieldPtr field = d->fields.back(); + + m_propertyName = attValue(atts_, "name"); + + // all track fields in music collections prior to version 9 get converted to three columns + if(d->syntaxVersion < 9) { + if(d->collType == Data::Collection::Album && field->name() == Latin1Literal("track")) { + field->setProperty(TQString::fromLatin1("columns"), TQChar('3')); + field->setProperty(TQString::fromLatin1("column1"), i18n("Title")); + field->setProperty(TQString::fromLatin1("column2"), i18n("Artist")); + field->setProperty(TQString::fromLatin1("column3"), i18n("Length")); + } else if(d->collType == Data::Collection::Video && field->name() == Latin1Literal("cast")) { + field->setProperty(TQString::fromLatin1("column1"), i18n("Actor/Actress")); + field->setProperty(TQString::fromLatin1("column2"), i18n("Role")); + } + } + + return true; +} + +bool FieldPropertyHandler::end(const TQString&, const TQString&, const TQString&) { + Q_ASSERT(!m_propertyName.isEmpty()); + // add the previous property + Data::FieldPtr field = d->fields.back(); + field->setProperty(m_propertyName, d->text); + return true; +} + +bool BibtexPreambleHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { + return true; +} + +bool BibtexPreambleHandler::end(const TQString&, const TQString&, const TQString&) { + Q_ASSERT(d->coll); + if(d->coll && d->collType == Data::Collection::Bibtex && !d->text.isEmpty()) { + Data::BibtexCollection* c = static_cast(d->coll.data()); + c->setPreamble(d->text); + } + return true; +} + +StateHandler* BibtexMacrosHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("macro")) { + return new BibtexMacroHandler(d); + } + return 0; +} + +bool BibtexMacrosHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { + return true; +} + +bool BibtexMacrosHandler::end(const TQString&, const TQString&, const TQString&) { + return true; +} + +bool BibtexMacroHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + m_macroName = attValue(atts_, "name"); + return true; +} + +bool BibtexMacroHandler::end(const TQString&, const TQString&, const TQString&) { + if(d->coll && d->collType == Data::Collection::Bibtex && !m_macroName.isEmpty() && !d->text.isEmpty()) { + Data::BibtexCollection* c = static_cast(d->coll.data()); + c->addMacro(m_macroName, d->text); + } + return true; +} + +StateHandler* EntryHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(d->coll->hasField(localName_)) { + return new FieldValueHandler(d); + } + return new FieldValueContainerHandler(d); +} + +bool EntryHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + // the entries must come after the fields + if(!d->coll || d->coll->fields().isEmpty()) { + myWarning() << "EntryHandler::start() - entries must come after fields are defined" << endl; + // TODO: i18n + d->error = TQString::fromLatin1("File format error: entries must come after fields are defined"); + return false; + } + int id = attValue(atts_, "id").toInt(); + Data::EntryPtr entry; + if(id > 0) { + entry = new Data::Entry(d->coll, id); + } else { + entry = new Data::Entry(d->coll); + } + d->entries.append(entry); + return true; +} + +bool EntryHandler::end(const TQString&, const TQString&, const TQString&) { + return true; +} + +StateHandler* FieldValueContainerHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(d->coll->hasField(localName_)) { + return new FieldValueHandler(d); + } + return new FieldValueContainerHandler(d); +} + +bool FieldValueContainerHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { + return true; +} + +bool FieldValueContainerHandler::end(const TQString&, const TQString&, const TQString&) { + return true; +} + +StateHandler* FieldValueHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("year") || + localName_ == Latin1Literal("month") || + localName_ == Latin1Literal("day")) { + return new DateValueHandler(d); + } else if(localName_ == Latin1Literal("column")) { + return new TableColumnHandler(d); + } + return 0; +} + +bool FieldValueHandler::start(const TQString&, const TQString&, const TQString& localName_, const TQXmlAttributes& atts_) { + d->currentField = d->coll->fieldByName(localName_); + m_i18n = attValue(atts_, "i18n") == Latin1Literal("true"); + m_validateISBN = attValue(atts_, "validate") != Latin1Literal("no"); + return true; +} + +bool FieldValueHandler::end(const TQString&, const TQString& localName_, const TQString&) { + Data::FieldPtr f = d->coll->fieldByName(localName_); + if(!f) { + myWarning() << "FieldValueHandler::end() - no field named " << localName_ << endl; + return true; + } + // if it's a derived value, no field value is added + if(f->type() == Data::Field::Dependent) { + return true; + } + + Data::EntryPtr entry = d->entries.back(); + Q_ASSERT(entry); + TQString fieldName = localName_; + TQString fieldValue = d->text; + + if(d->syntaxVersion < 2 && fieldName == Latin1Literal("keywords")) { + // in version 2, "keywords" changed to "keyword" + fieldName = TQString::fromLatin1("keyword"); + } else if(d->syntaxVersion < 4 && f->type() == Data::Field::Bool) { + // in version 3 and prior, checkbox attributes had no text(), set it to "true" + fieldValue = TQString::fromLatin1("true"); + } else if(d->syntaxVersion < 8 && f->type() == Data::Field::Rating) { + // in version 8, old rating fields get changed + bool ok; + uint i = Tellico::toUInt(fieldValue, &ok); + if(ok) { + fieldValue = TQString::number(i); + } + } else if(!d->textBuffer.isEmpty()) { + // for dates and tables, the value is built up from child elements +#ifndef NDEBUG + if(!d->text.isEmpty()) { + myWarning() << "FieldValueHandler::end() - ignoring value for field " << localName_ << ": " << d->text << endl; + } +#endif + fieldValue = d->textBuffer; + d->textBuffer = TQString(); + } + // this is not an else branch, the data may be in the textBuffer + if(d->syntaxVersion < 9 && d->coll->type() == Data::Collection::Album && fieldName == Latin1Literal("track")) { + // yes, this assumes the artist has already been set + fieldValue += TQString::fromLatin1("::"); + fieldValue += entry->field(TQString::fromLatin1("artist")); + } + // special case: if the i18n attribute equals true, then translate the title, description, and category + if(m_i18n) { + fieldValue = i18n(fieldValue.utf8()); + } + // special case for isbn fields, go ahead and validate + if(m_validateISBN && fieldName == Latin1Literal("isbn")) { + ISBNValidator val(0); + val.fixup(fieldValue); + } + if(fieldValue.isEmpty()) { + return true; + } + // for fields with multiple values, we need to add on the new value + TQString oldValue = entry->field(fieldName); + if(!oldValue.isEmpty()) { + fieldValue = oldValue + TQString::fromLatin1("; ") + fieldValue; + } + entry->setField(fieldName, fieldValue); + return true; +} + +bool DateValueHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { + return true; +} + +bool DateValueHandler::end(const TQString&, const TQString& localName_, const TQString&) { + // the data value is y-m-d even if there are no date values + if(d->textBuffer.isEmpty()) { + d->textBuffer = TQString::fromLatin1("--"); + } + TQStringList tokens = TQStringList::split('-', d->textBuffer, true /* allow empty */); + Q_ASSERT(tokens.size() == 3); + if(localName_ == Latin1Literal("year")) { + tokens[0] = d->text; + } else if(localName_ == Latin1Literal("month")) { + tokens[1] = d->text; + } else if(localName_ == Latin1Literal("day")) { + tokens[2] = d->text; + } + d->textBuffer = tokens.join(TQChar('-')); + return true; +} + +bool TableColumnHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { + return true; +} + +bool TableColumnHandler::end(const TQString&, const TQString&, const TQString&) { + // for old collections, if the second column holds the track length, bump it to next column + if(d->syntaxVersion < 9 && + d->coll->type() == Data::Collection::Album && + d->currentField->name() == Latin1Literal("track") && + !d->textBuffer.isEmpty() && + d->textBuffer.contains(TQString::fromLatin1("::")) == 0) { + TQRegExp rx(TQString::fromLatin1("\\d+:\\d\\d")); + if(rx.exactMatch(d->text)) { + d->text += TQString::fromLatin1("::"); + d->text += d->entries.back()->field(TQString::fromLatin1("artist")); + } + } + + if(!d->textBuffer.isEmpty()) { + d->textBuffer += TQString::fromLatin1("::"); + } + d->textBuffer += d->text; + return true; +} + +StateHandler* ImagesHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("image")) { + return new ImageHandler(d); + } + return 0; +} + +bool ImagesHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { + // reset variable that gets updated in the image handler + d->hasImages = false; + return true; +} + +bool ImagesHandler::end(const TQString&, const TQString&, const TQString&) { + return true; +} + +bool ImageHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + m_format = attValue(atts_, "format"); + m_link = attValue(atts_, "link") == Latin1Literal("true"); + // idClean() already calls shareString() + m_imageId = m_link ? shareString(attValue(atts_, "id")) + : Data::Image::idClean(attValue(atts_, "id")); + m_width = attValue(atts_, "width").toInt(); + m_height = attValue(atts_, "height").toInt(); + return true; +} + +bool ImageHandler::end(const TQString&, const TQString&, const TQString&) { + bool readInfo = true; + if(d->loadImages) { + TQByteArray ba; + KCodecs::base64Decode(TQCString(d->text.latin1()), ba); + if(!ba.isEmpty()) { + TQString result = ImageFactory::addImage(ba, m_format, m_imageId); + if(result.isEmpty()) { + myDebug() << "TellicoImporter::readImage(XML) - null image for " << m_imageId << endl; + } + d->hasImages = true; + readInfo = false; + } + } + if(readInfo) { + // a width or height of 0 is ok here + Data::ImageInfo info(m_imageId, m_format.latin1(), m_width, m_height, m_link); + ImageFactory::cacheImageInfo(info); + } + return true; +} + +StateHandler* FiltersHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("filter")) { + return new FilterHandler(d); + } + return 0; +} + +bool FiltersHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { + return true; +} + +bool FiltersHandler::end(const TQString&, const TQString&, const TQString&) { + return true; +} + +StateHandler* FilterHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("rule")) { + return new FilterRuleHandler(d); + } + return 0; +} + +bool FilterHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + d->filter = new Filter(Filter::MatchAny); + d->filter->setName(attValue(atts_, "name")); + + if(attValue(atts_, "match") == Latin1Literal("all")) { + d->filter->setMatch(Filter::MatchAll); + } + return true; +} + +bool FilterHandler::end(const TQString&, const TQString&, const TQString&) { + if(d->coll && !d->filter->isEmpty()) { + d->coll->addFilter(d->filter); + } + d->filter = FilterPtr(); + return true; +} + +bool FilterRuleHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + TQString field = attValue(atts_, "field"); + // empty field means match any of them + TQString pattern = attValue(atts_, "pattern"); + // empty pattern is bad + if(pattern.isEmpty()) { + myWarning() << "FilterRuleHandler::start() - empty rule!" << endl; + return true; + } + TQString function = attValue(atts_, "function").lower(); + FilterRule::Function func; + if(function == Latin1Literal("contains")) { + func = FilterRule::FuncContains; + } else if(function == Latin1Literal("notcontains")) { + func = FilterRule::FuncNotContains; + } else if(function == Latin1Literal("equals")) { + func = FilterRule::FuncEquals; + } else if(function == Latin1Literal("notequals")) { + func = FilterRule::FuncNotEquals; + } else if(function == Latin1Literal("regexp")) { + func = FilterRule::FuncRegExp; + } else if(function == Latin1Literal("notregexp")) { + func = FilterRule::FuncNotRegExp; + } else { + myWarning() << "FilterRuleHandler::start() - invalid rule function: " << function << endl; + return true; + } + d->filter->append(new FilterRule(field, pattern, func)); + return true; +} + +bool FilterRuleHandler::end(const TQString&, const TQString&, const TQString&) { + return true; +} + +StateHandler* BorrowersHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("borrower")) { + return new BorrowerHandler(d); + } + return 0; +} + +bool BorrowersHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { + return true; +} + +bool BorrowersHandler::end(const TQString&, const TQString&, const TQString&) { + return true; +} + +StateHandler* BorrowerHandler::nextHandlerImpl(const TQString&, const TQString& localName_, const TQString&) { + if(localName_ == Latin1Literal("loan")) { + return new LoanHandler(d); + } + return 0; +} + +bool BorrowerHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + TQString name = attValue(atts_, "name"); + TQString uid = attValue(atts_, "uid"); + d->borrower = new Data::Borrower(name, uid); + + return true; +} + +bool BorrowerHandler::end(const TQString&, const TQString&, const TQString&) { + if(d->coll && !d->borrower->isEmpty()) { + d->coll->addBorrower(d->borrower); + } + d->borrower = Data::BorrowerPtr(); + return true; +} + +bool LoanHandler::start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes& atts_) { + m_id = attValue(atts_, "entryRef").toInt(); + m_uid = attValue(atts_, "uid"); + m_loanDate = attValue(atts_, "loanDate"); + m_dueDate = attValue(atts_, "dueDate"); + m_inCalendar = attValue(atts_, "calendar") == Latin1Literal("true"); + return true; +} + +bool LoanHandler::end(const TQString&, const TQString&, const TQString&) { + Data::EntryPtr entry = d->coll->entryById(m_id); + if(!entry) { + myWarning() << "LoanHandler::end() - no entry with id = " << m_id << endl; + return true; + } + TQDate loanDate, dueDate; + if(!m_loanDate.isEmpty()) { + loanDate = TQDate::fromString(m_loanDate, TQt::ISODate); + } + if(!m_dueDate.isEmpty()) { + dueDate = TQDate::fromString(m_dueDate, TQt::ISODate); + } + + Data::LoanPtr loan = new Data::Loan(entry, loanDate, dueDate, d->text); + loan->setUID(m_uid); + loan->setInCalendar(m_inCalendar); + d->borrower->addLoan(loan); + return true; +} + diff --git a/src/translators/xmlstatehandler.h b/src/translators/xmlstatehandler.h new file mode 100644 index 0000000..8b5c137 --- /dev/null +++ b/src/translators/xmlstatehandler.h @@ -0,0 +1,345 @@ +/*************************************************************************** + copyright : (C) 2008 by Robby Stephenson + email : robby@periapsis.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#ifndef TELLICO_IMPORT_XMLSTATEHANDLER_H +#define TELLICO_IMPORT_XMLSTATEHANDLER_H + +#ifdef QT_NO_CAST_ASCII +#define HAD_QT_NO_CAST_ASCII +#undef QT_NO_CAST_ASCII +#endif + +#include + +#ifdef HAD_QT_NO_CAST_ASCII +#define QT_NO_CAST_ASCII +#undef HAD_QT_NO_CAST_ASCII +#endif + +#include "../datavectors.h" + +namespace Tellico { + namespace Import { + namespace SAX { + +class StateData { +public: + TQString text; + TQString error; + TQString ns; // namespace + TQString textBuffer; + uint syntaxVersion; + TQString collTitle; + int collType; + TQString entryName; + Data::CollPtr coll; + Data::FieldVec fields; + Data::FieldPtr currentField; + Data::EntryVec entries; + FilterPtr filter; + Data::BorrowerPtr borrower; + bool defaultFields; + bool loadImages; + bool hasImages; +}; + +class StateHandler { +public: + StateHandler(StateData* data) : d(data) {} + virtual ~StateHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) = 0; + virtual bool end(const TQString&, const TQString&, const TQString&) = 0; + + StateHandler* nextHandler(const TQString&, const TQString&, const TQString&); +protected: + StateData* d; +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&) { return 0; } +}; + +class NullHandler : public StateHandler { +public: + NullHandler(StateData* data) : StateHandler(data) {} + virtual ~NullHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { return true; } + virtual bool end(const TQString&, const TQString&, const TQString&) { return true; } +}; + +class RootHandler : public StateHandler { +public: + RootHandler(StateData* data) : StateHandler(data) {} + virtual ~RootHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&) { return true; } + virtual bool end(const TQString&, const TQString&, const TQString&) { return true; } + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class DocumentHandler : public StateHandler { +public: + DocumentHandler(StateData* data) : StateHandler(data) {} + virtual ~DocumentHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class CollectionHandler : public StateHandler { +public: + CollectionHandler(StateData* data) : StateHandler(data) {} + virtual ~CollectionHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class FieldsHandler : public StateHandler { +public: + FieldsHandler(StateData* data) : StateHandler(data) {} + virtual ~FieldsHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class FieldHandler : public StateHandler { +public: + FieldHandler(StateData* data) : StateHandler(data) {} + virtual ~FieldHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class FieldPropertyHandler : public StateHandler { +public: + FieldPropertyHandler(StateData* data) : StateHandler(data) {} + virtual ~FieldPropertyHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + TQString m_propertyName; +}; + +class BibtexPreambleHandler : public StateHandler { +public: + BibtexPreambleHandler(StateData* data) : StateHandler(data) {} + virtual ~BibtexPreambleHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); +}; + +class BibtexMacrosHandler : public StateHandler { +public: + BibtexMacrosHandler(StateData* data) : StateHandler(data) {} + virtual ~BibtexMacrosHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class BibtexMacroHandler : public StateHandler { +public: + BibtexMacroHandler(StateData* data) : StateHandler(data) {} + virtual ~BibtexMacroHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + TQString m_macroName; +}; + +class EntryHandler : public StateHandler { +public: + EntryHandler(StateData* data) : StateHandler(data) {} + virtual ~EntryHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class FieldValueContainerHandler : public StateHandler { +public: + FieldValueContainerHandler(StateData* data) : StateHandler(data) {} + virtual ~FieldValueContainerHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class FieldValueHandler : public StateHandler { +public: + FieldValueHandler(StateData* data) : StateHandler(data) {} + virtual ~FieldValueHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); + bool m_i18n; + bool m_validateISBN; +}; + +class DateValueHandler : public StateHandler { +public: + DateValueHandler(StateData* data) : StateHandler(data) {} + virtual ~DateValueHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); +}; + +class TableColumnHandler : public StateHandler { +public: + TableColumnHandler(StateData* data) : StateHandler(data) {} + virtual ~TableColumnHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); +}; + +class ImagesHandler : public StateHandler { +public: + ImagesHandler(StateData* data) : StateHandler(data) {} + virtual ~ImagesHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class ImageHandler : public StateHandler { +public: + ImageHandler(StateData* data) : StateHandler(data) {} + virtual ~ImageHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + TQString m_format; + bool m_link; + TQString m_imageId; + int m_width; + int m_height; +}; + +class FiltersHandler : public StateHandler { +public: + FiltersHandler(StateData* data) : StateHandler(data) {} + virtual ~FiltersHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class FilterHandler : public StateHandler { +public: + FilterHandler(StateData* data) : StateHandler(data) {} + virtual ~FilterHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class FilterRuleHandler : public StateHandler { +public: + FilterRuleHandler(StateData* data) : StateHandler(data) {} + virtual ~FilterRuleHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); +}; + +class BorrowersHandler : public StateHandler { +public: + BorrowersHandler(StateData* data) : StateHandler(data) {} + virtual ~BorrowersHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class BorrowerHandler : public StateHandler { +public: + BorrowerHandler(StateData* data) : StateHandler(data) {} + virtual ~BorrowerHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + virtual StateHandler* nextHandlerImpl(const TQString&, const TQString&, const TQString&); +}; + +class LoanHandler : public StateHandler { +public: + LoanHandler(StateData* data) : StateHandler(data) {} + virtual ~LoanHandler() {} + + virtual bool start(const TQString&, const TQString&, const TQString&, const TQXmlAttributes&); + virtual bool end(const TQString&, const TQString&, const TQString&); + +private: + int m_id; + TQString m_uid; + TQString m_loanDate; + TQString m_dueDate; + bool m_inCalendar; +}; + + } + } +} +#endif diff --git a/src/translators/xsltexporter.cpp b/src/translators/xsltexporter.cpp index c08ee0f..b0642b3 100644 --- a/src/translators/xsltexporter.cpp +++ b/src/translators/xsltexporter.cpp @@ -18,6 +18,8 @@ #include #include +#include +#include #include #include @@ -49,6 +51,9 @@ bool XSLTExporter::exec() { } // XSLTHandler handler(FileHandler::readXMLFile(url)); XSLTHandler handler(u); + handler.addStringParam("date", TQDate::currentDate().toString(TQt::ISODate).latin1()); + handler.addStringParam("time", TQTime::currentTime().toString(TQt::ISODate).latin1()); + handler.addStringParam("user", KUser(KUser::UseRealUserID).loginName().latin1()); TellicoXMLExporter exporter; exporter.setEntries(entries()); @@ -75,6 +80,25 @@ TQWidget* XSLTExporter::widget(TQWidget* parent_, const char* name_/*=0*/) { m_URLRequester = new KURLRequester(box); TQWhatsThis::add(m_URLRequester, i18n("Choose the XSLT file used to transform the Tellico XML data.")); + TQString filter = i18n("*.xsl|XSL Files (*.xsl)") + TQChar('\n'); + filter += i18n("*|All Files"); + m_URLRequester->setFilter(filter); + m_URLRequester->setMode(static_cast(KFile::File | KFile::ExistingOnly)); + if(!m_xsltFile.isEmpty()) { + m_URLRequester->setURL(m_xsltFile); + } + l->addStretch(1); return m_widget; } + +void XSLTExporter::readOptions(TDEConfig* config_) { + TDEConfigGroup group(config_, TQString::fromLatin1("ExportOptions - %1").arg(formatString())); + m_xsltFile = group.readEntry("Last File", TQString()); +} + +void XSLTExporter::saveOptions(TDEConfig* config_) { + TDEConfigGroup group(config_, TQString::fromLatin1("ExportOptions - %1").arg(formatString())); + m_xsltFile = m_URLRequester->url(); + group.writeEntry("Last File", m_xsltFile); +} diff --git a/src/translators/xsltexporter.h b/src/translators/xsltexporter.h index b14afd3..8b808e5 100644 --- a/src/translators/xsltexporter.h +++ b/src/translators/xsltexporter.h @@ -34,9 +34,13 @@ public: virtual TQWidget* widget(TQWidget* parent, const char* name=0); + virtual void readOptions(TDEConfig* cfg); + virtual void saveOptions(TDEConfig* cfg); + private: TQWidget* m_widget; KURLRequester* m_URLRequester; + TQString m_xsltFile; }; } // end namespace diff --git a/src/upcvalidator.cpp b/src/upcvalidator.cpp index 73cc0d6..e3aca4e 100644 --- a/src/upcvalidator.cpp +++ b/src/upcvalidator.cpp @@ -13,6 +13,7 @@ #include "upcvalidator.h" #include "isbnvalidator.h" +#include "tellico_debug.h" #include @@ -24,7 +25,7 @@ UPCValidator::UPCValidator(TQObject* parent_, const char* name_/*=0*/) TQValidator::State UPCValidator::validate(TQString& input_, int& pos_) const { // check if it's a cuecat first - State catState = decodeCat(input_); + State catState = CueCat::decode(input_); if(catState == Acceptable) { pos_ = input_.length(); return catState; @@ -91,18 +92,18 @@ void UPCValidator::fixup(TQString& input_) const { } } -TQValidator::State UPCValidator::decodeCat(TQString& input_) const { +TQValidator::State Tellico::CueCat::decode(TQString& input_) { if(input_.length() < 3) { - return Intermediate; + return TQValidator::Intermediate; } if(!input_.startsWith(TQString::fromLatin1(".C3"))) { // all cuecat codes start with .C3 - return Invalid; + return TQValidator::Invalid; } const int periods = input_.contains('.'); if(periods < 4) { - return Intermediate; // not enough yet + return TQValidator::Intermediate; // not enough yet } else if(periods > 4) { - return Invalid; + return TQValidator::Invalid; } // ok, let's have a go, take the third token @@ -127,7 +128,7 @@ TQValidator::State UPCValidator::decodeCat(TQString& input_) const { } input_ = code; - return Acceptable; + return TQValidator::Acceptable; } #include "upcvalidator.moc" diff --git a/src/upcvalidator.h b/src/upcvalidator.h index 5931c79..854dc62 100644 --- a/src/upcvalidator.h +++ b/src/upcvalidator.h @@ -37,11 +37,14 @@ signals: void signalISBN(); private: - State decodeCat(TQString& str) const; - bool m_checkISBN : 1; mutable bool m_isbn : 1; }; +class CueCat { +public: + static TQValidator::State decode(TQString& str); +}; + } // end namespace #endif diff --git a/xslt/amazon2tellico.xsl b/xslt/amazon2tellico.xsl index 065886a..717911e 100644 --- a/xslt/amazon2tellico.xsl +++ b/xslt/amazon2tellico.xsl @@ -53,6 +53,9 @@ abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ + + + @@ -71,6 +74,9 @@ 11 + + 13 + @@ -81,9 +87,19 @@ - - - + + + + + + + + + + + + @@ -496,6 +512,27 @@ + + + + + + + + + + + + + + + . + + + + + + diff --git a/xslt/crossref2tellico.xsl b/xslt/crossref2tellico.xsl index 17cddd3..ab536a8 100644 --- a/xslt/crossref2tellico.xsl +++ b/xslt/crossref2tellico.xsl @@ -42,6 +42,10 @@ + + + + diff --git a/xslt/delicious2tellico.xsl b/xslt/delicious2tellico.xsl index e185d58..a272439 100644 --- a/xslt/delicious2tellico.xsl +++ b/xslt/delicious2tellico.xsl @@ -21,17 +21,41 @@ doctype-public="-//Robby Stephenson/DTD Tellico V10.0//EN" doctype-system="http://periapsis.org/tellico/dtd/v10/tellico.dtd"/> + + - + + + + + + + + + + + + + + Choosing all items of type + + + + 2 + 3 + 11 + 0 + + + + - - - + @@ -56,7 +80,7 @@ - + @@ -116,7 +140,7 @@ - + @@ -132,6 +156,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + NTSC + + + + PAL + + + + SECAM + + + + Color + + + + Black & White + + + + + 1.33:1 + + + + + + 1.85:1 + + + + + + Dolby + + + DTS + + + + + + Region 1 + + + Region 2 + + + Region 3 + + + Region 4 + + + Region 5 + + + Region 6 + + + Region 7 + + + Region 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -161,4 +398,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xslt/gcstar2tellico.xsl b/xslt/gcstar2tellico.xsl index a45df87..7421a3d 100644 --- a/xslt/gcstar2tellico.xsl +++ b/xslt/gcstar2tellico.xsl @@ -79,6 +79,11 @@ + + + + @@ -477,6 +482,48 @@ + + + + + + + Mint State-70 + Mint State-69 + Mint State-68 + Mint State-67 + Mint State-66 + Mint State-65 + Mint State-64 + Mint State-63 + Mint State-62 + Mint State-61 + Mint State-60 + Almost Uncirculated-58 + Almost Uncirculated-55 + Almost Uncirculated-53 + Almost Uncirculated-50 + Extremely Fine-45 + Extremely Fine-40 + Very Fine-35 + Very Fine-30 + Very Fine-25 + Very Fine-20 + Fine-15 + Fine-12 + Very Good-10 + Very Good-8 + Good-6 + Good-4 + Fair + + + + diff --git a/xslt/report-templates/Column_View.xsl b/xslt/report-templates/Column_View.xsl index 3b007fe..5436cf3 100644 --- a/xslt/report-templates/Column_View.xsl +++ b/xslt/report-templates/Column_View.xsl @@ -258,7 +258,10 @@ - + + + + diff --git a/xslt/report-templates/Group_Summary.xsl b/xslt/report-templates/Group_Summary.xsl index 9058f78..0d49284 100644 --- a/xslt/report-templates/Group_Summary.xsl +++ b/xslt/report-templates/Group_Summary.xsl @@ -117,6 +117,7 @@ margin: 0px 0px 0px 0px; padding: 0px 10px 0px 4px; float: left; + min-height: 1em; } span.bar { width: 590px; @@ -178,7 +179,7 @@ - + @@ -189,35 +190,49 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -229,11 +244,11 @@ - + - + @@ -305,17 +320,6 @@ - - - - - - - - - - - diff --git a/xslt/report-templates/Group_View.xsl b/xslt/report-templates/Group_View.xsl index 123559e..73cdf25 100644 --- a/xslt/report-templates/Group_View.xsl +++ b/xslt/report-templates/Group_View.xsl @@ -232,7 +232,10 @@ - + + + + diff --git a/xslt/report-templates/Image_List.xsl b/xslt/report-templates/Image_List.xsl index 78c596f..f73ca24 100644 --- a/xslt/report-templates/Image_List.xsl +++ b/xslt/report-templates/Image_List.xsl @@ -141,7 +141,10 @@ - + + + + @@ -150,7 +153,7 @@ - + @@ -163,8 +166,9 @@ - - + + + diff --git a/xslt/report-templates/Tri-Column.xsl b/xslt/report-templates/Tri-Column.xsl index d38dd5f..3323a2c 100644 --- a/xslt/report-templates/Tri-Column.xsl +++ b/xslt/report-templates/Tri-Column.xsl @@ -193,7 +193,10 @@  - + + + + diff --git a/xslt/tellico-printing.xsl b/xslt/tellico-printing.xsl index 9d997fd..4c31ecc 100644 --- a/xslt/tellico-printing.xsl +++ b/xslt/tellico-printing.xsl @@ -329,7 +329,10 @@ - + + + + diff --git a/xslt/tellico2gcstar.xsl b/xslt/tellico2gcstar.xsl index b4cf394..51c410a 100644 --- a/xslt/tellico2gcstar.xsl +++ b/xslt/tellico2gcstar.xsl @@ -65,6 +65,9 @@ GCmusics + + GCcoins + @@ -80,7 +83,7 @@ - + GCstar export is not supported for this collection type. @@ -147,6 +150,13 @@ + + + + + + + diff --git a/xslt/tellico2html.js b/xslt/tellico2html.js index 8a3f5df..fa08d58 100644 --- a/xslt/tellico2html.js +++ b/xslt/tellico2html.js @@ -127,8 +127,8 @@ sorttable = { if (!document.createElement || !document.getElementsByTagName) return; - sorttable.DATE_RE = /^(\d\d)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/; - sorttable.YYMMDD_RE = /^((\d\d)?\d\d)[\/\.-](\d\d?)[\/\.-](\d\d)$/; + sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-](\d{4}|\d\d)$/; + sorttable.YYMMDD_RE = /^(\d{4}|\d\d)[\/\.-](\d\d?)[\/\.-](\d\d?)$/; forEach(document.getElementsByTagName('table'), function(table) { if (table.className.search(/\bsortable\b/) != -1) { @@ -371,7 +371,8 @@ sorttable = { if (mtch) { y = mtch[1]; m = mtch[2]; d = mtch[3]; // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX - if (parseInt(y) < 50) y = '20'+y; else y = '19'+y; + if (y.length == 2) + if (parseInt(y) < 50) y = '20'+y; else y = '19'+y; if (m.length == 1) m = '0'+m; if (d.length == 1) d = '0'+d; dt1 = y+m+d; @@ -379,7 +380,8 @@ sorttable = { mtch = b[0].match(sorttable.YYMMDD_RE); if (mtch) { y = mtch[1]; m = mtch[2]; d = mtch[3]; - if (parseInt(y) < 50) y = '20'+y; else y = '19'+y; + if (y.length == 2) + if (parseInt(y) < 50) y = '20'+y; else y = '19'+y; if (m.length == 1) m = '0'+m; if (d.length == 1) d = '0'+d; dt2 = y+m+d; diff --git a/xslt/tellico2html.xsl b/xslt/tellico2html.xsl index b87ef75..f63c36f 100644 --- a/xslt/tellico2html.xsl +++ b/xslt/tellico2html.xsl @@ -115,10 +115,7 @@ - @@ -557,7 +554,10 @@ - + + + + diff --git a/xslt/unixref2tellico.xsl b/xslt/unixref2tellico.xsl index b997cac..9b25c44 100644 --- a/xslt/unixref2tellico.xsl +++ b/xslt/unixref2tellico.xsl @@ -46,9 +46,12 @@ - - - + + + + + +