diff -Nru linkchecker-7.2/config/logging.conf linkchecker-7.4/config/logging.conf --- linkchecker-7.2/config/logging.conf 2011-04-02 08:37:09.000000000 +0000 +++ linkchecker-7.4/config/logging.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -# Logging configuration file for LinkChecker. -# This file should not be edited except for debugging -# LinkChecker internals. - -[loggers] -keys=root,linkcheck,cmdline,check,cache,gui,thread - -[handlers] -keys= - -[formatters] -keys= - -# this logger is not used by the application, just a catch-all thingy -[logger_root] -level=DEBUG -handlers= -qualname=root - -# global application logger -[logger_linkcheck] -level=INFO -handlers= -propagate=0 -qualname=linkcheck - -# debug command line processing -[logger_cmdline] -level=INFO -handlers= -propagate=1 -qualname=linkcheck.cmdline - -# debug checking methods -[logger_check] -level=INFO -handlers= -propagate=1 -qualname=linkcheck.check - -# debug caches and queues -[logger_cache] -level=INFO -handlers= -propagate=1 -qualname=linkcheck.cache - -# debug thread locking -[logger_thread] -level=INFO -handlers= -propagate=1 -qualname=linkcheck.thread - -# debug gui interface -[logger_gui] -level=INFO -handlers= -propagate=1 -qualname=linkcheck.gui diff -Nru linkchecker-7.2/debian/changelog linkchecker-7.4/debian/changelog --- linkchecker-7.2/debian/changelog 2011-10-20 08:17:49.000000000 +0000 +++ linkchecker-7.4/debian/changelog 2012-01-04 19:58:57.000000000 +0000 @@ -1,3 +1,18 @@ +linkchecker (7.4-1) unstable; urgency=low + + * New upstream release. + + Requires Python >= 2.7 + + Remove old conffile /etc/linkchecker/logging.conf + * Use debhelper v8. + + -- Bastian Kleineidam Mon, 02 Jan 2012 12:25:46 +0100 + +linkchecker (7.3-1) unstable; urgency=low + + * New upstream release. + + -- Bastian Kleineidam Sat, 05 Nov 2011 13:33:47 +0100 + linkchecker (7.2-1) unstable; urgency=low * New upstream release. diff -Nru linkchecker-7.2/debian/compat linkchecker-7.4/debian/compat --- linkchecker-7.2/debian/compat 2010-07-28 11:28:32.000000000 +0000 +++ linkchecker-7.4/debian/compat 2012-01-02 10:22:12.000000000 +0000 @@ -1 +1 @@ -7 +8 diff -Nru linkchecker-7.2/debian/control linkchecker-7.4/debian/control --- linkchecker-7.2/debian/control 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/debian/control 2012-01-04 19:10:43.000000000 +0000 @@ -2,9 +2,12 @@ Section: web Priority: optional Maintainer: Bastian Kleineidam -Build-Depends: python-all-dev (>= 2.6.6-3), debhelper (>= 7.0.50), gettext, - qt4-dev-tools, hardening-wrapper -X-Python-Version: >= 2.6 +Build-Depends: debhelper (>= 8), + gettext, + hardening-wrapper, + python-all-dev (>= 2.7), + qt4-dev-tools +X-Python-Version: >= 2.7 Standards-Version: 3.9.2 Homepage: http://linkchecker.sourceforge.net/ Vcs-Git: git://linkchecker.git.sourceforge.net/gitroot/linkchecker/linkchecker @@ -12,13 +15,19 @@ Package: linkchecker Architecture: any -Depends: ${python:Depends}, ${shlibs:Depends}, ${misc:Depends} +Depends: ${misc:Depends}, ${python:Depends}, ${shlibs:Depends} Provides: ${python:Provides} Conflicts: python-dnspython -Suggests: apache2 | httpd, python-optcomplete (>= 1.2-5), - python-geoip (>= 1.2.1-2), clamav-daemon, python-utidylib, - python-cssutils, python-pysqlite2, python-twill, python-gconf, - linkchecker-gui +Suggests: apache2 | httpd, + clamav-daemon, + linkchecker-gui, + python-cssutils, + python-gconf, + python-geoip (>= 1.2.1-2), + python-optcomplete (>= 1.2-5), + python-pysqlite2, + python-twill, + python-utidylib Description: check websites and HTML documents for broken links Provides a command line program and web interface to check links of websites and HTML documents. @@ -42,8 +51,11 @@ Package: linkchecker-gui Architecture: all -Depends: linkchecker, python-qt4 (>= 4.5), libqt4-sql-sqlite, - ${python:Depends}, ${misc:Depends} +Depends: libqt4-sql-sqlite, + linkchecker, + python-qt4 (>= 4.5), + ${misc:Depends}, + ${python:Depends} Recommends: python-qscintilla2 Description: check websites and HTML documents for broken links (GUI client) Provides a graphical interface "linkchecker-gui" to check links of websites diff -Nru linkchecker-7.2/debian/copyright linkchecker-7.4/debian/copyright --- linkchecker-7.2/debian/copyright 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/debian/copyright 2011-12-25 09:50:50.000000000 +0000 @@ -23,22 +23,22 @@ #******************************************************************************\ #* Copyright (c) 2003-2004, Martin Blais #* All rights reserved. -#* +#* #* Redistribution and use in source and binary forms, with or without #* modification, are permitted provided that the following conditions are #* met: -#* +#* #* * Redistributions of source code must retain the above copyright #* notice, this list of conditions and the following disclaimer. -#* +#* #* * 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. -#* +#* #* * Neither the name of the Martin Blais, Furius, 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 COPYRIGHT HOLDERS AND CONTRIBUTORS #* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT #* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR diff -Nru linkchecker-7.2/debian/linkchecker.docs linkchecker-7.4/debian/linkchecker.docs --- linkchecker-7.2/debian/linkchecker.docs 2010-07-28 11:28:35.000000000 +0000 +++ linkchecker-7.4/debian/linkchecker.docs 2011-12-29 05:53:03.000000000 +0000 @@ -1,5 +1,4 @@ debian/README.Debian -doc/todo.txt doc/upgrading.txt doc/html/index.html doc/html/logo64x64.png diff -Nru linkchecker-7.2/debian/linkchecker-gui.install linkchecker-7.4/debian/linkchecker-gui.install --- linkchecker-7.2/debian/linkchecker-gui.install 2011-03-07 17:19:59.000000000 +0000 +++ linkchecker-7.4/debian/linkchecker-gui.install 2011-12-25 09:50:50.000000000 +0000 @@ -1,6 +1,6 @@ usr/bin/linkchecker-gui usr/lib/python*/dist-packages/linkcheck/gui -usr/share/man/man1/linkchecker-gui.1 -usr/share/man/de/man1/linkchecker-gui.1 usr/share/linkchecker/lccollection.qhc usr/share/linkchecker/lcdoc.qch +usr/share/man/de/man1/linkchecker-gui.1 +usr/share/man/man1/linkchecker-gui.1 diff -Nru linkchecker-7.2/debian/linkchecker.install linkchecker-7.4/debian/linkchecker.install --- linkchecker-7.2/debian/linkchecker.install 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/debian/linkchecker.install 2011-12-25 09:50:50.000000000 +0000 @@ -1,9 +1,6 @@ usr/bin/linkchecker -usr/share/man/man1/linkchecker.1 -usr/share/man/man5/linkcheckerrc.5 -usr/share/man/de/man1/linkchecker.1 -usr/share/man/de/man5/linkcheckerrc.5 usr/lib/python*/dist-packages/_LinkChecker_configdata.py +usr/lib/python*/dist-packages/dns usr/lib/python*/dist-packages/linkcheck/*.py usr/lib/python*/dist-packages/linkcheck/HtmlParser usr/lib/python*/dist-packages/linkcheck/bookmarks @@ -14,4 +11,7 @@ usr/lib/python*/dist-packages/linkcheck/htmlutil usr/lib/python*/dist-packages/linkcheck/logger usr/lib/python*/dist-packages/linkcheck/network -usr/lib/python*/dist-packages/dns +usr/share/man/de/man1/linkchecker.1 +usr/share/man/de/man5/linkcheckerrc.5 +usr/share/man/man1/linkchecker.1 +usr/share/man/man5/linkcheckerrc.5 diff -Nru linkchecker-7.2/debian/linkchecker.links linkchecker-7.4/debian/linkchecker.links --- linkchecker-7.2/debian/linkchecker.links 2010-07-28 11:28:38.000000000 +0000 +++ linkchecker-7.4/debian/linkchecker.links 2012-01-04 19:47:58.000000000 +0000 @@ -1,2 +1 @@ /etc/linkchecker/linkcheckerrc /usr/share/linkchecker/linkcheckerrc -/etc/linkchecker/logging.conf /usr/share/linkchecker/logging.conf diff -Nru linkchecker-7.2/debian/linkchecker.postinst linkchecker-7.4/debian/linkchecker.postinst --- linkchecker-7.2/debian/linkchecker.postinst 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/debian/linkchecker.postinst 2012-01-04 19:56:06.000000000 +0000 @@ -16,8 +16,14 @@ if [ -f /etc/linkcheckerrc ]; then mv -f /etc/linkcheckerrc /etc/linkchecker/linkcheckerrc.old || true fi +# remove old logging conffile +if [ -f /etc/linkchecker/logging.conf ]; then + rm -f /etc/linkchecker/logging.conf || true +fi # remove system conffile for versions >= 7.0 dpkg-maintscript-helper rm_conffile /etc/linkchecker/linkcheckerrc 6.9 -- "$@" +# remove system conffile for versions >= 7.4 +dpkg-maintscript-helper rm_conffile /etc/linkchecker/logging.conf 7.3 -- "$@" #DEBHELPER# diff -Nru linkchecker-7.2/debian/linkchecker.postrm linkchecker-7.4/debian/linkchecker.postrm --- linkchecker-7.2/debian/linkchecker.postrm 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/debian/linkchecker.postrm 2012-01-04 19:54:56.000000000 +0000 @@ -26,5 +26,7 @@ fi # remove system conffile for versions >= 7.0 dpkg-maintscript-helper rm_conffile /etc/linkchecker/linkcheckerrc 6.9 -- "$@" +# remove system conffile for versions >= 7.4 +dpkg-maintscript-helper rm_conffile /etc/linkchecker/logging.conf 7.3 -- "$@" exit 0 diff -Nru linkchecker-7.2/debian/rules linkchecker-7.4/debian/rules --- linkchecker-7.2/debian/rules 2011-05-04 05:20:09.000000000 +0000 +++ linkchecker-7.4/debian/rules 2012-01-04 19:47:44.000000000 +0000 @@ -30,7 +30,6 @@ dh_auto_install --buildsystem python_distutils # install system wide configuration files in etc install -m 644 config/linkcheckerrc $(ETCDIR)/linkchecker/ - install -m 644 config/logging.conf $(ETCDIR)/linkchecker/ # install CGI files install -m 644 cgi-bin/lconline/*.html $(HTMLDIR) install -m 644 cgi-bin/lconline/*.de $(HTMLDIR) diff -Nru linkchecker-7.2/doc/changelog.txt linkchecker-7.4/doc/changelog.txt --- linkchecker-7.2/doc/changelog.txt 2011-10-20 06:13:05.000000000 +0000 +++ linkchecker-7.4/doc/changelog.txt 2012-01-06 19:25:34.000000000 +0000 @@ -1,4 +1,48 @@ -7.2 "Driver" (released 20.10.2011) +7.4 "Warrior" (release 07.01.2012) + +Fixes: +- gui: Fix saving of check results as a file. + Closes: SF bug #3466545, #3470389 + +Changes: +- checking: The archive attribute of and is a + comma-separated list of URIs. The value is now split and each URI + is checked separately. +- cmdline: Remove deprecated options. +- configuration: The dictionary-based logging configuration is now + used. The logging.conf file has been removed. +- dependencies: Python >= 2.7 is now required + +Features: +- checking: Add HTML5 link elements and attributes. + + +7.3 "Attack the block" (released 25.12.2011) + +Fixes: +- configuration: Properly detect home directory on OS X systems. + Closes: SF bug #3423110 +- checking: Proper error reporting for too-long unicode hostnames. + Closes: SF bug #3438553 +- checking: Do not remove whitespace inside URLs given on the + commandline or GUI. Only remove whitespace at the start and end. +- cmdline: Return with non-zero exit value when internal program + errors occurred. +- gui: Fix saving of check results as a file. + +Changes: +- gui: Display all options in one dialog instead of tabbed panes. + +Features: +- gui: Add configuration for warning strings instead of regular + expressions. The regular expressions can still be configured in + the configuration file. +- gui: Add configuration for ignore URL patterns. + Closes: SF bug #3311262 +- checking: Support parsing of Safari Bookmark files. + + +7.2 "Drive" (released 20.10.2011) Fixes: - checking: HTML parser now correctly detects character encoding for diff -Nru linkchecker-7.2/doc/de/linkchecker.1 linkchecker-7.4/doc/de/linkchecker.1 --- linkchecker-7.2/doc/de/linkchecker.1 2011-10-19 20:32:48.000000000 +0000 +++ linkchecker-7.4/doc/de/linkchecker.1 2012-01-06 19:31:48.000000000 +0000 @@ -89,11 +89,13 @@ auf den Inhalt einer geprüften URL zutrifft. Dies gilt nur für gültige Seiten deren Inhalt wir bekommen können. .br -Use this to check for pages that contain some form of error, for example -"This page has moved" or "Oracle Application error". -.br -Note that multiple values can be combined in the regular expression, for -example "(This page has moved|Oracle Application error)". +Benutzen Sie dies, um nach Seiten zu suchen, welche bestimmte Fehler +enthalten, zum Beispiel "Diese Seite ist umgezogen" oder "Oracle +Applikationsfehler". +.br +Man beachte, dass mehrere Werte in dem regulären Ausdruck kombiniert +werden können, zum Beispiel "(Diese Seite ist umgezogen|Oracle +Applikationsfehler)". .br Siehe Abschnitt \fBREGULAR EXPRESSIONS\fP für weitere Infos. .TP @@ -495,13 +497,17 @@ \fBLC_MESSAGES\fP, \fBLANG\fP, \fBLANGUAGE\fP \- gibt Ausgabesprache an . .SH RÜCKGABEWERT -Der Rückgabewert ist nicht Null falls +Der Rückgabewert ist 2 falls +.IP \(bu +ein Programmfehler aufgetreten ist. +.PP +Der Rückgabewert ist 1 falls .IP \(bu ungültige Verknüpfungen gefunden wurden oder .IP \(bu Warnungen gefunden wurden und Warnungen aktiviert sind -.IP \(bu -ein Programmfehler aufgetreten ist. +.PP +Sonst ist der Rückgabewert Null. . .SH LIMITIERUNGEN LinkChecker benutzt Hauptspeicher für jede zu prüfende URL, die in der @@ -530,4 +536,4 @@ Bastian Kleineidam . .SH COPYRIGHT -Copyright \(co 2000\-2011 Bastian Kleineidam +Copyright \(co 2000\-2012 Bastian Kleineidam diff -Nru linkchecker-7.2/doc/de/linkchecker-gui.1 linkchecker-7.4/doc/de/linkchecker-gui.1 --- linkchecker-7.2/doc/de/linkchecker-gui.1 2011-10-19 20:32:48.000000000 +0000 +++ linkchecker-7.4/doc/de/linkchecker-gui.1 2012-01-06 19:31:48.000000000 +0000 @@ -22,4 +22,4 @@ Bastian Kleineidam . .SH COPYRIGHT -Copyright \(co 2009\-2011 Bastian Kleineidam +Copyright \(co 2009\-2012 Bastian Kleineidam diff -Nru linkchecker-7.2/doc/de/linkcheckerrc.5 linkchecker-7.4/doc/de/linkcheckerrc.5 --- linkchecker-7.2/doc/de/linkcheckerrc.5 2011-10-19 20:32:48.000000000 +0000 +++ linkchecker-7.4/doc/de/linkcheckerrc.5 2012-01-06 19:31:48.000000000 +0000 @@ -522,4 +522,4 @@ Bastian Kleineidam . .SH COPYRIGHT -Copyright \(co 2000\-2011 Bastian Kleineidam +Copyright \(co 2000\-2012 Bastian Kleineidam diff -Nru linkchecker-7.2/doc/de.po linkchecker-7.4/doc/de.po --- linkchecker-7.2/doc/de.po 2011-10-19 20:41:00.000000000 +0000 +++ linkchecker-7.4/doc/de.po 2012-01-06 07:33:06.000000000 +0000 @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: linkchecker 3.4\n" -"POT-Creation-Date: 2011-10-19 22:32+0300\n" -"PO-Revision-Date: 2011-10-19 22:41+0100\n" +"POT-Creation-Date: 2011-12-14 22:36+0100\n" +"PO-Revision-Date: 2012-01-04 18:58+0100\n" "Last-Translator: Bastian Kleineidam \n" "Language-Team: de \n" "Language: \n" @@ -323,18 +323,12 @@ # type: Plain text #. type: Plain text #: en/linkchecker.1:90 -#| msgid "" -#| "Use this to check for pages that contain some form of error, for example " -#| "\"This page has moved\" or \"Oracle Application Server error\"." msgid "Use this to check for pages that contain some form of error, for example \"This page has moved\" or \"Oracle Application error\"." msgstr "Benutzen Sie dies, um nach Seiten zu suchen, welche bestimmte Fehler enthalten, zum Beispiel \"Diese Seite ist umgezogen\" oder \"Oracle Applikationsfehler\"." # type: Plain text #. type: Plain text #: en/linkchecker.1:93 -#| msgid "" -#| "Use this to check for pages that contain some form of error, for example " -#| "\"This page has moved\" or \"Oracle Application Server error\"." msgid "Note that multiple values can be combined in the regular expression, for example \"(This page has moved|Oracle Application error)\"." msgstr "" "Man beachte, dass mehrere Werte in dem regulären Ausdruck kombiniert\n" @@ -1438,14 +1432,14 @@ # type: Plain text #. type: Plain text #: en/linkchecker.1:508 -msgid "The return value is non-zero when" -msgstr "Der Rückgabewert ist nicht Null falls" +msgid "The return value is 2 when" +msgstr "Der Rückgabewert ist 2 falls" # type: IP #. type: IP #: en/linkchecker.1:508 -#: en/linkchecker.1:510 #: en/linkchecker.1:512 +#: en/linkchecker.1:514 #, no-wrap msgid "\\(bu" msgstr "\\(bu" @@ -1453,74 +1447,86 @@ # type: Plain text #. type: Plain text #: en/linkchecker.1:510 +msgid "a program error occurred." +msgstr "ein Programmfehler aufgetreten ist." + +# type: Plain text +#. type: Plain text +#: en/linkchecker.1:512 +msgid "The return value is 1 when" +msgstr "Der Rückgabewert ist 1 falls" + +# type: Plain text +#. type: Plain text +#: en/linkchecker.1:514 msgid "invalid links were found or" msgstr "ungültige Verknüpfungen gefunden wurden oder" # type: Plain text #. type: Plain text -#: en/linkchecker.1:512 +#: en/linkchecker.1:516 msgid "link warnings were found and warnings are enabled" msgstr "Warnungen gefunden wurden und Warnungen aktiviert sind" # type: Plain text #. type: Plain text -#: en/linkchecker.1:514 -msgid "a program error occurred." -msgstr "ein Programmfehler aufgetreten ist." +#: en/linkchecker.1:518 +msgid "Else the return value is zero." +msgstr "Sonst ist der Rückgabewert Null." # type: SH #. type: SH -#: en/linkchecker.1:515 +#: en/linkchecker.1:519 #, no-wrap msgid "LIMITATIONS" msgstr "LIMITIERUNGEN" # type: Plain text #. type: Plain text -#: en/linkchecker.1:519 +#: en/linkchecker.1:523 msgid "LinkChecker consumes memory for each queued URL to check. With thousands of queued URLs the amount of consumed memory can become quite large. This might slow down the program or even the whole system." msgstr "LinkChecker benutzt Hauptspeicher für jede zu prüfende URL, die in der Warteschlange steht. Mit tausenden solcher URLs kann die Menge des benutzten Hauptspeichers sehr groß werden. Dies könnte das Programm oder sogar das gesamte System verlangsamen." # type: SH #. type: SH -#: en/linkchecker.1:520 +#: en/linkchecker.1:524 #, no-wrap msgid "FILES" msgstr "DATEIEN" # type: Plain text #. type: Plain text -#: en/linkchecker.1:522 +#: en/linkchecker.1:526 msgid "B<~/.linkchecker/linkcheckerrc> - default configuration file" msgstr "B<~/.linkchecker/linkcheckerrc> - Standardkonfigurationsdatei" # type: Plain text #. type: Plain text -#: en/linkchecker.1:524 +#: en/linkchecker.1:528 msgid "B<~/.linkchecker/blacklist> - default blacklist logger output filename" msgstr "B<~/.linkchecker/blacklist> - Standard Dateiname der blacklist Logger Ausgabe" # type: Plain text #. type: Plain text -#: en/linkchecker.1:526 +#: en/linkchecker.1:530 msgid "BI - default logger file output name" msgstr "BI - Standard Dateiname der Logausgabe" # type: Plain text #. type: Plain text -#: en/linkchecker.1:528 +#: en/linkchecker.1:532 msgid "B - valid output encodings" msgstr "B - gültige Ausgabe Enkodierungen" # type: Plain text #. type: Plain text -#: en/linkchecker.1:530 +#: en/linkchecker.1:534 msgid "B - regular expression documentation" msgstr "B - Dokumentation zu regulären Ausdrücken" # type: SH #. type: SH -#: en/linkchecker.1:531 +#: en/linkchecker.1:535 #: en/linkcheckerrc.5:514 #: en/linkchecker-gui.1:11 #, no-wrap @@ -1529,13 +1535,13 @@ # type: TH #. type: Plain text -#: en/linkchecker.1:533 +#: en/linkchecker.1:537 msgid "B(5)" msgstr "B(5)" # type: SH #. type: SH -#: en/linkchecker.1:534 +#: en/linkchecker.1:538 #: en/linkcheckerrc.5:517 #: en/linkchecker-gui.1:14 #, no-wrap @@ -1544,7 +1550,7 @@ # type: Plain text #. type: Plain text -#: en/linkchecker.1:536 +#: en/linkchecker.1:540 #: en/linkcheckerrc.5:519 #: en/linkchecker-gui.1:16 msgid "Bastian Kleineidam Ecalvin@users.sourceforge.netE" @@ -1552,7 +1558,7 @@ # type: SH #. type: SH -#: en/linkchecker.1:537 +#: en/linkchecker.1:541 #: en/linkcheckerrc.5:520 #: en/linkchecker-gui.1:17 #, no-wrap @@ -1561,10 +1567,10 @@ # type: Plain text #. type: Plain text -#: en/linkchecker.1:538 +#: en/linkchecker.1:542 #: en/linkcheckerrc.5:521 -msgid "Copyright \\(co 2000-2011 Bastian Kleineidam" -msgstr "Copyright \\(co 2000-2011 Bastian Kleineidam" +msgid "Copyright \\(co 2000-2012 Bastian Kleineidam" +msgstr "Copyright \\(co 2000-2012 Bastian Kleineidam" # type: TH #. type: TH @@ -3063,8 +3069,8 @@ # type: Plain text #. type: Plain text #: en/linkchecker-gui.1:18 -msgid "Copyright \\(co 2009-2011 Bastian Kleineidam" -msgstr "Copyright \\(co 2009-2011 Bastian Kleineidam" +msgid "Copyright \\(co 2009-2012 Bastian Kleineidam" +msgstr "Copyright \\(co 2009-2012 Bastian Kleineidam" #~ msgid "" #~ "Note that for HTML pages the regular expression is matched against the " diff -Nru linkchecker-7.2/doc/en/linkchecker.1 linkchecker-7.4/doc/en/linkchecker.1 --- linkchecker-7.2/doc/en/linkchecker.1 2011-10-19 20:31:40.000000000 +0000 +++ linkchecker-7.4/doc/en/linkchecker.1 2012-01-06 19:31:35.000000000 +0000 @@ -504,13 +504,17 @@ \fBLC_MESSAGES\fP, \fBLANG\fP, \fBLANGUAGE\fP - specify output language . .SH RETURN VALUE -The return value is non-zero when +The return value is 2 when +.IP \(bu +a program error occurred. +.PP +The return value is 1 when .IP \(bu invalid links were found or .IP \(bu link warnings were found and warnings are enabled -.IP \(bu -a program error occurred. +.PP +Else the return value is zero. . .SH LIMITATIONS LinkChecker consumes memory for each queued URL to check. With thousands @@ -535,4 +539,4 @@ Bastian Kleineidam . .SH COPYRIGHT -Copyright \(co 2000-2011 Bastian Kleineidam +Copyright \(co 2000-2012 Bastian Kleineidam diff -Nru linkchecker-7.2/doc/en/linkchecker-gui.1 linkchecker-7.4/doc/en/linkchecker-gui.1 --- linkchecker-7.2/doc/en/linkchecker-gui.1 2011-02-11 17:48:20.000000000 +0000 +++ linkchecker-7.4/doc/en/linkchecker-gui.1 2012-01-06 19:31:28.000000000 +0000 @@ -15,4 +15,4 @@ Bastian Kleineidam . .SH COPYRIGHT -Copyright \(co 2009-2011 Bastian Kleineidam +Copyright \(co 2009-2012 Bastian Kleineidam diff -Nru linkchecker-7.2/doc/en/linkcheckerrc.5 linkchecker-7.4/doc/en/linkcheckerrc.5 --- linkchecker-7.2/doc/en/linkcheckerrc.5 2011-07-27 18:49:06.000000000 +0000 +++ linkchecker-7.4/doc/en/linkcheckerrc.5 2012-01-06 19:31:40.000000000 +0000 @@ -518,4 +518,4 @@ Bastian Kleineidam . .SH COPYRIGHT -Copyright \(co 2000-2011 Bastian Kleineidam +Copyright \(co 2000-2012 Bastian Kleineidam diff -Nru linkchecker-7.2/doc/install.txt linkchecker-7.4/doc/install.txt --- linkchecker-7.2/doc/install.txt 2011-07-25 19:36:30.000000000 +0000 +++ linkchecker-7.4/doc/install.txt 2012-01-04 19:12:26.000000000 +0000 @@ -37,7 +37,7 @@ template from the source files, you will need xgettext with Python support. This is available in gettext >= 0.12. -2. Python >= 2.6 from http://www.python.org/ +2. Python >= 2.7 from http://www.python.org/ Be sure to also have installed the included distutils module. On most distributions, the distutils module is included in diff -Nru linkchecker-7.2/doc/linkchecker.doc.pot linkchecker-7.4/doc/linkchecker.doc.pot --- linkchecker-7.2/doc/linkchecker.doc.pot 2011-10-19 20:32:47.000000000 +0000 +++ linkchecker-7.4/doc/linkchecker.doc.pot 2012-01-06 19:31:48.000000000 +0000 @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2011-10-19 22:32+0300\n" +"POT-Creation-Date: 2011-12-14 22:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1318,38 +1318,48 @@ #. type: Plain text #: en/linkchecker.1:508 -msgid "The return value is non-zero when" +msgid "The return value is 2 when" msgstr "" #. type: IP -#: en/linkchecker.1:508 en/linkchecker.1:510 en/linkchecker.1:512 +#: en/linkchecker.1:508 en/linkchecker.1:512 en/linkchecker.1:514 #, no-wrap msgid "\\(bu" msgstr "" #. type: Plain text #: en/linkchecker.1:510 -msgid "invalid links were found or" +msgid "a program error occurred." msgstr "" #. type: Plain text #: en/linkchecker.1:512 -msgid "link warnings were found and warnings are enabled" +msgid "The return value is 1 when" msgstr "" #. type: Plain text #: en/linkchecker.1:514 -msgid "a program error occurred." +msgid "invalid links were found or" +msgstr "" + +#. type: Plain text +#: en/linkchecker.1:516 +msgid "link warnings were found and warnings are enabled" +msgstr "" + +#. type: Plain text +#: en/linkchecker.1:518 +msgid "Else the return value is zero." msgstr "" #. type: SH -#: en/linkchecker.1:515 +#: en/linkchecker.1:519 #, no-wrap msgid "LIMITATIONS" msgstr "" #. type: Plain text -#: en/linkchecker.1:519 +#: en/linkchecker.1:523 msgid "" "LinkChecker consumes memory for each queued URL to check. With thousands of " "queued URLs the amount of consumed memory can become quite large. This might " @@ -1357,71 +1367,71 @@ msgstr "" #. type: SH -#: en/linkchecker.1:520 +#: en/linkchecker.1:524 #, no-wrap msgid "FILES" msgstr "" #. type: Plain text -#: en/linkchecker.1:522 +#: en/linkchecker.1:526 msgid "B<~/.linkchecker/linkcheckerrc> - default configuration file" msgstr "" #. type: Plain text -#: en/linkchecker.1:524 +#: en/linkchecker.1:528 msgid "B<~/.linkchecker/blacklist> - default blacklist logger output filename" msgstr "" #. type: Plain text -#: en/linkchecker.1:526 +#: en/linkchecker.1:530 msgid "BI - default logger file output name" msgstr "" #. type: Plain text -#: en/linkchecker.1:528 +#: en/linkchecker.1:532 msgid "" "B - valid " "output encodings" msgstr "" #. type: Plain text -#: en/linkchecker.1:530 +#: en/linkchecker.1:534 msgid "" "B - regular expression " "documentation" msgstr "" #. type: SH -#: en/linkchecker.1:531 en/linkcheckerrc.5:514 en/linkchecker-gui.1:11 +#: en/linkchecker.1:535 en/linkcheckerrc.5:514 en/linkchecker-gui.1:11 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: Plain text -#: en/linkchecker.1:533 +#: en/linkchecker.1:537 msgid "B(5)" msgstr "" #. type: SH -#: en/linkchecker.1:534 en/linkcheckerrc.5:517 en/linkchecker-gui.1:14 +#: en/linkchecker.1:538 en/linkcheckerrc.5:517 en/linkchecker-gui.1:14 #, no-wrap msgid "AUTHOR" msgstr "" #. type: Plain text -#: en/linkchecker.1:536 en/linkcheckerrc.5:519 en/linkchecker-gui.1:16 +#: en/linkchecker.1:540 en/linkcheckerrc.5:519 en/linkchecker-gui.1:16 msgid "Bastian Kleineidam Ecalvin@users.sourceforge.netE" msgstr "" #. type: SH -#: en/linkchecker.1:537 en/linkcheckerrc.5:520 en/linkchecker-gui.1:17 +#: en/linkchecker.1:541 en/linkcheckerrc.5:520 en/linkchecker-gui.1:17 #, no-wrap msgid "COPYRIGHT" msgstr "" #. type: Plain text -#: en/linkchecker.1:538 en/linkcheckerrc.5:521 -msgid "Copyright \\(co 2000-2011 Bastian Kleineidam" +#: en/linkchecker.1:542 en/linkcheckerrc.5:521 +msgid "Copyright \\(co 2000-2012 Bastian Kleineidam" msgstr "" #. type: TH @@ -2734,5 +2744,5 @@ #. type: Plain text #: en/linkchecker-gui.1:18 -msgid "Copyright \\(co 2009-2011 Bastian Kleineidam" +msgid "Copyright \\(co 2009-2012 Bastian Kleineidam" msgstr "" diff -Nru linkchecker-7.2/doc/todo.txt linkchecker-7.4/doc/todo.txt --- linkchecker-7.2/doc/todo.txt 2011-10-19 20:42:22.000000000 +0000 +++ linkchecker-7.4/doc/todo.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -- Add ignore filter to GUI options - Not sure how UI for multiple entries should look like - perhaps a textarea, or a table with a fixed number of entries? - -- Port to Python 3.x (will not happen anytime soon) diff -Nru linkchecker-7.2/doc/upgrading.txt linkchecker-7.4/doc/upgrading.txt --- linkchecker-7.2/doc/upgrading.txt 2011-07-25 19:34:57.000000000 +0000 +++ linkchecker-7.4/doc/upgrading.txt 2012-01-04 19:13:51.000000000 +0000 @@ -1,6 +1,13 @@ Upgrading ========= +Migrating from 7.3 to 7.4 +------------------------- +Python 2.7 or newer is required (Python 3.x is not supported though). + +The deprecated options --interactive, --priority and --allow-root +have been removed from the commandline client. + Migrating from 7.0 to 7.1 ------------------------- The FastCGI module lc.fcgi has been removed. diff -Nru linkchecker-7.2/linkcheck/ansicolor.py linkchecker-7.4/linkcheck/ansicolor.py --- linkchecker-7.2/linkcheck/ansicolor.py 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/ansicolor.py 2012-01-06 19:29:33.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2011 Bastian Kleineidam +# Copyright (C) 2000-2012 Bastian Kleineidam # # 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 @@ -178,6 +178,29 @@ return False +def get_columns (fp): + """Return number of columns for given file.""" + if not is_tty(fp): + return 80 + if has_wconio: + # gettextinfo() returns a tuple + # - left, top, right, bottom: window coordinates + # - textattr, normattr: current attributes + # - videomode: current video mode + # - height, width: screen size + # - curx, cury: current cursor position + # return the width: + return WConio.gettextinfo()[8] + if has_curses: + import curses + try: + curses.setupterm() + return curses.tigetnum("cols") + except curses.error: + pass + return 80 + + def _write_color_nt (fp, text, color): """Assumes WConio has been imported at module level.""" oldcolor = WConio.gettextinfo()[4] diff -Nru linkchecker-7.2/linkcheck/bookmarks/chrome.py linkchecker-7.4/linkcheck/bookmarks/chrome.py --- linkchecker-7.2/linkcheck/bookmarks/chrome.py 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/bookmarks/chrome.py 2011-12-20 19:15:00.000000000 +0000 @@ -14,8 +14,9 @@ # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -import os +import os +import sys # Windows filename encoding nt_filename_encoding="mbcs" @@ -36,7 +37,11 @@ dirpath = os.path.join(basedir, u"Google", u"Chrome", u"User Data") elif os.name == 'posix': basedir = unicode(os.environ["HOME"]) - dirpath = os.path.join(basedir, u".config", u"Google", u"Chrome") + if sys.platform == 'darwin': + dirpath = os.path.join(basedir, u"Library", u"Application Support") + else: + dirpath = os.path.join(basedir, u".config") + dirpath = os.path.join(dirpath, u"Google", u"Chrome") return dirpath diff -Nru linkchecker-7.2/linkcheck/bookmarks/chromium.py linkchecker-7.4/linkcheck/bookmarks/chromium.py --- linkchecker-7.2/linkcheck/bookmarks/chromium.py 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/bookmarks/chromium.py 2011-12-20 19:15:00.000000000 +0000 @@ -14,7 +14,9 @@ # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + import os +import sys import json @@ -37,7 +39,11 @@ dirpath = os.path.join(basedir, u"Chromium", u"User Data") elif os.name == 'posix': basedir = unicode(os.environ["HOME"]) - dirpath = os.path.join(basedir, u".config", u"chromium") + if sys.platform == 'darwin': + dirpath = os.path.join(basedir, u"Library", u"Application Support") + else: + dirpath = os.path.join(basedir, u".config") + dirpath = os.path.join(dirpath, u"chromium") return dirpath diff -Nru linkchecker-7.2/linkcheck/bookmarks/safari.py linkchecker-7.4/linkcheck/bookmarks/safari.py --- linkchecker-7.2/linkcheck/bookmarks/safari.py 1970-01-01 00:00:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/bookmarks/safari.py 2011-12-25 09:50:50.000000000 +0000 @@ -0,0 +1,114 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2011 Bastian Kleineidam +# +# 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) any later version. +# +# 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import os +import sys +import plistlib +try: + import biplist + has_biplist = True +except ImportError: + has_biplist = False + + +def get_profile_dir (): + """Return path where all profiles of current user are stored.""" + basedir = unicode(os.environ["HOME"]) + return os.path.join(basedir, u"Library", u"Safari") + + +def find_bookmark_file (): + """Return the bookmark file of the Default profile. + Returns absolute filename if found, or empty string if no bookmark file + could be found. + """ + if sys.platform != 'darwin': + return u"" + dirname = get_profile_dir() + if os.path.isdir(dirname): + fname = os.path.join(dirname, u"Bookmarks.plist") + if os.path.isfile(fname): + return fname + return u"" + + +def parse_bookmark_file (filename): + """Return iterator for bookmarks of the form (url, name). + Bookmarks are not sorted. + """ + return parse_plist(get_plist_data_from_file(filename)) + + +def parse_bookmark_data (data): + """Return iterator for bookmarks of the form (url, name). + Bookmarks are not sorted. + """ + return parse_plist(get_plist_data_from_string(data)) + + +def get_plist_data_from_file (filename): + """Parse plist data for a file. Tries biplist, falling back to + plistlib.""" + if has_biplist: + return biplist.readPlist(filename) + # fall back to normal plistlist + try: + return plistlib.readPlist(filename) + except Exception: + # not parseable (eg. not well-formed, or binary) + return {} + + +def get_plist_data_from_string (data): + """Parse plist data for a string. Tries biplist, falling back to + plistlib.""" + if has_biplist: + return biplist.readPlistFromString(data) + # fall back to normal plistlist + try: + return plistlib.readPlistFromString(data) + except Exception: + # not parseable (eg. not well-formed, or binary) + return {} + + +# some key strings +KEY_URLSTRING = 'URLString' +KEY_URIDICTIONARY = 'URIDictionary' +KEY_CHILDREN = 'Children' +KEY_WEBBOOKMARKTYPE = 'WebBookmarkType' + +def parse_plist(entry): + """Parse a XML dictionary entry.""" + if is_leaf(entry): + url = entry[KEY_URLSTRING] + title = entry[KEY_URIDICTIONARY].get('title', url) + yield (url, title) + elif has_children(entry): + for child in entry[KEY_CHILDREN]: + for item in parse_plist(child): + yield item + + +def is_leaf (entry): + """Return true if plist entry is an URL entry.""" + return entry.get(KEY_WEBBOOKMARKTYPE) == 'WebBookmarkTypeLeaf' + + +def has_children (entry): + """Return true if plist entry has children.""" + return entry.get(KEY_WEBBOOKMARKTYPE) == 'WebBookmarkTypeList' diff -Nru linkchecker-7.2/linkcheck/cache/addrinfo.py linkchecker-7.4/linkcheck/cache/addrinfo.py --- linkchecker-7.2/linkcheck/cache/addrinfo.py 2011-02-14 20:06:56.000000000 +0000 +++ linkchecker-7.4/linkcheck/cache/addrinfo.py 2011-12-08 22:29:27.000000000 +0000 @@ -19,6 +19,7 @@ """ import socket import sys +from .. import LinkCheckerError from ..lock import get_lock from ..containers import LFUCache from ..decorators import synchronized @@ -35,10 +36,19 @@ if key in addrinfos: value = addrinfos[key] else: + # check if it's an ascii host + if isinstance(host, unicode): + try: + host = host.encode('ascii') + except UnicodeEncodeError: + pass try: value = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) except socket.error: value = sys.exc_info()[1] + except UnicodeError, msg: + args = dict(host=host, msg=str(msg)) + value = LinkCheckerError(_("could not parse host %(host)r: %(msg)s") % args) addrinfos[key] = value if isinstance(value, Exception): raise value diff -Nru linkchecker-7.2/linkcheck/checker/urlbase.py linkchecker-7.4/linkcheck/checker/urlbase.py --- linkchecker-7.2/linkcheck/checker/urlbase.py 2011-10-09 19:16:26.000000000 +0000 +++ linkchecker-7.4/linkcheck/checker/urlbase.py 2012-01-06 07:33:06.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2011 Bastian Kleineidam +# Copyright (C) 2000-2012 Bastian Kleineidam # # 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 @@ -53,10 +53,6 @@ """ if url.startswith(scheme+":"): return url - # work around a Python 2.6/3.1 bug cutting off characters when the URL - # begins with semicolon - if url.startswith(';'): - url = "./%s" % url return urlparse.urljoin(parent, url) @@ -99,6 +95,7 @@ "text/plain+linkchecker": "text", "text/plain+opera": "opera", "text/plain+chromium": "chromium", + "application/x-plist+safari": "safari", } # Set maximum file size for downloaded files in bytes. @@ -981,6 +978,15 @@ self.aggregate, parent_url=self.url, name=name) self.aggregate.urlqueue.put(url_data) + def parse_safari (self): + """Parse a Safari bookmark file.""" + log.debug(LOG_CHECK, "Parsing Safari bookmarks %s", self) + from ..bookmarks.safari import parse_bookmark_data + for url, name in parse_bookmark_data(self.get_content()): + url_data = get_url_from(url, self.recursion_level+1, + self.aggregate, parent_url=self.url, name=name) + self.aggregate.urlqueue.put(url_data) + def parse_text (self): """Parse a text file with one url per line; comment and blank lines are ignored.""" diff -Nru linkchecker-7.2/linkcheck/configuration/__init__.py linkchecker-7.4/linkcheck/configuration/__init__.py --- linkchecker-7.2/linkcheck/configuration/__init__.py 2011-10-20 05:52:12.000000000 +0000 +++ linkchecker-7.4/linkcheck/configuration/__init__.py 2012-01-06 07:33:06.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2011 Bastian Kleineidam +# Copyright (C) 2000-2012 Bastian Kleineidam # # 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 @@ -51,12 +51,28 @@ under certain conditions. Look at the file `LICENSE' within this distribution.""" +# logging configuration +configdict = { + 'version': 1, + 'loggers': { + }, + 'root': { + 'level': 'DEBUG', + }, +} + +# configure the application loggers +for applog in lognames.values(): + # propagate except for root app logger 'linkcheck' + propagate = (applog != LOG_ROOT) + configdict['loggers'][applog] = dict(level='INFO', propagate=propagate) + def normpath (path): - """ - Norm given system path with all available norm funcs in os.path. - """ - return os.path.normcase(os.path.normpath(os.path.expanduser(path))) + """Norm given system path with all available norm or expand functions + in os.path.""" + expanded = os.path.expanduser(os.path.expandvars(path)) + return os.path.normcase(os.path.normpath(expanded)) # List optional Python modules in the form (module, name) @@ -192,19 +208,18 @@ self["scanvirus"] = False self["clamavconf"] = clamav.canonical_clamav_conf() self["useragent"] = UserAgent + from ..logger import Loggers + self.loggers = dict(**Loggers) def init_logging (self, status_logger, debug=None, handler=None): """ - Load logging.conf file settings to set up the - application logging (not to be confused with check loggers). - When debug is not None it is expected to be a list of + Set up the application logging (not to be confused with check + loggers). When debug is not None it is expected to be a list of logger names for which debugging will be enabled. If no thread debugging is enabled, threading will be disabled. """ - filename = normpath(os.path.join(get_config_dir(), "logging.conf")) - if os.path.isfile(filename): - logging.config.fileConfig(filename) + logging.config.dictConfig(configdict) if handler is None: handler = ansicolor.ColoredStreamHandler(strm=sys.stderr) self.add_loghandler(handler) @@ -252,8 +267,7 @@ args = {} args.update(self[loggertype]) args.update(kwargs) - from ..logger import Loggers - return Loggers[loggertype](**args) + return self.loggers[loggertype](**args) def logger_add (self, loggertype, loggerclass, loggerargs=None): """ @@ -261,8 +275,7 @@ """ if loggerargs is None: loggerargs = {} - from ..logger import Loggers - Loggers[loggertype] = loggerclass + self.loggers[loggertype] = loggerclass self[loggertype] = loggerargs def read (self, files=None): diff -Nru linkchecker-7.2/linkcheck/containers.py linkchecker-7.4/linkcheck/containers.py --- linkchecker-7.2/linkcheck/containers.py 2011-02-17 10:46:05.000000000 +0000 +++ linkchecker-7.4/linkcheck/containers.py 2011-12-20 19:15:00.000000000 +0000 @@ -194,9 +194,8 @@ def __setitem__ (self, key, val): """Store given key/value.""" if key in self: - # store value with existing number of uses - num_used = self[key][0] - super(LFUCache, self).__setitem__(key, [num_used, val]) + # store value, do not increase number of uses + super(LFUCache, self).__getitem__(key)[1] = val else: super(LFUCache, self).__setitem__(key, [0, val]) # check for size limit @@ -205,18 +204,20 @@ def shrink (self): """Shrink ca. 5% of entries.""" - trim = int(0.95*len(self)) + trim = int(0.05*len(self)) if trim: - items = super(LFUCache, self).items() - values = sorted([(value, key) for key, value in items]) - for value, key in values[0:trim]: - del self[key] + items = super(LFUCache, self).iteritems() + # sorting function for items + keyfunc = lambda x: x[1][0] + values = sorted(items, key=keyfunc) + for item in values[0:trim]: + del self[item[0]] def __getitem__ (self, key): """Update key usage and return value.""" - value = super(LFUCache, self).__getitem__(key) - value[0] += 1 - return value[1] + entry = super(LFUCache, self).__getitem__(key) + entry[0] += 1 + return entry[1] def uses (self, key): """Get number of uses for given key (without increasing the number of diff -Nru linkchecker-7.2/linkcheck/director/checker.py linkchecker-7.4/linkcheck/director/checker.py --- linkchecker-7.2/linkcheck/director/checker.py 2011-02-18 10:30:47.000000000 +0000 +++ linkchecker-7.4/linkcheck/director/checker.py 2011-12-20 19:15:00.000000000 +0000 @@ -33,14 +33,13 @@ urlqueue.task_done(url_data) -class Checker (task.CheckedTask): +class Checker (task.LoggedCheckedTask): """URL check thread.""" def __init__ (self, urlqueue, logger): """Store URL queue and logger.""" - super(Checker, self).__init__() + super(Checker, self).__init__(logger) self.urlqueue = urlqueue - self.logger = logger self.origname = self.getName() def run_checked (self): diff -Nru linkchecker-7.2/linkcheck/director/cleanup.py linkchecker-7.4/linkcheck/director/cleanup.py --- linkchecker-7.2/linkcheck/director/cleanup.py 2011-02-18 10:30:47.000000000 +0000 +++ linkchecker-7.4/linkcheck/director/cleanup.py 2011-12-20 19:15:00.000000000 +0000 @@ -16,7 +16,7 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """Cleanup task.""" import time -from . import task +from . import task, console class Cleanup (task.CheckedTask): @@ -34,3 +34,7 @@ # clean every 15 seconds while not self.stopped(15): self.connections.remove_expired() + + def internal_error (self): + """Print internal error to console.""" + console.internal_error() diff -Nru linkchecker-7.2/linkcheck/director/__init__.py linkchecker-7.4/linkcheck/director/__init__.py --- linkchecker-7.2/linkcheck/director/__init__.py 2011-02-18 10:30:47.000000000 +0000 +++ linkchecker-7.4/linkcheck/director/__init__.py 2011-12-20 19:15:00.000000000 +0000 @@ -148,6 +148,7 @@ # from badly-programmed libraries that raise all kinds of strange # exceptions. console.internal_error() + aggregate.logger.log_internal_error() abort(aggregate) # Not catched exceptions at this point are SystemExit and GeneratorExit, # and both should be handled by the calling layer. diff -Nru linkchecker-7.2/linkcheck/director/logger.py linkchecker-7.4/linkcheck/director/logger.py --- linkchecker-7.2/linkcheck/director/logger.py 2011-02-14 20:06:56.000000000 +0000 +++ linkchecker-7.4/linkcheck/director/logger.py 2011-12-20 19:15:00.000000000 +0000 @@ -73,3 +73,9 @@ transport = url_data.to_wire() for log in self.logs: log.log_filter_url(transport, do_print) + + @synchronized(_lock) + def log_internal_error (self): + """Document that an internal error occurred.""" + for logger in self.logs: + logger.log_internal_error() diff -Nru linkchecker-7.2/linkcheck/director/status.py linkchecker-7.4/linkcheck/director/status.py --- linkchecker-7.2/linkcheck/director/status.py 2011-02-18 10:30:47.000000000 +0000 +++ linkchecker-7.4/linkcheck/director/status.py 2011-12-20 19:15:00.000000000 +0000 @@ -19,14 +19,13 @@ from . import task -class Status (task.CheckedTask): +class Status (task.LoggedCheckedTask): """Status thread.""" def __init__ (self, urlqueue, logger, wait_seconds): """Store urlqueue object.""" - super(Status, self).__init__() + super(Status, self).__init__(logger) self.urlqueue = urlqueue - self.logger = logger self.wait_seconds = wait_seconds def run_checked (self): diff -Nru linkchecker-7.2/linkcheck/director/task.py linkchecker-7.4/linkcheck/director/task.py --- linkchecker-7.2/linkcheck/director/task.py 2009-07-24 21:55:01.000000000 +0000 +++ linkchecker-7.4/linkcheck/director/task.py 2011-12-25 09:50:50.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2006-2009 Bastian Kleineidam +# Copyright (C) 2006-2011 Bastian Kleineidam # # 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 @@ -31,9 +31,28 @@ log.warn(LOG_CHECK, "interrupt did not reach the main thread") thread.interrupt_main() except Exception: - console.internal_error() + self.internal_error() @notimplemented def run_checked (self): """Overload in subclass.""" pass + + @notimplemented + def internal_error (self): + """Overload in subclass.""" + pass + + +class LoggedCheckedTask (CheckedTask): + """URL check task with a logger instance and internal error handling.""" + + def __init__ (self, logger): + """Initialize super instance and store given logger.""" + super(CheckedTask, self).__init__() + self.logger = logger + + def internal_error (self): + """Log an internal error on console and the logger.""" + console.internal_error() + self.logger.log_internal_error() diff -Nru linkchecker-7.2/linkcheck/fileutil.py linkchecker-7.4/linkcheck/fileutil.py --- linkchecker-7.2/linkcheck/fileutil.py 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/fileutil.py 2012-01-06 07:33:06.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2005-2011 Bastian Kleineidam +# Copyright (C) 2005-2012 Bastian Kleineidam # # 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 @@ -200,13 +200,16 @@ """Return MIME type of file, or 'application/octet-stream' if it could not be determined.""" mime, encoding = mimedb.guess_type(filename, strict=False) + basename = os.path.basename(filename) + # Special case for Safari Bookmark files + if not mime and basename == 'Bookmarks.plist': + return 'application/x-plist+safari' # Special case for Google Chrome Bookmark files. - if not mime and os.path.basename(filename) == 'Bookmarks': + if not mime and basename == 'Bookmarks': mime = 'text/plain' # Mime type text/plain can be differentiated further with content reading. if mime == "text/plain" and read is not None: # try to read some content and do a poor man's file(1) - # XXX replace with file(1) on Unix systems try: data = read()[:30] for mime, ro in PARSE_CONTENTS.items(): diff -Nru linkchecker-7.2/linkcheck/gui/__init__.py linkchecker-7.4/linkcheck/gui/__init__.py --- linkchecker-7.2/linkcheck/gui/__init__.py 2011-10-20 07:10:39.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/__init__.py 2012-01-06 07:33:06.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2008-2011 Bastian Kleineidam +# Copyright (C) 2008-2012 Bastian Kleineidam # # 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 @@ -36,7 +36,7 @@ from .settings import Settings from .recentdocs import RecentDocumentModel from .. import configuration, checker, director, add_intern_pattern, \ - strformat, fileutil, LinkCheckerError + strformat, fileutil, LinkCheckerError, get_link_pat from ..containers import enum from .. import url as urlutil from ..checker import httpheaders @@ -72,6 +72,12 @@ return icon +def warninglines2regex(lines): + """Convert a list of strings to a regular expression matching any of + the given strings.""" + return u"|".join([re.escape(line) for line in lines]) + + class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): """The main window displaying checked URLs.""" @@ -195,6 +201,8 @@ def init_config (self): """Create a configuration object.""" self.config = configuration.Configuration() + # dictionary holding overwritten values + self.config_backup = {} # set standard GUI configuration values self.config.logger_add("gui", GuiLogger) self.config["logger"] = self.config.logger_new('gui', @@ -223,8 +231,34 @@ self.config["threads"] = 1 else: self.config.reset_loglevel() - if data["warningregex"]: - self.config["warningregex"] = re.compile(data["warningregex"]) + if data["warninglines"]: + lines = data["warninglines"].splitlines() + ro = re.compile(warninglines2regex(lines)) + self.backup_config("warningregex", ro) + # set ignore patterns + ignorepats = data["ignorelines"].strip() + if ignorepats: + self.backup_config("externlinks") + lines = ignorepats.splitlines() + for line in lines: + pat = get_link_pat(line, strict=1) + self.config["externlinks"].append(pat) + + def backup_config (self, key, value=None): + """Backup config key if not already done and set given value.""" + if key not in self.config_backup: + confvalue = self.config[key] + if isinstance(confvalue, list): + # make copy of lists to avoid unwanted inserted items + confvalue = list(confvalue) + self.config_backup[key] = confvalue + if value is not None: + self.config[key] = value + + def restore_config (self): + """Restore config from backup.""" + for key in self.config_backup: + self.config[key] = self.config_backup[key] def get_status (self): """Return current application status.""" @@ -251,6 +285,7 @@ self.label_busy.hide() self.menubar.setEnabled(True) self.urlinput.setEnabled(True) + self.restore_config() elif status == Status.checking: self.treeView.setSortingEnabled(False) self.debug.reset() @@ -367,7 +402,7 @@ def get_url (self): """Return URL to check from the urlinput widget.""" - url = strformat.stripall(unicode(self.urlinput.text())) + url = strformat.stripurl(unicode(self.urlinput.text())) if url.startswith(u"www."): url = u"http://%s" % url elif url.startswith(u"ftp."): @@ -392,6 +427,7 @@ self.set_statusmsg(_("Checking '%s'.") % strformat.limit(url, 40)) url_data = checker.get_url_from(url, 0, aggregate) try: + self.backup_config('internlinks') add_intern_pattern(url_data, self.config) except UnicodeError: self.set_statusmsg(_("Error, invalid URL `%s'.") % diff -Nru linkchecker-7.2/linkcheck/gui/lineedit.py linkchecker-7.4/linkcheck/gui/lineedit.py --- linkchecker-7.2/linkcheck/gui/lineedit.py 2011-10-19 18:53:42.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/lineedit.py 2011-12-29 05:54:23.000000000 +0000 @@ -185,6 +185,9 @@ if find_opera(): action = menu.addAction(name % {"browser": u"Opera"}) action.triggered.connect(lambda: self.setText(find_opera())) + if find_safari(): + action = menu.addAction(name % {"browser": u"Safari"}) + action.triggered.connect(lambda: self.setText(find_safari())) def contextMenuEvent (self, event): """Handle context menu event.""" @@ -215,3 +218,9 @@ """Return Opera bookmark filename or empty string if not found.""" from ..bookmarks.opera import find_bookmark_file return find_bookmark_file() + + +def find_safari (): + """Return Safari bookmark filename or empty string if not found.""" + from ..bookmarks.safari import find_bookmark_file + return find_bookmark_file() diff -Nru linkchecker-7.2/linkcheck/gui/linkchecker_ui_debug.py linkchecker-7.4/linkcheck/gui/linkchecker_ui_debug.py --- linkchecker-7.2/linkcheck/gui/linkchecker_ui_debug.py 2011-05-30 20:09:36.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/linkchecker_ui_debug.py 2011-12-29 05:54:23.000000000 +0000 @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'ui/debug.ui' # -# Created: Mon Mar 21 12:31:18 2011 -# by: PyQt4 UI code generator 4.8.3 +# Created: Mon Dec 12 19:00:37 2011 +# by: PyQt4 UI code generator 4.8.6 # # WARNING! All changes made in this file will be lost! @@ -19,6 +19,7 @@ DebugDialog.setObjectName(_fromUtf8("DebugDialog")) DebugDialog.setWindowModality(QtCore.Qt.ApplicationModal) DebugDialog.resize(564, 547) + DebugDialog.setWindowTitle(_("LinkChecker debug log")) self.verticalLayout = QtGui.QVBoxLayout(DebugDialog) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.frame = QtGui.QFrame(DebugDialog) @@ -39,5 +40,5 @@ QtCore.QMetaObject.connectSlotsByName(DebugDialog) def retranslateUi(self, DebugDialog): - DebugDialog.setWindowTitle(_("LinkChecker debug log")) + pass diff -Nru linkchecker-7.2/linkcheck/gui/linkchecker_ui_editor.py linkchecker-7.4/linkcheck/gui/linkchecker_ui_editor.py --- linkchecker-7.2/linkcheck/gui/linkchecker_ui_editor.py 2011-05-30 20:09:36.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/linkchecker_ui_editor.py 2011-12-29 05:54:23.000000000 +0000 @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'ui/editor.ui' # -# Created: Wed Mar 16 18:06:04 2011 -# by: PyQt4 UI code generator 4.8.3 +# Created: Mon Dec 12 19:00:37 2011 +# by: PyQt4 UI code generator 4.8.6 # # WARNING! All changes made in this file will be lost! @@ -24,12 +24,14 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(EditorDialog.sizePolicy().hasHeightForWidth()) EditorDialog.setSizePolicy(sizePolicy) + EditorDialog.setWindowTitle(_("LinkChecker source view")) self.verticalLayout = QtGui.QVBoxLayout(EditorDialog) self.verticalLayout.setMargin(0) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.menubar = QtGui.QMenuBar(EditorDialog) self.menubar.setObjectName(_fromUtf8("menubar")) self.menuFile = QtGui.QMenu(self.menubar) + self.menuFile.setTitle(_("&File")) self.menuFile.setObjectName(_fromUtf8("menuFile")) self.verticalLayout.addWidget(self.menubar) self.frame = QtGui.QFrame(EditorDialog) @@ -44,6 +46,8 @@ self.frame.setObjectName(_fromUtf8("frame")) self.verticalLayout.addWidget(self.frame) self.actionSave = QtGui.QAction(EditorDialog) + self.actionSave.setText(_("&Save")) + self.actionSave.setShortcut(_("Ctrl+S")) self.actionSave.setObjectName(_fromUtf8("actionSave")) self.menuFile.addAction(self.actionSave) self.menubar.addAction(self.menuFile.menuAction()) @@ -52,8 +56,5 @@ QtCore.QMetaObject.connectSlotsByName(EditorDialog) def retranslateUi(self, EditorDialog): - EditorDialog.setWindowTitle(_("LinkChecker source view")) - self.menuFile.setTitle(_("&File")) - self.actionSave.setText(_("&Save")) - self.actionSave.setShortcut(_("Ctrl+S")) + pass diff -Nru linkchecker-7.2/linkcheck/gui/linkchecker_ui_main.py linkchecker-7.4/linkcheck/gui/linkchecker_ui_main.py --- linkchecker-7.2/linkcheck/gui/linkchecker_ui_main.py 2011-08-04 18:33:50.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/linkchecker_ui_main.py 2011-12-29 05:54:23.000000000 +0000 @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'ui/main.ui' # -# Created: Thu Aug 4 20:33:50 2011 -# by: PyQt4 UI code generator 4.8.3 +# Created: Sat Dec 17 12:37:55 2011 +# by: PyQt4 UI code generator 4.8.6 # # WARNING! All changes made in this file will be lost! @@ -23,6 +23,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) + MainWindow.setWindowTitle(_("LinkChecker")) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/app.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) @@ -35,6 +36,7 @@ self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.label = QtGui.QLabel(self.centralwidget) + self.label.setText(_("URL:")) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout_3.addWidget(self.label) spacerItem = QtGui.QSpacerItem(4, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) @@ -51,7 +53,9 @@ spacerItem1 = QtGui.QSpacerItem(10, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem1) self.controlButton = QtGui.QPushButton(self.centralwidget) + self.controlButton.setToolTip(_("Start checking the given URL.")) self.controlButton.setStatusTip(_fromUtf8("")) + self.controlButton.setText(QtGui.QApplication.translate("MainWindow", "Start", "Start checking URL", QtGui.QApplication.UnicodeUTF8)) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/start.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.controlButton.setIcon(icon1) @@ -64,27 +68,34 @@ self.horizontalLayout_4.setContentsMargins(0, 0, -1, -1) self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.label_32 = QtGui.QLabel(self.centralwidget) + self.label_32.setText(_("Active:")) self.label_32.setObjectName(_fromUtf8("label_32")) self.horizontalLayout_4.addWidget(self.label_32) self.label_active = QtGui.QLabel(self.centralwidget) self.label_active.setMinimumSize(QtCore.QSize(50, 0)) + self.label_active.setText(_("0")) self.label_active.setObjectName(_fromUtf8("label_active")) self.horizontalLayout_4.addWidget(self.label_active) self.label_30 = QtGui.QLabel(self.centralwidget) + self.label_30.setText(_("Queued:")) self.label_30.setObjectName(_fromUtf8("label_30")) self.horizontalLayout_4.addWidget(self.label_30) self.label_queued = QtGui.QLabel(self.centralwidget) self.label_queued.setMinimumSize(QtCore.QSize(50, 0)) + self.label_queued.setText(_("0")) self.label_queued.setObjectName(_fromUtf8("label_queued")) self.horizontalLayout_4.addWidget(self.label_queued) self.label_28 = QtGui.QLabel(self.centralwidget) + self.label_28.setText(_("Checked:")) self.label_28.setObjectName(_fromUtf8("label_28")) self.horizontalLayout_4.addWidget(self.label_28) self.label_checked = QtGui.QLabel(self.centralwidget) self.label_checked.setMinimumSize(QtCore.QSize(50, 0)) + self.label_checked.setText(_("0")) self.label_checked.setObjectName(_fromUtf8("label_checked")) self.horizontalLayout_4.addWidget(self.label_checked) self.label_15 = QtGui.QLabel(self.centralwidget) + self.label_15.setText(_("Info:")) self.label_15.setObjectName(_fromUtf8("label_15")) self.horizontalLayout_4.addWidget(self.label_15) self.label_busy = QtGui.QLabel(self.centralwidget) @@ -94,6 +105,7 @@ sizePolicy.setHeightForWidth(self.label_busy.sizePolicy().hasHeightForWidth()) self.label_busy.setSizePolicy(sizePolicy) self.label_busy.setMinimumSize(QtCore.QSize(16, 16)) + self.label_busy.setText(_("-")) self.label_busy.setObjectName(_fromUtf8("label_busy")) self.horizontalLayout_4.addWidget(self.label_busy) self.label_status = QtGui.QLabel(self.centralwidget) @@ -127,6 +139,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.url_properties.sizePolicy().hasHeightForWidth()) self.url_properties.setSizePolicy(sizePolicy) + self.url_properties.setTitle(_("URL properties")) self.url_properties.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.url_properties.setObjectName(_fromUtf8("url_properties")) self.horizontalLayout_2 = QtGui.QHBoxLayout(self.url_properties) @@ -140,6 +153,7 @@ self.formLayout.setFieldGrowthPolicy(QtGui.QFormLayout.ExpandingFieldsGrow) self.formLayout.setObjectName(_fromUtf8("formLayout")) self.label_2 = QtGui.QLabel(self.frame) + self.label_2.setText(_("URL")) self.label_2.setObjectName(_fromUtf8("label_2")) self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_2) self.prop_url = QtGui.QLabel(self.frame) @@ -157,6 +171,7 @@ self.prop_url.setObjectName(_fromUtf8("prop_url")) self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.prop_url) self.label_3 = QtGui.QLabel(self.frame) + self.label_3.setText(_("Name")) self.label_3.setObjectName(_fromUtf8("label_3")) self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.label_3) self.prop_name = QtGui.QLabel(self.frame) @@ -173,6 +188,7 @@ self.prop_name.setObjectName(_fromUtf8("prop_name")) self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.prop_name) self.label_4 = QtGui.QLabel(self.frame) + self.label_4.setText(_("Parent URL")) self.label_4.setObjectName(_fromUtf8("label_4")) self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.label_4) self.prop_parenturl = QtGui.QLabel(self.frame) @@ -190,6 +206,7 @@ self.prop_parenturl.setObjectName(_fromUtf8("prop_parenturl")) self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.prop_parenturl) self.label_5 = QtGui.QLabel(self.frame) + self.label_5.setText(_("Base")) self.label_5.setObjectName(_fromUtf8("label_5")) self.formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.label_5) self.prop_base = QtGui.QLabel(self.frame) @@ -207,6 +224,7 @@ self.prop_base.setObjectName(_fromUtf8("prop_base")) self.formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.prop_base) self.label_7 = QtGui.QLabel(self.frame) + self.label_7.setText(_("Check time")) self.label_7.setObjectName(_fromUtf8("label_7")) self.formLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.label_7) self.prop_checktime = QtGui.QLabel(self.frame) @@ -223,6 +241,7 @@ self.prop_checktime.setObjectName(_fromUtf8("prop_checktime")) self.formLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.prop_checktime) self.label_8 = QtGui.QLabel(self.frame) + self.label_8.setText(_("D/L time")) self.label_8.setObjectName(_fromUtf8("label_8")) self.formLayout.setWidget(5, QtGui.QFormLayout.LabelRole, self.label_8) self.prop_dltime = QtGui.QLabel(self.frame) @@ -239,6 +258,7 @@ self.prop_dltime.setObjectName(_fromUtf8("prop_dltime")) self.formLayout.setWidget(5, QtGui.QFormLayout.FieldRole, self.prop_dltime) self.label_9 = QtGui.QLabel(self.frame) + self.label_9.setText(_("Size")) self.label_9.setObjectName(_fromUtf8("label_9")) self.formLayout.setWidget(6, QtGui.QFormLayout.LabelRole, self.label_9) self.prop_size = QtGui.QLabel(self.frame) @@ -255,6 +275,7 @@ self.prop_size.setObjectName(_fromUtf8("prop_size")) self.formLayout.setWidget(6, QtGui.QFormLayout.FieldRole, self.prop_size) self.label_10 = QtGui.QLabel(self.frame) + self.label_10.setText(_("Info")) self.label_10.setObjectName(_fromUtf8("label_10")) self.formLayout.setWidget(7, QtGui.QFormLayout.LabelRole, self.label_10) self.prop_info = QtGui.QLabel(self.frame) @@ -272,6 +293,7 @@ self.prop_info.setObjectName(_fromUtf8("prop_info")) self.formLayout.setWidget(7, QtGui.QFormLayout.FieldRole, self.prop_info) self.label_11 = QtGui.QLabel(self.frame) + self.label_11.setText(_("Warning")) self.label_11.setObjectName(_fromUtf8("label_11")) self.formLayout.setWidget(8, QtGui.QFormLayout.LabelRole, self.label_11) self.prop_warning = QtGui.QLabel(self.frame) @@ -290,6 +312,7 @@ self.prop_warning.setObjectName(_fromUtf8("prop_warning")) self.formLayout.setWidget(8, QtGui.QFormLayout.FieldRole, self.prop_warning) self.label_12 = QtGui.QLabel(self.frame) + self.label_12.setText(_("Result")) self.label_12.setObjectName(_fromUtf8("label_12")) self.formLayout.setWidget(9, QtGui.QFormLayout.LabelRole, self.label_12) self.prop_result = QtGui.QLabel(self.frame) @@ -324,9 +347,10 @@ sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) self.groupBox.setSizePolicy(sizePolicy) font = QtGui.QFont() - font.setWeight(75) font.setBold(True) + font.setWeight(75) self.groupBox.setFont(font) + self.groupBox.setTitle(_("Check results")) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) @@ -336,6 +360,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_24.sizePolicy().hasHeightForWidth()) self.label_24.setSizePolicy(sizePolicy) + self.label_24.setText(_("Valid URLs")) self.label_24.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_24.setObjectName(_fromUtf8("label_24")) self.gridLayout.addWidget(self.label_24, 0, 0, 1, 1) @@ -359,6 +384,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_26.sizePolicy().hasHeightForWidth()) self.label_26.setSizePolicy(sizePolicy) + self.label_26.setText(_("Warnings")) self.label_26.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_26.setObjectName(_fromUtf8("label_26")) self.gridLayout.addWidget(self.label_26, 0, 2, 1, 1) @@ -382,6 +408,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_25.sizePolicy().hasHeightForWidth()) self.label_25.setSizePolicy(sizePolicy) + self.label_25.setText(_("Invalid URLs")) self.label_25.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_25.setObjectName(_fromUtf8("label_25")) self.gridLayout.addWidget(self.label_25, 1, 0, 1, 1) @@ -406,6 +433,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox_3.sizePolicy().hasHeightForWidth()) self.groupBox_3.setSizePolicy(sizePolicy) + self.groupBox_3.setTitle(_("Content type statistics")) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_3) self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) @@ -415,6 +443,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) self.label_6.setSizePolicy(sizePolicy) + self.label_6.setText(_("Image")) self.label_6.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridLayout_2.addWidget(self.label_6, 0, 0, 1, 1) @@ -438,6 +467,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_13.sizePolicy().hasHeightForWidth()) self.label_13.setSizePolicy(sizePolicy) + self.label_13.setText(_("Text")) self.label_13.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_13.setObjectName(_fromUtf8("label_13")) self.gridLayout_2.addWidget(self.label_13, 0, 2, 1, 1) @@ -461,6 +491,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_27.sizePolicy().hasHeightForWidth()) self.label_27.setSizePolicy(sizePolicy) + self.label_27.setText(_("Application")) self.label_27.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_27.setObjectName(_fromUtf8("label_27")) self.gridLayout_2.addWidget(self.label_27, 0, 4, 1, 1) @@ -484,6 +515,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_17.sizePolicy().hasHeightForWidth()) self.label_17.setSizePolicy(sizePolicy) + self.label_17.setText(_("Audio")) self.label_17.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_17.setObjectName(_fromUtf8("label_17")) self.gridLayout_2.addWidget(self.label_17, 1, 0, 1, 1) @@ -507,6 +539,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_21.sizePolicy().hasHeightForWidth()) self.label_21.setSizePolicy(sizePolicy) + self.label_21.setText(_("Video")) self.label_21.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_21.setObjectName(_fromUtf8("label_21")) self.gridLayout_2.addWidget(self.label_21, 1, 2, 1, 1) @@ -544,6 +577,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_23.sizePolicy().hasHeightForWidth()) self.label_23.setSizePolicy(sizePolicy) + self.label_23.setText(_("Other")) self.label_23.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_23.setObjectName(_fromUtf8("label_23")) self.gridLayout_2.addWidget(self.label_23, 2, 4, 1, 1) @@ -567,6 +601,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_22.sizePolicy().hasHeightForWidth()) self.label_22.setSizePolicy(sizePolicy) + self.label_22.setText(_("Mail")) self.label_22.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_22.setObjectName(_fromUtf8("label_22")) self.gridLayout_2.addWidget(self.label_22, 1, 4, 1, 1) @@ -577,6 +612,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth()) self.groupBox_2.setSizePolicy(sizePolicy) + self.groupBox_2.setTitle(_("URL statistics")) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.gridLayout_3 = QtGui.QGridLayout(self.groupBox_2) self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) @@ -586,6 +622,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_18.sizePolicy().hasHeightForWidth()) self.label_18.setSizePolicy(sizePolicy) + self.label_18.setText(_("Min. length")) self.label_18.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_18.setObjectName(_fromUtf8("label_18")) self.gridLayout_3.addWidget(self.label_18, 0, 0, 1, 1) @@ -609,6 +646,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_20.sizePolicy().hasHeightForWidth()) self.label_20.setSizePolicy(sizePolicy) + self.label_20.setText(_("Avg. length")) self.label_20.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_20.setObjectName(_fromUtf8("label_20")) self.gridLayout_3.addWidget(self.label_20, 0, 2, 1, 1) @@ -632,6 +670,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_19.sizePolicy().hasHeightForWidth()) self.label_19.setSizePolicy(sizePolicy) + self.label_19.setText(_("Max. length")) self.label_19.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_19.setObjectName(_fromUtf8("label_19")) self.gridLayout_3.addWidget(self.label_19, 1, 0, 1, 1) @@ -655,6 +694,7 @@ sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_14.sizePolicy().hasHeightForWidth()) self.label_14.setSizePolicy(sizePolicy) + self.label_14.setText(_("Domains")) self.label_14.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_14.setObjectName(_fromUtf8("label_14")) self.gridLayout_3.addWidget(self.label_14, 1, 2, 1, 1) @@ -680,10 +720,13 @@ self.menubar.setGeometry(QtCore.QRect(0, 0, 782, 20)) self.menubar.setObjectName(_fromUtf8("menubar")) self.menuEdit = QtGui.QMenu(self.menubar) + self.menuEdit.setTitle(_("&Edit")) self.menuEdit.setObjectName(_fromUtf8("menuEdit")) self.menuFile = QtGui.QMenu(self.menubar) + self.menuFile.setTitle(_("&File")) self.menuFile.setObjectName(_fromUtf8("menuFile")) self.menuHelp = QtGui.QMenu(self.menubar) + self.menuHelp.setTitle(_("&Help")) self.menuHelp.setObjectName(_fromUtf8("menuHelp")) MainWindow.setMenuBar(self.menubar) self.statusBar = QtGui.QStatusBar(MainWindow) @@ -693,50 +736,74 @@ icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/about.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionAbout.setIcon(icon2) + self.actionAbout.setText(_("A&bout")) + self.actionAbout.setIconText(_("About")) self.actionAbout.setObjectName(_fromUtf8("actionAbout")) self.actionHelp = QtGui.QAction(MainWindow) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/help.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionHelp.setIcon(icon3) + self.actionHelp.setText(_("&Help")) + self.actionHelp.setIconText(_("Help")) self.actionHelp.setObjectName(_fromUtf8("actionHelp")) self.actionViewOnline = QtGui.QAction(MainWindow) icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/online.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionViewOnline.setIcon(icon4) + self.actionViewOnline.setText(_("View online")) + self.actionViewOnline.setToolTip(_("View URL online")) self.actionViewOnline.setObjectName(_fromUtf8("actionViewOnline")) self.actionOptions = QtGui.QAction(MainWindow) icon5 = QtGui.QIcon() icon5.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/preferences.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionOptions.setIcon(icon5) + self.actionOptions.setText(_("&Options")) + self.actionOptions.setIconText(_("Options")) self.actionOptions.setObjectName(_fromUtf8("actionOptions")) self.actionCopyToClipboard = QtGui.QAction(MainWindow) icon6 = QtGui.QIcon() icon6.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/copy.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionCopyToClipboard.setIcon(icon6) + self.actionCopyToClipboard.setText(_("Copy to clipboard")) + self.actionCopyToClipboard.setToolTip(_("Copy URL to clipboard")) + self.actionCopyToClipboard.setShortcut(_("Ctrl+C")) self.actionCopyToClipboard.setObjectName(_fromUtf8("actionCopyToClipboard")) self.actionViewParentOnline = QtGui.QAction(MainWindow) self.actionViewParentOnline.setIcon(icon4) + self.actionViewParentOnline.setText(_("View parent online")) + self.actionViewParentOnline.setToolTip(_("View parent URL online")) self.actionViewParentOnline.setObjectName(_fromUtf8("actionViewParentOnline")) self.actionViewParentSource = QtGui.QAction(MainWindow) self.actionViewParentSource.setIcon(icon4) + self.actionViewParentSource.setText(_("View parent source")) + self.actionViewParentSource.setToolTip(_("View parent URL source")) self.actionViewParentSource.setObjectName(_fromUtf8("actionViewParentSource")) self.actionDebug = QtGui.QAction(MainWindow) + self.actionDebug.setText(_("Show debug")) self.actionDebug.setObjectName(_fromUtf8("actionDebug")) self.actionViewProperties = QtGui.QAction(MainWindow) + self.actionViewProperties.setText(_("View properties")) + self.actionViewProperties.setToolTip(_("View URL properties")) self.actionViewProperties.setObjectName(_fromUtf8("actionViewProperties")) self.actionSave = QtGui.QAction(MainWindow) icon7 = QtGui.QIcon() icon7.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/save.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionSave.setIcon(icon7) + self.actionSave.setText(_("&Save results...")) + self.actionSave.setShortcut(_("Ctrl+S")) self.actionSave.setObjectName(_fromUtf8("actionSave")) self.actionQuit = QtGui.QAction(MainWindow) icon8 = QtGui.QIcon() icon8.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/exit.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionQuit.setIcon(icon8) + self.actionQuit.setText(_("&Quit")) + self.actionQuit.setShortcut(_("Ctrl+Q")) self.actionQuit.setObjectName(_fromUtf8("actionQuit")) self.actionCheckUpdates = QtGui.QAction(MainWindow) + self.actionCheckUpdates.setText(_("Check for updates")) self.actionCheckUpdates.setObjectName(_fromUtf8("actionCheckUpdates")) self.actionDonate = QtGui.QAction(MainWindow) + self.actionDonate.setText(_("Donate")) self.actionDonate.setObjectName(_fromUtf8("actionDonate")) self.menuEdit.addAction(self.actionOptions) self.menuFile.addAction(self.actionSave) @@ -755,73 +822,7 @@ QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle(_("LinkChecker")) - self.label.setText(_("URL:")) - self.controlButton.setToolTip(_("Start checking the given URL.")) - self.controlButton.setText(QtGui.QApplication.translate("MainWindow", "Start", "Start checking URL", QtGui.QApplication.UnicodeUTF8)) - self.label_32.setText(_("Active:")) - self.label_active.setText(_("0")) - self.label_30.setText(_("Queued:")) - self.label_queued.setText(_("0")) - self.label_28.setText(_("Checked:")) - self.label_checked.setText(_("0")) - self.label_15.setText(_("Info:")) - self.label_busy.setText(_("-")) - self.url_properties.setTitle(_("URL properties")) - self.label_2.setText(_("URL")) - self.label_3.setText(_("Name")) - self.label_4.setText(_("Parent URL")) - self.label_5.setText(_("Base")) - self.label_7.setText(_("Check time")) - self.label_8.setText(_("D/L time")) - self.label_9.setText(_("Size")) - self.label_10.setText(_("Info")) - self.label_11.setText(_("Warning")) - self.label_12.setText(_("Result")) - self.groupBox.setTitle(_("Check results")) - self.label_24.setText(_("Valid URLs")) - self.label_26.setText(_("Warnings")) - self.label_25.setText(_("Invalid URLs")) - self.groupBox_3.setTitle(_("Content type statistics")) - self.label_6.setText(_("Image")) - self.label_13.setText(_("Text")) - self.label_27.setText(_("Application")) - self.label_17.setText(_("Audio")) - self.label_21.setText(_("Video")) - self.label_23.setText(_("Other")) - self.label_22.setText(_("Mail")) - self.groupBox_2.setTitle(_("URL statistics")) - self.label_18.setText(_("Min. length")) - self.label_20.setText(_("Avg. length")) - self.label_19.setText(_("Max. length")) - self.label_14.setText(_("Domains")) - self.menuEdit.setTitle(_("&Edit")) - self.menuFile.setTitle(_("&File")) - self.menuHelp.setTitle(_("&Help")) - self.actionAbout.setText(_("A&bout")) - self.actionAbout.setIconText(_("About")) - self.actionHelp.setText(_("&Help")) - self.actionHelp.setIconText(_("Help")) - self.actionViewOnline.setText(_("View online")) - self.actionViewOnline.setToolTip(_("View URL online")) - self.actionOptions.setText(_("&Options")) - self.actionOptions.setIconText(_("Options")) - self.actionCopyToClipboard.setText(_("Copy to clipboard")) - self.actionCopyToClipboard.setToolTip(_("Copy URL to clipboard")) - self.actionCopyToClipboard.setShortcut(_("Ctrl+C")) - self.actionViewParentOnline.setText(_("View parent online")) - self.actionViewParentOnline.setToolTip(_("View parent URL online")) - self.actionViewParentSource.setText(_("View parent source")) - self.actionViewParentSource.setToolTip(_("View parent URL source")) - self.actionDebug.setText(_("Show debug")) - self.actionViewProperties.setText(_("View properties")) - self.actionViewProperties.setToolTip(_("View URL properties")) - self.actionSave.setText(_("&Save results...")) - self.actionSave.setShortcut(_("Ctrl+S")) - self.actionQuit.setText(_("&Quit")) - self.actionQuit.setShortcut(_("Ctrl+Q")) - self.actionCheckUpdates.setText(_("Check for updates")) - self.actionDonate.setText(_("Donate")) + pass from lineedit import LineEdit import linkchecker_rc diff -Nru linkchecker-7.2/linkcheck/gui/linkchecker_ui_options.py linkchecker-7.4/linkcheck/gui/linkchecker_ui_options.py --- linkchecker-7.2/linkcheck/gui/linkchecker_ui_options.py 2011-10-19 19:24:58.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/linkchecker_ui_options.py 2011-12-29 05:54:23.000000000 +0000 @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'ui/options.ui' # -# Created: Wed Oct 19 21:24:58 2011 -# by: PyQt4 UI code generator 4.8.3 +# Created: Fri Dec 16 21:48:49 2011 +# by: PyQt4 UI code generator 4.8.6 # # WARNING! All changes made in this file will be lost! @@ -17,170 +17,131 @@ class Ui_Options(object): def setupUi(self, Options): Options.setObjectName(_fromUtf8("Options")) - Options.setWindowModality(QtCore.Qt.ApplicationModal) - Options.resize(279, 239) - self.verticalLayout = QtGui.QVBoxLayout(Options) - self.verticalLayout.setSpacing(2) - self.verticalLayout.setSizeConstraint(QtGui.QLayout.SetMinimumSize) - self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.tabWidget = QtGui.QTabWidget(Options) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) - self.tabWidget.setSizePolicy(sizePolicy) - self.tabWidget.setToolTip(_fromUtf8("")) - self.tabWidget.setObjectName(_fromUtf8("tabWidget")) - self.gui_options = QtGui.QWidget() - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.gui_options.sizePolicy().hasHeightForWidth()) - self.gui_options.setSizePolicy(sizePolicy) - self.gui_options.setToolTip(_fromUtf8("")) - self.gui_options.setObjectName(_fromUtf8("gui_options")) - self.verticalLayout_3 = QtGui.QVBoxLayout(self.gui_options) - self.verticalLayout_3.setSpacing(2) + Options.resize(455, 550) + Options.setMinimumSize(QtCore.QSize(400, 550)) + Options.setWindowTitle(_("Dialog")) + self.verticalLayout_3 = QtGui.QVBoxLayout(Options) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - self.label_8 = QtGui.QLabel(self.gui_options) - self.label_8.setMinimumSize(QtCore.QSize(240, 0)) - self.label_8.setTextFormat(QtCore.Qt.AutoText) - self.label_8.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) - self.label_8.setWordWrap(True) - self.label_8.setObjectName(_fromUtf8("label_8")) - self.verticalLayout_3.addWidget(self.label_8) - self.frame = QtGui.QFrame(self.gui_options) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) - self.frame.setSizePolicy(sizePolicy) - self.frame.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame.setFrameShadow(QtGui.QFrame.Raised) - self.frame.setObjectName(_fromUtf8("frame")) - self.formLayout = QtGui.QFormLayout(self.frame) - self.formLayout.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint) - self.formLayout.setFieldGrowthPolicy(QtGui.QFormLayout.ExpandingFieldsGrow) - self.formLayout.setHorizontalSpacing(4) - self.formLayout.setVerticalSpacing(8) + self.groupBox_2 = QtGui.QGroupBox(Options) + self.groupBox_2.setTitle(_("Checking options")) + self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) + self.verticalLayout = QtGui.QVBoxLayout(self.groupBox_2) + self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) + self.widget = QtGui.QWidget(self.groupBox_2) + self.widget.setObjectName(_fromUtf8("widget")) + self.formLayout = QtGui.QFormLayout(self.widget) + self.formLayout.setMargin(0) self.formLayout.setObjectName(_fromUtf8("formLayout")) - self.label = QtGui.QLabel(self.frame) + self.label = QtGui.QLabel(self.widget) + self.label.setToolTip(_("Check recursively all links up to given depth. A negative depth will enable infinite recursion.")) + self.label.setText(_("Recursive depth")) self.label.setObjectName(_fromUtf8("label")) self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label) - self.recursionlevel = QtGui.QSpinBox(self.frame) + self.recursionlevel = QtGui.QSpinBox(self.widget) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.recursionlevel.sizePolicy().hasHeightForWidth()) self.recursionlevel.setSizePolicy(sizePolicy) self.recursionlevel.setMinimumSize(QtCore.QSize(0, 25)) + self.recursionlevel.setToolTip(_("Check recursively all links up to given depth. A negative depth will enable infinite recursion.")) self.recursionlevel.setMinimum(-1) self.recursionlevel.setMaximum(100) - self.recursionlevel.setProperty(_fromUtf8("value"), -1) + self.recursionlevel.setProperty("value", -1) self.recursionlevel.setObjectName(_fromUtf8("recursionlevel")) self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.recursionlevel) - self.label_2 = QtGui.QLabel(self.frame) + self.label_2 = QtGui.QLabel(self.widget) + self.label_2.setToolTip(_("Log all checked URLs once. Default is to log only errors and warnings.")) + self.label_2.setText(_("Verbose output")) self.label_2.setObjectName(_fromUtf8("label_2")) self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.label_2) - self.verbose = QtGui.QCheckBox(self.frame) + self.verbose = QtGui.QCheckBox(self.widget) self.verbose.setEnabled(True) + self.verbose.setToolTip(_("Log all checked URLs once. Default is to log only errors and warnings.")) self.verbose.setText(_fromUtf8("")) self.verbose.setObjectName(_fromUtf8("verbose")) self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.verbose) - self.label_4 = QtGui.QLabel(self.frame) + self.label_4 = QtGui.QLabel(self.widget) + self.label_4.setText(_("Debug")) self.label_4.setObjectName(_fromUtf8("label_4")) self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.label_4) - self.debug = QtGui.QCheckBox(self.frame) + self.debug = QtGui.QCheckBox(self.widget) self.debug.setText(_fromUtf8("")) self.debug.setObjectName(_fromUtf8("debug")) self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.debug) - self.warningregex = QtGui.QLineEdit(self.frame) - self.warningregex.setObjectName(_fromUtf8("warningregex")) - self.formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.warningregex) - self.label_3 = QtGui.QLabel(self.frame) + self.verticalLayout.addWidget(self.widget) + spacerItem = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.label_5 = QtGui.QLabel(self.groupBox_2) + self.label_5.setText(_("Warn when one of these strings are found (one per line):")) + self.label_5.setObjectName(_fromUtf8("label_5")) + self.verticalLayout.addWidget(self.label_5) + self.warninglines = QtGui.QPlainTextEdit(self.groupBox_2) + self.warninglines.setMaximumSize(QtCore.QSize(16777215, 150)) + self.warninglines.setObjectName(_fromUtf8("warninglines")) + self.verticalLayout.addWidget(self.warninglines) + self.label_6 = QtGui.QLabel(self.groupBox_2) + self.label_6.setText(_("Ignore URLs matching one of these patterns (one per line):")) + self.label_6.setObjectName(_fromUtf8("label_6")) + self.verticalLayout.addWidget(self.label_6) + self.ignorelines = QtGui.QPlainTextEdit(self.groupBox_2) + self.ignorelines.setMaximumSize(QtCore.QSize(16777215, 150)) + self.ignorelines.setObjectName(_fromUtf8("ignorelines")) + self.verticalLayout.addWidget(self.ignorelines) + self.verticalLayout_3.addWidget(self.groupBox_2) + self.groupBox = QtGui.QGroupBox(Options) + self.groupBox.setTitle(_("Configuration file")) + self.groupBox.setObjectName(_fromUtf8("groupBox")) + self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox) + self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) + self.label_3 = QtGui.QLabel(self.groupBox) + self.label_3.setText(_("The configuration file holds advanced options and can be edited with an integrated text editor.")) + self.label_3.setWordWrap(True) self.label_3.setObjectName(_fromUtf8("label_3")) - self.formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.label_3) - self.verticalLayout_3.addWidget(self.frame) - self.widget = QtGui.QWidget(self.gui_options) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth()) - self.widget.setSizePolicy(sizePolicy) - self.widget.setObjectName(_fromUtf8("widget")) - self.horizontalLayout = QtGui.QHBoxLayout(self.widget) - self.horizontalLayout.setSizeConstraint(QtGui.QLayout.SetMinimumSize) - self.horizontalLayout.setMargin(0) - self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - self.closeButton = QtGui.QPushButton(self.widget) - self.closeButton.setObjectName(_fromUtf8("closeButton")) - self.horizontalLayout.addWidget(self.closeButton) - self.verticalLayout_3.addWidget(self.widget) - self.tabWidget.addTab(self.gui_options, _fromUtf8("")) - self.config_options = QtGui.QWidget() - self.config_options.setToolTip(_fromUtf8("")) - self.config_options.setObjectName(_fromUtf8("config_options")) - self.verticalLayout_5 = QtGui.QVBoxLayout(self.config_options) - self.verticalLayout_5.setSpacing(0) - self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) - self.label_9 = QtGui.QLabel(self.config_options) - self.label_9.setTextFormat(QtCore.Qt.AutoText) - self.label_9.setWordWrap(True) - self.label_9.setObjectName(_fromUtf8("label_9")) - self.verticalLayout_5.addWidget(self.label_9) - self.frame_2 = QtGui.QFrame(self.config_options) - self.frame_2.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame_2.setFrameShadow(QtGui.QFrame.Raised) - self.frame_2.setMidLineWidth(0) - self.frame_2.setObjectName(_fromUtf8("frame_2")) - self.verticalLayout_4 = QtGui.QVBoxLayout(self.frame_2) - self.verticalLayout_4.setSpacing(4) - self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) - self.user_config_label = QtGui.QLabel(self.frame_2) + self.verticalLayout_2.addWidget(self.label_3) + spacerItem1 = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.verticalLayout_2.addItem(spacerItem1) + self.user_config_label_2 = QtGui.QLabel(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.user_config_label.sizePolicy().hasHeightForWidth()) - self.user_config_label.setSizePolicy(sizePolicy) - self.user_config_label.setFrameShape(QtGui.QFrame.NoFrame) - self.user_config_label.setLineWidth(0) - self.user_config_label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) - self.user_config_label.setWordWrap(True) - self.user_config_label.setMargin(0) - self.user_config_label.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) - self.user_config_label.setObjectName(_fromUtf8("user_config_label")) - self.verticalLayout_4.addWidget(self.user_config_label) - self.user_config_button = QtGui.QPushButton(self.frame_2) + sizePolicy.setHeightForWidth(self.user_config_label_2.sizePolicy().hasHeightForWidth()) + self.user_config_label_2.setSizePolicy(sizePolicy) + self.user_config_label_2.setToolTip(_("Overrides system wide configuration file settings.")) + self.user_config_label_2.setFrameShape(QtGui.QFrame.NoFrame) + self.user_config_label_2.setLineWidth(0) + self.user_config_label_2.setText(_("/home/user/.linkchecker/linkcheckerrc")) + self.user_config_label_2.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) + self.user_config_label_2.setWordWrap(True) + self.user_config_label_2.setMargin(0) + self.user_config_label_2.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) + self.user_config_label_2.setObjectName(_fromUtf8("user_config_label_2")) + self.verticalLayout_2.addWidget(self.user_config_label_2) + self.user_config_button = QtGui.QPushButton(self.groupBox) self.user_config_button.setEnabled(False) self.user_config_button.setToolTip(_fromUtf8("")) + self.user_config_button.setText(_("Edit")) self.user_config_button.setObjectName(_fromUtf8("user_config_button")) - self.verticalLayout_4.addWidget(self.user_config_button) - self.verticalLayout_5.addWidget(self.frame_2) - spacerItem = QtGui.QSpacerItem(20, 60, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) - self.verticalLayout_5.addItem(spacerItem) - self.tabWidget.addTab(self.config_options, _fromUtf8("")) - self.verticalLayout.addWidget(self.tabWidget) + self.verticalLayout_2.addWidget(self.user_config_button) + self.verticalLayout_3.addWidget(self.groupBox) + spacerItem2 = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.verticalLayout_3.addItem(spacerItem2) + self.widget_2 = QtGui.QWidget(Options) + self.widget_2.setObjectName(_fromUtf8("widget_2")) + self.horizontalLayout = QtGui.QHBoxLayout(self.widget_2) + self.horizontalLayout.setMargin(0) + self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) + self.closeButton = QtGui.QPushButton(self.widget_2) + self.closeButton.setText(_("Close")) + self.closeButton.setObjectName(_fromUtf8("closeButton")) + self.horizontalLayout.addWidget(self.closeButton) + spacerItem3 = QtGui.QSpacerItem(317, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout.addItem(spacerItem3) + self.verticalLayout_3.addWidget(self.widget_2) self.retranslateUi(Options) - self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(Options) def retranslateUi(self, Options): - Options.setWindowTitle(_("Linkchecker options")) - self.label_8.setText(_("The most common check options are configurable. They override any configuration file settings.")) - self.label.setToolTip(_("Check recursively all links up to given depth. A negative depth will enable infinite recursion.")) - self.label.setText(_("Recursive depth")) - self.recursionlevel.setToolTip(_("Check recursively all links up to given depth. A negative depth will enable infinite recursion.")) - self.label_2.setToolTip(_("Log all checked URLs once. Default is to log only errors and warnings.")) - self.label_2.setText(_("Verbose output")) - self.verbose.setToolTip(_("Log all checked URLs once. Default is to log only errors and warnings.")) - self.label_4.setText(_("Debug")) - self.label_3.setText(_("Warning regex")) - self.closeButton.setText(_("Close")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.gui_options), _("GUI options")) - self.label_9.setText(_("The user configuration file holds advanced options and can be edited with an integrated text editor.")) - self.user_config_label.setToolTip(_("Overrides system wide configuration file settings.")) - self.user_config_label.setText(_("/home/user/.linkchecker/linkcheckerrc")) - self.user_config_button.setText(_("Edit")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.config_options), _("Configuration file")) + pass diff -Nru linkchecker-7.2/linkcheck/gui/linkchecker_ui_progress.py linkchecker-7.4/linkcheck/gui/linkchecker_ui_progress.py --- linkchecker-7.2/linkcheck/gui/linkchecker_ui_progress.py 2011-05-30 20:09:36.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/linkchecker_ui_progress.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'ui/progress.ui' -# -# Created: Wed Mar 16 18:06:04 2011 -# by: PyQt4 UI code generator 4.8.3 -# -# WARNING! All changes made in this file will be lost! - -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - _fromUtf8 = lambda s: s - -class Ui_ProgressDialog(object): - def setupUi(self, ProgressDialog): - ProgressDialog.setObjectName(_fromUtf8("ProgressDialog")) - ProgressDialog.setWindowModality(QtCore.Qt.ApplicationModal) - ProgressDialog.resize(252, 179) - self.verticalLayout = QtGui.QVBoxLayout(ProgressDialog) - self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.frame = QtGui.QFrame(ProgressDialog) - self.frame.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame.setFrameShadow(QtGui.QFrame.Raised) - self.frame.setObjectName(_fromUtf8("frame")) - self.verticalLayout_2 = QtGui.QVBoxLayout(self.frame) - self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.groupBox = QtGui.QGroupBox(self.frame) - self.groupBox.setObjectName(_fromUtf8("groupBox")) - self.formLayout = QtGui.QFormLayout(self.groupBox) - self.formLayout.setObjectName(_fromUtf8("formLayout")) - self.label = QtGui.QLabel(self.groupBox) - self.label.setObjectName(_fromUtf8("label")) - self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label) - self.label_active = QtGui.QLabel(self.groupBox) - self.label_active.setObjectName(_fromUtf8("label_active")) - self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.label_active) - self.label_2 = QtGui.QLabel(self.groupBox) - self.label_2.setObjectName(_fromUtf8("label_2")) - self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.label_2) - self.label_queued = QtGui.QLabel(self.groupBox) - self.label_queued.setObjectName(_fromUtf8("label_queued")) - self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.label_queued) - self.label_3 = QtGui.QLabel(self.groupBox) - self.label_3.setObjectName(_fromUtf8("label_3")) - self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.label_3) - self.label_checked = QtGui.QLabel(self.groupBox) - self.label_checked.setObjectName(_fromUtf8("label_checked")) - self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.label_checked) - self.verticalLayout_2.addWidget(self.groupBox) - self.progressBar = QtGui.QProgressBar(self.frame) - self.progressBar.setProperty(_fromUtf8("value"), 24) - self.progressBar.setObjectName(_fromUtf8("progressBar")) - self.verticalLayout_2.addWidget(self.progressBar) - self.widget = QtGui.QWidget(self.frame) - self.widget.setObjectName(_fromUtf8("widget")) - self.horizontalLayout = QtGui.QHBoxLayout(self.widget) - self.horizontalLayout.setMargin(0) - self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - self.cancelLabel = QtGui.QLabel(self.widget) - self.cancelLabel.setText(_fromUtf8("")) - self.cancelLabel.setObjectName(_fromUtf8("cancelLabel")) - self.horizontalLayout.addWidget(self.cancelLabel) - self.cancelButton = QtGui.QPushButton(self.widget) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.cancelButton.sizePolicy().hasHeightForWidth()) - self.cancelButton.setSizePolicy(sizePolicy) - self.cancelButton.setObjectName(_fromUtf8("cancelButton")) - self.horizontalLayout.addWidget(self.cancelButton) - self.verticalLayout_2.addWidget(self.widget) - self.verticalLayout.addWidget(self.frame) - self.cancelLabel.setBuddy(self.cancelButton) - - self.retranslateUi(ProgressDialog) - QtCore.QMetaObject.connectSlotsByName(ProgressDialog) - - def retranslateUi(self, ProgressDialog): - ProgressDialog.setWindowTitle(_("LinkChecker progress")) - self.groupBox.setTitle(_("Status")) - self.label.setText(_("Active:")) - self.label_active.setText(_("0")) - self.label_2.setText(_("Queued:")) - self.label_queued.setText(_("0")) - self.label_3.setText(_("Checked:")) - self.label_checked.setText(_("0")) - self.cancelButton.setText(_("Cancel")) - diff -Nru linkchecker-7.2/linkcheck/gui/options.py linkchecker-7.4/linkcheck/gui/options.py --- linkchecker-7.2/linkcheck/gui/options.py 2011-10-20 07:11:20.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/options.py 2011-12-29 05:54:23.000000000 +0000 @@ -19,7 +19,6 @@ from PyQt4 import QtGui from .linkchecker_ui_options import Ui_Options from .editor import EditorWindow -from .validator import PyRegexValidator, check_regex from .. import configuration @@ -30,26 +29,11 @@ """Reset all options and initialize the editor window.""" super(LinkCheckerOptions, self).__init__(parent) self.setupUi(self) - self.validator = PyRegexValidator(self.warningregex) - self.warningregex.setValidator(self.validator) - self.warningregex.textChanged.connect(self.check_warningregex) self.editor = EditorWindow(self) self.closeButton.clicked.connect(self.close) self.user_config_button.clicked.connect(self.edit_user_config) self.reset() - def check_warningregex (self, text): - """Display red text for invalid regex contents.""" - if check_regex(unicode(text)): - style = "QLineEdit {}" - self.warningregex.setStyleSheet(style) - self.warningregex.setToolTip(u"") - else: - # red text - style = "QLineEdit {color:#aa0000;}" - self.warningregex.setStyleSheet(style) - self.warningregex.setToolTip(_("Invalid regular expression")) - def reset (self): """Reset GUI and config options.""" self.user_config = configuration.get_user_config() @@ -61,7 +45,8 @@ self.recursionlevel.setValue(-1) self.verbose.setChecked(False) self.debug.setChecked(False) - self.warningregex.setText(u"") + self.warninglines.setPlainText(u"") + self.ignorelines.setPlainText(u"") def reset_config_options (self): """Reset configuration file edit buttons.""" @@ -80,7 +65,8 @@ debug=self.debug.isChecked(), verbose=self.verbose.isChecked(), recursionlevel=self.recursionlevel.value(), - warningregex=unicode(self.warningregex.text()), + warninglines=unicode(self.warninglines.toPlainText()), + ignorelines=unicode(self.ignorelines.toPlainText()), ) def set_options (self, data): @@ -91,8 +77,10 @@ self.verbose.setChecked(data["verbose"]) if data["recursionlevel"] is not None: self.recursionlevel.setValue(data["recursionlevel"]) - if data["warningregex"] is not None: - self.warningregex.setText(data["warningregex"]) + if data["warninglines"] is not None: + self.warninglines.setPlainText(data["warninglines"]) + if data["ignorelines"] is not None: + self.ignorelines.setPlainText(data["ignorelines"]) def start_editor (filename, writable, editor): diff -Nru linkchecker-7.2/linkcheck/gui/settings.py linkchecker-7.4/linkcheck/gui/settings.py --- linkchecker-7.2/linkcheck/gui/settings.py 2011-10-19 19:59:33.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/settings.py 2011-12-29 05:54:23.000000000 +0000 @@ -17,7 +17,6 @@ """Read and store QSettings for this application.""" from PyQt4 import QtCore -from .validator import check_regex def save_point (qpoint): @@ -87,7 +86,7 @@ def read_options (self): """Return stored GUI options.""" data = dict(debug=None, verbose=None, recursionlevel=None, - warningregex=None) + warninglines=None, ignorelines=None) self.settings.beginGroup('output') for key in ("debug", "verbose"): if self.settings.contains(key): @@ -105,11 +104,12 @@ else: value = -1 data['recursionlevel'] = value - if self.settings.contains('warningregex'): - value = self.settings.value('warningregex').toString() - value = unicode(value) - if not value or check_regex(value): - data['warningregex'] = value + if self.settings.contains('warninglines'): + value = self.settings.value('warninglines').toString() + data['warninglines'] = unicode(value) + if self.settings.contains('ignorelines'): + value = self.settings.value('ignorelines').toString() + data['ignorelines'] = unicode(value) self.settings.endGroup() return data @@ -120,10 +120,8 @@ self.settings.setValue(key, QtCore.QVariant(data[key])) self.settings.endGroup() self.settings.beginGroup('checking') - key = "recursionlevel" - self.settings.setValue(key, QtCore.QVariant(data[key])) - key = "warningregex" - self.settings.setValue(key, QtCore.QVariant(data[key])) + for key in ("recursionlevel", "warninglines", "ignorelines"): + self.settings.setValue(key, QtCore.QVariant(data[key])) self.settings.endGroup() def read_recent_documents (self): diff -Nru linkchecker-7.2/linkcheck/gui/ui/options.ui linkchecker-7.4/linkcheck/gui/ui/options.ui --- linkchecker-7.2/linkcheck/gui/ui/options.ui 2011-10-19 19:24:46.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/ui/options.ui 2011-12-20 19:15:00.000000000 +0000 @@ -2,326 +2,277 @@ Options - - Qt::ApplicationModal - 0 0 - 279 - 239 + 455 + 550 + + + 400 + 550 + + - Linkchecker options + Dialog - - - 2 - - - QLayout::SetMinimumSize - + - - - - 0 - 0 - + + + Checking options - - + + + + + + + + Check recursively all links up to given depth. A negative depth will enable infinite recursion. + + + Recursive depth + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + Check recursively all links up to given depth. A negative depth will enable infinite recursion. + + + -1 + + + 100 + + + -1 + + + + + + + Log all checked URLs once. Default is to log only errors and warnings. + + + Verbose output + + + + + + + true + + + Log all checked URLs once. Default is to log only errors and warnings. + + + + + + + + + + Debug + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 10 + + + + + + + + Warn when one of these strings are found (one per line): + + + + + + + + 16777215 + 150 + + + + + + + + Ignore URLs matching one of these patterns (one per line): + + + + + + + + 16777215 + 150 + + + + + + + + + + + Configuration file - - 0 + + + + + The configuration file holds advanced options and can be edited with an integrated text editor. + + + true + + + + + + + Qt::Vertical + + + + 20 + 10 + + + + + + + + + 0 + 0 + + + + Overrides system wide configuration file settings. + + + QFrame::NoFrame + + + 0 + + + /home/user/.linkchecker/linkcheckerrc + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + 0 + + + Qt::TextSelectableByMouse + + + + + + + false + + + + + + Edit + + + + + + + + + + Qt::Vertical + + + + 20 + 10 + - - - - 0 - 0 - - - - - - - GUI options - - - - 2 - - - - - - 240 - 0 - - - - The most common check options are configurable. They override any configuration file settings. - - - Qt::AutoText - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - true - - - - - - - - 0 - 0 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - QLayout::SetDefaultConstraint - - - QFormLayout::ExpandingFieldsGrow - - - 4 - - - 8 - - - - - Check recursively all links up to given depth. A negative depth will enable infinite recursion. - - - Recursive depth - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - Check recursively all links up to given depth. A negative depth will enable infinite recursion. - - - -1 - - - 100 - - - -1 - - - - - - - Log all checked URLs once. Default is to log only errors and warnings. - - - Verbose output - - - - - - - true - - - Log all checked URLs once. Default is to log only errors and warnings. - - - - - - - - - - Debug - - - - - - - - - - - - - - - - - Warning regex - - - - - - - - - - - 0 - 0 - - - - - QLayout::SetMinimumSize - - - - - Close - - - - - - - - - - - - - - Configuration file - - - - 0 - - - - - The user configuration file holds advanced options and can be edited with an integrated text editor. - - - Qt::AutoText - - - true - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - 0 - - - - 4 - - - - - - 0 - 0 - - - - Overrides system wide configuration file settings. - - - QFrame::NoFrame - - - 0 - - - /home/user/.linkchecker/linkcheckerrc - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - true - - - 0 - - - Qt::TextSelectableByMouse - - - - - - - false - - - - - - Edit - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 60 - - - - - - + + + + + + + + + Close + + + + + + + Qt::Horizontal + + + + 317 + 20 + + + + + diff -Nru linkchecker-7.2/linkcheck/gui/urlsave.py linkchecker-7.4/linkcheck/gui/urlsave.py --- linkchecker-7.2/linkcheck/gui/urlsave.py 2011-05-30 20:09:36.000000000 +0000 +++ linkchecker-7.4/linkcheck/gui/urlsave.py 2011-12-29 05:54:23.000000000 +0000 @@ -33,11 +33,11 @@ def urlsave (parent, config, urls): """Save URL results in file.""" - res = get_save_filename(parent) - if not res: + filename = get_save_filename(parent) + if not filename: # user canceled return - filename = unicode(res) + filename = unicode(filename) logtype = FileExt2LogType.get(os.path.splitext(filename)[1]) if not logtype: return diff -Nru linkchecker-7.2/linkcheck/HtmlParser/htmllex.c linkchecker-7.4/linkcheck/HtmlParser/htmllex.c --- linkchecker-7.2/linkcheck/HtmlParser/htmllex.c 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/HtmlParser/htmllex.c 2011-12-25 09:50:50.000000000 +0000 @@ -4278,7 +4278,7 @@ YY_RULE_SETUP #line 814 "htmllex.l" { - /* backslash escapes seen at freshmeat.net */ + /* backslash escapes seen at freecode.com */ UPDATE_COLUMN; BEGIN(S_STRING); } diff -Nru linkchecker-7.2/linkcheck/HtmlParser/htmllex.l linkchecker-7.4/linkcheck/HtmlParser/htmllex.l --- linkchecker-7.2/linkcheck/HtmlParser/htmllex.l 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/HtmlParser/htmllex.l 2011-12-25 09:50:50.000000000 +0000 @@ -812,7 +812,7 @@ } \\\" { - /* backslash escapes seen at freshmeat.net */ + /* backslash escapes seen at freecode.com */ UPDATE_COLUMN; BEGIN(S_STRING); } diff -Nru linkchecker-7.2/linkcheck/HtmlParser/htmlparse.c linkchecker-7.4/linkcheck/HtmlParser/htmlparse.c --- linkchecker-7.2/linkcheck/HtmlParser/htmlparse.c 2011-08-14 07:32:54.000000000 +0000 +++ linkchecker-7.4/linkcheck/HtmlParser/htmlparse.c 2011-11-05 12:57:30.000000000 +0000 @@ -1,10 +1,8 @@ +/* A Bison parser, made by GNU Bison 2.5. */ -/* A Bison parser, made by GNU Bison 2.4.1. */ - -/* Skeleton implementation for Bison's Yacc-like parsers in C +/* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. 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 @@ -46,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "2.4.1" +#define YYBISON_VERSION "2.5" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -67,7 +65,7 @@ /* Copy the first part of user declarations. */ -/* Line 189 of yacc.c */ +/* Line 268 of yacc.c */ #line 1 "htmlparse.y" /* Copyright (C) 2000-2011 Bastian Kleineidam @@ -224,8 +222,8 @@ -/* Line 189 of yacc.c */ -#line 229 "htmlparse.c" +/* Line 268 of yacc.c */ +#line 227 "htmlparse.c" /* Enabling traces. */ #ifndef YYDEBUG @@ -280,8 +278,8 @@ /* Copy the second part of user declarations. */ -/* Line 264 of yacc.c */ -#line 285 "htmlparse.c" +/* Line 343 of yacc.c */ +#line 283 "htmlparse.c" #ifdef short # undef short @@ -331,7 +329,7 @@ #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ -# if YYENABLE_NLS +# if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) @@ -384,11 +382,11 @@ # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # endif @@ -411,24 +409,24 @@ # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif -# if (defined __cplusplus && ! defined _STDLIB_H \ +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif @@ -457,23 +455,7 @@ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif +# define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of @@ -493,6 +475,26 @@ #endif +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + /* YYFINAL -- State number of the termination state. */ #define YYFINAL 15 /* YYLAST -- Last index in YYTABLE. */ @@ -608,8 +610,8 @@ 1, 1, 1, 1, 1, 1 }; -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero +/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { @@ -640,8 +642,7 @@ /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ + number is the opposite. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { @@ -650,6 +651,12 @@ 6, 7, 8, 9, 10, 11, 12 }; +#define yypact_value_is_default(yystate) \ + ((yystate) == (-13)) + +#define yytable_value_is_error(yytable_value) \ + YYID (0) + static const yytype_int8 yycheck[] = { 0, 13, -1, 3, 4, 5, 6, 7, 8, 9, @@ -677,9 +684,18 @@ /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ + Once GCC version 2 has supplanted version 1, this can go. However, + YYFAIL appears to be in use. Nevertheless, it is formally deprecated + in Bison 2.4.2's NEWS entry, where a plan to phase it out is + discussed. */ #define YYFAIL goto yyerrlab +#if defined YYFAIL + /* This is here to suppress warnings from the GCC cpp's + -Wunused-macros. Normally we don't worry about that warning, but + some users do, and we want to make it easy for users to remove + YYFAIL uses, which will produce warnings from Bison 2.5. */ +#endif #define YYRECOVERING() (!!yyerrstatus) @@ -689,7 +705,6 @@ { \ yychar = (Token); \ yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ @@ -731,19 +746,10 @@ #endif -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ +/* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif @@ -935,7 +941,6 @@ # define YYMAXDEPTH 10000 #endif - #if YYERROR_VERBOSE @@ -1038,115 +1043,142 @@ } # endif -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. + + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + yytype_int16 *yyssp, int yytoken) { - int yyn = yypact[yystate]; + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = 0; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - Assume YYFAIL is not used. It's too flawed to consider. See + + for details. YYERROR is fine as it does not invoke this + function. + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yytoken != YYEMPTY) + { + int yyn = yypact[*yyssp]; + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + } - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else + switch (yycount) { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } + + yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return 1; + } + + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + { + char *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; } #endif /* YYERROR_VERBOSE */ - /*-----------------------------------------------. | Release the memory associated to this symbol. | @@ -1179,6 +1211,7 @@ } } + /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus @@ -1195,12 +1228,9 @@ #endif /* ! YYPARSE_PARAM */ - - - -/*-------------------------. -| yyparse or yypush_parse. | -`-------------------------*/ +/*----------. +| yyparse. | +`----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ @@ -1387,7 +1417,7 @@ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ @@ -1418,8 +1448,8 @@ yyn = yytable[yyn]; if (yyn <= 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; + if (yytable_value_is_error (yyn)) + goto yyerrlab; yyn = -yyn; goto yyreduce; } @@ -1474,47 +1504,47 @@ { case 2: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 180 "htmlparse.y" { /* parse a single element */ -;} +} break; case 3: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 183 "htmlparse.y" { /* parse a list of elements */ -;} +} break; case 4: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 188 "htmlparse.y" { /* wait for more lexer input */ YYACCEPT; -;} +} break; case 5: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 193 "htmlparse.y" { /* an error occured in the scanner, the python exception must be set */ UserData* ud = yyget_extra(scanner); PyErr_Fetch(&(ud->exc_type), &(ud->exc_val), &(ud->exc_tb)); YYABORT; -;} +} break; case 6: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 200 "htmlparse.y" { /* parsed HTML start tag (eg. ) @@ -1555,12 +1585,12 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; case 7: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 241 "htmlparse.y" { /* parsed HTML start-end tag (eg.
) @@ -1608,12 +1638,12 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; case 8: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 289 "htmlparse.y" { /* parsed HTML end tag (eg. ) @@ -1649,12 +1679,12 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; case 9: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 325 "htmlparse.y" { /* parsed HTML comment (eg. ) @@ -1673,12 +1703,12 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; case 10: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 344 "htmlparse.y" { /* $1 is a PyUnicode */ @@ -1696,12 +1726,12 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; case 11: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 362 "htmlparse.y" { /* parsed HTML CDATA (eg. ) @@ -1720,12 +1750,12 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; case 12: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 381 "htmlparse.y" { /* parsed HTML doctype (eg. ) @@ -1748,12 +1778,12 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; case 13: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 404 "htmlparse.y" { /* parsed HTML script content (plus end tag which is omitted) @@ -1777,12 +1807,12 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; case 14: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 428 "htmlparse.y" { /* parsed HTML style content (plus end tag which is omitted) @@ -1806,12 +1836,12 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; case 15: -/* Line 1455 of yacc.c */ +/* Line 1806 of yacc.c */ #line 452 "htmlparse.y" { /* parsed HTML text data @@ -1832,15 +1862,26 @@ YYABORT; } SET_OLD_LINECOL; -;} +} break; -/* Line 1455 of yacc.c */ -#line 1842 "htmlparse.c" +/* Line 1806 of yacc.c */ +#line 1872 "htmlparse.c" default: break; } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); @@ -1868,6 +1909,10 @@ | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { @@ -1875,37 +1920,36 @@ #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ + yyssp, yytoken) { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; } +# undef YYSYNTAX_ERROR #endif } @@ -1964,7 +2008,7 @@ for (;;) { yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) + if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) @@ -2023,8 +2067,13 @@ yyreturn: if (yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + } /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); @@ -2049,7 +2098,7 @@ -/* Line 1675 of yacc.c */ +/* Line 2067 of yacc.c */ #line 474 "htmlparse.y" diff -Nru linkchecker-7.2/linkcheck/HtmlParser/htmlparse.h linkchecker-7.4/linkcheck/HtmlParser/htmlparse.h --- linkchecker-7.2/linkcheck/HtmlParser/htmlparse.h 2011-08-14 07:32:54.000000000 +0000 +++ linkchecker-7.4/linkcheck/HtmlParser/htmlparse.h 2011-11-05 12:57:30.000000000 +0000 @@ -1,10 +1,8 @@ +/* A Bison parser, made by GNU Bison 2.5. */ -/* A Bison parser, made by GNU Bison 2.4.1. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C +/* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. 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 diff -Nru linkchecker-7.2/linkcheck/htmlutil/linkparse.py linkchecker-7.4/linkcheck/htmlutil/linkparse.py --- linkchecker-7.2/linkcheck/htmlutil/linkparse.py 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/htmlutil/linkparse.py 2011-12-30 11:35:18.000000000 +0000 @@ -27,23 +27,27 @@ unquote = strformat.unquote -# ripped mainly from HTML::Tagset.pm +# HTML4/5 link tags +# ripped mainly from HTML::Tagset.pm with HTML5 added LinkTags = { 'a': [u'href'], 'applet': [u'archive', u'src'], 'area': [u'href'], + 'audio': [u'src'], # HTML5 'bgsound': [u'src'], 'blockquote': [u'cite'], 'body': [u'background'], + 'button': [u'formaction'], # HTML5 'del': [u'cite'], 'embed': [u'pluginspage', u'src'], 'form': [u'action'], 'frame': [u'src', u'longdesc'], 'head': [u'profile'], + 'html': [u'manifest'], # HTML5 'iframe': [u'src', u'longdesc'], 'ilayer': [u'background'], 'img': [u'src', u'lowsrc', u'longdesc', u'usemap'], - 'input': [u'src', u'usemap'], + 'input': [u'src', u'usemap', u'formaction'], 'ins': [u'cite'], 'isindex': [u'action'], 'layer': [u'background', u'src'], @@ -52,10 +56,13 @@ 'object': [u'classid', u'data', u'archive', u'usemap'], 'q': [u'cite'], 'script': [u'src'], + 'source': [u'src'], # HTML5 'table': [u'background'], 'td': [u'background'], 'th': [u'background'], 'tr': [u'background'], + 'track': [u'src'], # HTML5 + 'video': [u'src'], # HTML5 'xmp': [u'href'], None: [u'style'], } @@ -177,8 +184,9 @@ if tag == "base" and not self.base_ref: self.base_ref = unquote(attrs.get_true("href", u'')) tagattrs = self.tags.get(tag, []) + # add universal tag attributes using tagname None tagattrs.extend(self.tags.get(None, [])) - # eliminate duplicate tag attrs + # eliminate duplicate tag attributes tagattrs = set(tagattrs) # parse URLs in tag (possibly multiple URLs in CSS styles) for attr in tagattrs: @@ -236,6 +244,8 @@ for mo in css_url_re.finditer(url): u = mo.group("url") urls.append(unquote(u, matching=True)) + elif attr == u'archive': + urls.extend(url.split(u',')) else: urls.append(url) if not urls: diff -Nru linkchecker-7.2/linkcheck/httplib2.py linkchecker-7.4/linkcheck/httplib2.py --- linkchecker-7.2/linkcheck/httplib2.py 2010-12-19 14:04:49.000000000 +0000 +++ linkchecker-7.4/linkcheck/httplib2.py 2012-01-04 18:55:31.000000000 +0000 @@ -724,7 +724,10 @@ try: port = int(host[i+1:]) except ValueError: - raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) + if host[i+1:] == "": # http://foo.com:/ == http://foo.com/ + port = self.default_port + else: + raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) host = host[:i] else: port = self.default_port @@ -837,7 +840,7 @@ del self._buffer[:] # If msg and message_body are sent in a single send() call, # it will avoid performance problems caused by the interaction - # between delayed ack and the Nagle algorithim. + # between delayed ack and the Nagle algorithm. if isinstance(message_body, str): msg += message_body message_body = None @@ -972,10 +975,10 @@ """Indicate that the last header line has been sent to the server. This method sends the request to the server. The optional - message_body argument can be used to pass message body + message_body argument can be used to pass a message body associated with the request. The message body will be sent in - the same packet as the message headers if possible. The - message_body should be a string. + the same packet as the message headers if it is a string, otherwise it is + sent as a separate packet. """ if self.__state == _CS_REQ_STARTED: @@ -1367,71 +1370,3 @@ return L + self._file.readlines() else: return L + self._file.readlines(size) - -def test(): - """Test this module. - - A hodge podge of tests collected here, because they have too many - external dependencies for the regular test suite. - """ - - import sys - import getopt - opts, args = getopt.getopt(sys.argv[1:], 'd') - dl = 0 - for o, a in opts: - if o == '-d': dl = dl + 1 - host = 'www.python.org' - selector = '/' - if args[0:]: host = args[0] - if args[1:]: selector = args[1] - h = HTTP() - h.set_debuglevel(dl) - h.connect(host) - h.putrequest('GET', selector) - h.endheaders() - status, reason, headers = h.getreply() - print 'status =', status - print 'reason =', reason - print "read", len(h.getfile().read()) - print - if headers: - for header in headers.headers: print header.strip() - print - - # minimal test that code to extract host from url works - class HTTP11(HTTP): - _http_vsn = 11 - _http_vsn_str = 'HTTP/1.1' - - h = HTTP11('www.python.org') - h.putrequest('GET', 'http://www.python.org/~jeremy/') - h.endheaders() - h.getreply() - h.close() - - try: - import ssl - except ImportError: - pass - else: - - for host, selector in (('sourceforge.net', '/projects/python'), - ): - print "https://%s%s" % (host, selector) - hs = HTTPS() - hs.set_debuglevel(dl) - hs.connect(host) - hs.putrequest('GET', selector) - hs.endheaders() - status, reason, headers = hs.getreply() - print 'status =', status - print 'reason =', reason - print "read", len(hs.getfile().read()) - print - if headers: - for header in headers.headers: print header.strip() - print - -if __name__ == '__main__': - test() diff -Nru linkchecker-7.2/linkcheck/__init__.py linkchecker-7.4/linkcheck/__init__.py --- linkchecker-7.2/linkcheck/__init__.py 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/__init__.py 2012-01-06 07:33:06.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2011 Bastian Kleineidam +# Copyright (C) 2000-2012 Bastian Kleineidam # # 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 @@ -21,8 +21,8 @@ # imports and checks import sys if not (hasattr(sys, 'version_info') or - sys.version_info < (2, 6, 0, 'final', 0)): - raise SystemExit("This program requires Python 2.6 or later.") + sys.version_info < (2, 7, 0, 'final', 0)): + raise SystemExit("This program requires Python 2.7 or later.") import os import re diff -Nru linkchecker-7.2/linkcheck/lc_cgi.py linkchecker-7.4/linkcheck/lc_cgi.py --- linkchecker-7.2/linkcheck/lc_cgi.py 2011-03-21 12:10:14.000000000 +0000 +++ linkchecker-7.4/linkcheck/lc_cgi.py 2011-12-20 19:15:00.000000000 +0000 @@ -81,7 +81,7 @@ # start checking aggregate = director.get_aggregate(config) get_url_from = checker.get_url_from - url = strformat.stripall(form["url"].value) + url = strformat.stripurl(form["url"].value) url_data = get_url_from(url, 0, aggregate) try: add_intern_pattern(url_data, config) diff -Nru linkchecker-7.2/linkcheck/logger/blacklist.py linkchecker-7.4/linkcheck/logger/blacklist.py --- linkchecker-7.2/linkcheck/logger/blacklist.py 2010-11-21 19:06:30.000000000 +0000 +++ linkchecker-7.4/linkcheck/logger/blacklist.py 2011-12-25 09:50:50.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2010 Bastian Kleineidam +# Copyright (C) 2000-2011 Bastian Kleineidam # # 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 diff -Nru linkchecker-7.2/linkcheck/logger/html.py linkchecker-7.4/linkcheck/logger/html.py --- linkchecker-7.2/linkcheck/logger/html.py 2011-04-09 08:43:29.000000000 +0000 +++ linkchecker-7.4/linkcheck/logger/html.py 2011-12-30 14:36:46.000000000 +0000 @@ -283,6 +283,11 @@ (self.stats.errors - self.stats.errors_printed)) self.writeln(u".") self.writeln(u"
") + num = self.stats.internal_errors + if num: + self.write(_n("There was %(num)d internal error.", + "There were %(num)d internal errors.", num) % {"num": num}) + self.writeln(u"
") self.stoptime = time.time() duration = self.stoptime - self.starttime self.writeln(_("Stopped checking at %(time)s (%(duration)s)") % diff -Nru linkchecker-7.2/linkcheck/logger/__init__.py linkchecker-7.4/linkcheck/logger/__init__.py --- linkchecker-7.2/linkcheck/logger/__init__.py 2011-04-28 13:29:40.000000000 +0000 +++ linkchecker-7.4/linkcheck/logger/__init__.py 2011-12-20 19:15:00.000000000 +0000 @@ -70,16 +70,18 @@ def reset (self): """Reset all log statistics to default values.""" - # number of logged urls + # number of logged URLs self.number = 0 - # number of encountered errors + # number of encountered URL errors self.errors = 0 - # number of errors that were printed + # number of URL errors that were printed self.errors_printed = 0 - # number of warnings + # number of URL warnings self.warnings = 0 - # number of warnings that were printed + # number of URL warnings that were printed self.warnings_printed = 0 + # number of internal errors + self.internal_errors = 0 self.domains = set() self.link_types = ContentTypes.copy() self.max_url_length = 0 @@ -120,6 +122,10 @@ # calculate running average self.avg_url_length += (l - self.avg_url_length) / self.avg_number + def log_internal_error (self): + """Increase internal error count.""" + self.internal_errors += 1 + class Logger (object): """ @@ -273,8 +279,7 @@ self.start_fileoutput() if self.fd is None: # Happens when aborting threads times out - log.warn(LOG_CHECK, - "writing to unitialized or closed file") + log.warn(LOG_CHECK, "writing to unitialized or closed file") else: self.fd.write(s, **args) @@ -389,7 +394,13 @@ except (IOError, AttributeError): pass -# note: don't confuse URL loggers with application logs above + def log_internal_error (self): + """Indicate that an internal error occurred in the program.""" + log.warn(LOG_CHECK, "internal error occurred") + self.stats.log_internal_error() + + +# the standard URL logger implementations from .text import TextLogger from .html import HtmlLogger from .gml import GMLLogger @@ -402,7 +413,7 @@ from .none import NoneLogger -# default link logger classes +# default URL logger classes Loggers = { "text": TextLogger, "html": HtmlLogger, diff -Nru linkchecker-7.2/linkcheck/logger/text.py linkchecker-7.4/linkcheck/logger/text.py --- linkchecker-7.2/linkcheck/logger/text.py 2011-05-30 20:04:00.000000000 +0000 +++ linkchecker-7.4/linkcheck/logger/text.py 2011-12-20 19:15:00.000000000 +0000 @@ -220,6 +220,10 @@ self.write(_(" (%d duplicates not printed)") % (self.stats.errors - self.stats.errors_printed)) self.writeln(u".") + num = self.stats.internal_errors + if num: + self.writeln(_n("There was %(num)d internal error.", + "There were %(num)d internal errors.", num) % {"num": num}) self.stoptime = time.time() duration = self.stoptime - self.starttime self.writeln(_("Stopped checking at %(time)s (%(duration)s)") % diff -Nru linkchecker-7.2/linkcheck/strformat.py linkchecker-7.4/linkcheck/strformat.py --- linkchecker-7.2/linkcheck/strformat.py 2010-12-23 18:48:24.000000000 +0000 +++ linkchecker-7.4/linkcheck/strformat.py 2011-12-25 09:50:50.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2010 Bastian Kleineidam +# Copyright (C) 2000-2011 Bastian Kleineidam # # 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 @@ -268,12 +268,12 @@ return "%+04d" % (-zone//3600) -_sub_ws = re.compile(r"\s+").sub -def stripall (s): - """Remove all whitespace from given string.""" +def stripurl(s): + """Remove any lines from string after the first line. + Also remove whitespace at start and end from given string.""" if not s: return s - return _sub_ws("", s) + return s.splitlines()[0].strip() def limit (s, length=72): diff -Nru linkchecker-7.2/linkcheck/threader.py linkchecker-7.4/linkcheck/threader.py --- linkchecker-7.2/linkcheck/threader.py 2011-02-18 10:47:05.000000000 +0000 +++ linkchecker-7.4/linkcheck/threader.py 2012-01-06 07:33:06.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2011 Bastian Kleineidam +# Copyright (C) 2000-2012 Bastian Kleineidam # # 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 @@ -35,7 +35,4 @@ def stopped (self, timeout=None): """Return True if stop event is set.""" - self._stop.wait(timeout) - # XXX on Python >= 2.7 the result from wait() can be returned - # directly. - return self._stop.is_set() + return self._stop.wait(timeout) diff -Nru linkchecker-7.2/linkcheck/updater.py linkchecker-7.4/linkcheck/updater.py --- linkchecker-7.2/linkcheck/updater.py 2011-04-10 09:01:19.000000000 +0000 +++ linkchecker-7.4/linkcheck/updater.py 2011-12-25 09:50:50.000000000 +0000 @@ -23,9 +23,9 @@ from .url import get_content from distutils.version import StrictVersion -# Use the Freshmeat submit file as source since that file gets updated +# Use the Freecode submit file as source since that file gets updated # only when releasing a new version. -UPDATE_URL = "http://linkchecker.git.sourceforge.net/git/gitweb.cgi?p=linkchecker/linkchecker;a=blob_plain;f=linkchecker.freshmeat;hb=HEAD" +UPDATE_URL = "http://linkchecker.git.sourceforge.net/git/gitweb.cgi?p=linkchecker/linkchecker;a=blob_plain;f=linkchecker.freecode;hb=HEAD" VERSION_TAG = 'Version:' if os.name == 'nt': URL_TAG = 'Windows-installer-URL:' diff -Nru linkchecker-7.2/linkcheck/url.py linkchecker-7.4/linkcheck/url.py --- linkchecker-7.2/linkcheck/url.py 2011-04-10 08:54:53.000000000 +0000 +++ linkchecker-7.4/linkcheck/url.py 2012-01-06 07:33:06.000000000 +0000 @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2011 Bastian Kleineidam +# Copyright (C) 2000-2012 Bastian Kleineidam # # 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 @@ -166,13 +166,6 @@ (_safe_scheme_pattern, host, _safe_path_pattern, _safe_fragment_pattern) -# XXX better name/implementation for this function -def stripsite (url): - """Remove scheme and host from URL. return host, newurl.""" - url = urlparse.urlsplit(url) - return url[1], urlparse.urlunsplit((0, 0, url[2], url[3], url[4])) - - def parse_qsl (qs, keep_blank_values=0, strict_parsing=0): """Parse a query given as a string argument. diff -Nru linkchecker-7.2/linkchecker linkchecker-7.4/linkchecker --- linkchecker-7.2/linkchecker 2011-10-19 20:31:22.000000000 +0000 +++ linkchecker-7.4/linkchecker 2012-01-06 19:32:40.000000000 +0000 @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2011 Bastian Kleineidam +# Copyright (C) 2000-2012 Bastian Kleineidam # # 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 @@ -38,6 +38,7 @@ import linkcheck.configuration import linkcheck.fileutil import linkcheck.logger +import linkcheck.ansicolor from linkcheck.director import console, check_urls, get_aggregate # optional modules has_optcomplete = linkcheck.fileutil.has_module("optcomplete") @@ -50,8 +51,7 @@ _password = None # usage texts -Usage = _("""USAGE\tlinkchecker [options] [file-or-url]... -""") +Usage = _("""USAGE\tlinkchecker [options] [file-or-url]...""") Notes = _("""NOTES o URLs on the command line starting with "ftp." are treated like @@ -246,10 +246,16 @@ return False -class LCHelpFormatter (optparse.IndentedHelpFormatter): +class LCHelpFormatter (optparse.IndentedHelpFormatter, object): """Help formatter indenting paragraph-wise.""" + def __init__ (self): + """Set current console width for this formatter.""" + width = linkcheck.ansicolor.get_columns(sys.stdout) + super(LCHelpFormatter, self).__init__(width=width) + def format_option (self, option): + """Customized help display with indentation.""" # The help for each option consists of two parts: # * the opt strings and metavars # eg. ("-x", or "-fFILENAME, --file=FILENAME") @@ -326,24 +332,13 @@ """Use FILENAME as configuration file. Per default LinkChecker first searches /etc/linkchecker/linkcheckerrc and then ~/.linkchecker/linkcheckerrc (under Windows \\linkcheckerrc).""")) -# XXX deprecated -group.add_option("-I", "--interactive", action="store_true", - dest="interactive", - help=_("""This option is deprecated and does nothing.""")) group.add_option("-t", "--threads", type="int", dest="threads", metavar="NUMBER", help=_( """Generate no more than the given number of threads. Default number of threads is 10. To disable threading specify a non-positive number.""")) -# XXX deprecated -group.add_option("--priority", action="store_true", dest="priority", - help=_("""This option is deprecated and does nothing.""")) group.add_option("-V", "--version", action="store_true", dest="version", help=_("""Print version and exit.""")) -# XXX deprecated -group.add_option("--allow-root", action="store_true", dest="allowroot", - default=False, - help=_("""This option is deprecated and does nothing.""")) group.add_option("--stdin", action="store_true", dest="stdin", help=_( """Read list of white-space separated URLs to check from stdin.""")) @@ -351,60 +346,31 @@ ################# output options ################## group = optparse.OptionGroup(optparser, _("Output options")) -group.add_option("-v", "--verbose", action="store_true", dest="verbose", - help=_( -"""Log all URLs. Default is to log only errors and warnings.""")) -group.add_option("--complete", action="store_true", dest="complete", - help=_("""Log all URLs, including duplicates. -Default is to log duplicate URLs only once.""")) -group.add_option("--no-warnings", action="store_false", dest="warnings", - help=_("""Don't log warnings. Default is to log warnings.""")) -group.add_option("-W", "--warning-regex", type="string", dest="warningregex", - metavar="REGEX", - help=_( -"""Define a regular expression which prints a warning if it matches -any content of the checked link. This applies only to valid pages, -so we can get their content. - -Use this to check for pages that contain some form of error -message, for example 'This page has moved' or 'Oracle -Application error'. - -Note that multiple values can be combined in the regular expression, -for example "(This page has moved|Oracle Application error)".""")) -group.add_option("--warning-size-bytes", dest="warningsizebytes", - metavar="NUMBER", - help=_( -"""Print a warning if content size info is available and exceeds the -given number of bytes.""")) -group.add_option("--check-html", action="store_true", dest="checkhtml", - help=_( -"""Check syntax of HTML URLs with local library (HTML tidy).""")) -group.add_option("--check-html-w3", action="store_true", dest="checkhtmlw3", - help=_( -"""Check syntax of HTML URLs with W3C online validator.""")) group.add_option("--check-css", action="store_true", dest="checkcss", help=_( """Check syntax of CSS URLs with local library (cssutils).""")) group.add_option("--check-css-w3", action="store_true", dest="checkcssw3", help=_( """Check syntax of CSS URLs with W3C online validator.""")) -group.add_option("--scan-virus", action="store_true", dest="scanvirus", - help=_( -"""Scan content of URLs with ClamAV virus scanner.""")) -group.add_option("-q", "--quiet", action="store_true", dest="quiet", +group.add_option("--check-html", action="store_true", dest="checkhtml", help=_( -"""Quiet operation, an alias for '-o none'. -This is only useful with -F.""")) -group.add_option("-o", "--output", type="string", dest="output", - metavar="TYPE[/ENCODING]", +"""Check syntax of HTML URLs with local library (HTML tidy).""")) +group.add_option("--check-html-w3", action="store_true", dest="checkhtmlw3", help=_( -"""Specify output as %(loggertypes)s. Default output type is text. -The ENCODING specifies the output encoding, the default is that of your -locale. -Valid encodings are listed at """ \ -"""http://docs.python.org/lib/standard-encodings.html.""") % \ -{'loggertypes': linkcheck.logger.LoggerKeys}) +"""Check syntax of HTML URLs with W3C online validator.""")) +group.add_option("--complete", action="store_true", dest="complete", + help=_("""Log all URLs, including duplicates. +Default is to log duplicate URLs only once.""")) +group.add_option("-D", "--debug", type="string", action="append", + metavar="STRING", + help=_("""Print debugging output for the given logger. +Available loggers are %(lognamelist)s. +Specifying 'all' is an alias for specifying all available loggers. +The option can be given multiple times to debug with more +than one logger. + +For accurate results, threading will be disabled during debug runs.""") % \ +{"lognamelist": linkcheck.lognamelist}) group.add_option("-F", "--file-output", type="string", action="append", dest="fileoutput", metavar="TYPE[/ENCODING][/FILENAME]", help=_( @@ -423,45 +389,63 @@ group.add_option("--no-status", action="store_false", dest="status", default=True, help=_( """Do not print check status messages.""")) -group.add_option("-D", "--debug", type="string", action="append", - metavar="STRING", - help=_("""Print debugging output for the given logger. -Available loggers are %(lognamelist)s. -Specifying 'all' is an alias for specifying all available loggers. -The option can be given multiple times to debug with more -than one logger. - -For accurate results, threading will be disabled during debug runs.""") % \ -{"lognamelist": linkcheck.lognamelist}) -group.add_option("--trace", action="store_true", dest="trace", - help=_("""Print tracing information.""")) +group.add_option("--no-warnings", action="store_false", dest="warnings", + help=_("""Don't log warnings. Default is to log warnings.""")) +group.add_option("-o", "--output", type="string", dest="output", + metavar="TYPE[/ENCODING]", + help=_( +"""Specify output as %(loggertypes)s. Default output type is text. +The ENCODING specifies the output encoding, the default is that of your +locale. +Valid encodings are listed at """ \ +"""http://docs.python.org/lib/standard-encodings.html.""") % \ +{'loggertypes': linkcheck.logger.LoggerKeys}) group.add_option("--profile", action="store_true", dest="profile", help=_( """Write profiling data into a file named %s in the current working directory. See also --viewprof.""") % _profile) +group.add_option("-q", "--quiet", action="store_true", dest="quiet", + help=_( +"""Quiet operation, an alias for '-o none'. +This is only useful with -F.""")) +group.add_option("--scan-virus", action="store_true", dest="scanvirus", + help=_( +"""Scan content of URLs with ClamAV virus scanner.""")) +group.add_option("--trace", action="store_true", dest="trace", + help=_("""Print tracing information.""")) +group.add_option("-v", "--verbose", action="store_true", dest="verbose", + help=_( +"""Log all URLs. Default is to log only errors and warnings.""")) group.add_option("--viewprof", action="store_true", dest="viewprof", help=_( """Print out previously generated profiling data. See also --profile.""")) +group.add_option("-W", "--warning-regex", type="string", dest="warningregex", + metavar="REGEX", + help=_( +"""Define a regular expression which prints a warning if it matches +any content of the checked link. This applies only to valid pages, +so we can get their content. + +Use this to check for pages that contain some form of error +message, for example 'This page has moved' or 'Oracle +Application error'. + +Note that multiple values can be combined in the regular expression, +for example "(This page has moved|Oracle Application error)".""")) +group.add_option("--warning-size-bytes", dest="warningsizebytes", + metavar="NUMBER", + help=_( +"""Print a warning if content size info is available and exceeds the +given number of bytes.""")) optparser.add_option_group(group) ################# checking options ################## group = optparse.OptionGroup(optparser, _("Checking options")) -group.add_option("-r", "--recursion-level", type="int", dest="recursionlevel", - metavar="NUMBER", +group.add_option("-a", "--anchors", action="store_true", dest="anchors", help=_( -"""Check recursively all links up to given depth. A negative depth -will enable infinite recursion. Default depth is infinite.""")) -group.add_option("--no-follow-url", type="string", action="append", - metavar="REGEX", - dest="extern", help=_( -"""Check but do not recurse into URLs matching the given regular -expression. This option can be given multiple times.""")) -group.add_option("--ignore-url", type="string", action="append", - metavar="REGEX", - dest="externstrict", help=_( -"""Only check syntax of URLs matching the given regular expression. - This option can be given multiple times.""")) +"""Check HTTP anchor references. Default is not to check anchors. +This option enables logging of the warning 'url-anchor-not-found'.""")) group.add_option("-C", "--cookies", action="store_true", dest="cookies", help=_( """Accept and send HTTP cookies according to RFC 2109. Only cookies @@ -473,38 +457,49 @@ help=_( """Read a file with initial cookie data. The cookie data format is explained below.""")) -group.add_option("-a", "--anchors", action="store_true", dest="anchors", - help=_( -"""Check HTTP anchor references. Default is not to check anchors. -This option enables logging of the warning 'url-anchor-not-found'.""")) -group.add_option("-u", "--user", type="string", dest="username", +group.add_option("--ignore-url", type="string", action="append", + metavar="REGEX", + dest="externstrict", help=_( +"""Only check syntax of URLs matching the given regular expression. + This option can be given multiple times.""")) +group.add_option("--no-follow-url", type="string", action="append", + metavar="REGEX", + dest="extern", help=_( +"""Check but do not recurse into URLs matching the given regular +expression. This option can be given multiple times.""")) +group.add_option("-N", "--nntp-server", type="string", dest="nntpserver", metavar="STRING", help=_( -"""Try the given username for HTTP and FTP authorization. -For FTP the default username is 'anonymous'. For HTTP there is -no default username. See also -p.""")) +"""Specify an NNTP server for 'news:...' links. Default is the +environment variable NNTP_SERVER. If no host is given, +only the syntax of the link is checked.""")) group.add_option("-p", "--password", action="store_false", dest="password", default=False, help=_( """Read a password from console and use it for HTTP and FTP authorization. For FTP the default password is 'anonymous@'. For HTTP there is no default password. See also -u.""")) -group.add_option("--timeout", type="int", dest="timeout", - metavar="NUMBER", - help=_( -"""Set the timeout for connection attempts in seconds. The default -timeout is %d seconds.""") % config["timeout"]) group.add_option("-P", "--pause", type="int", dest="pause", metavar="NUMBER", help=_( """Pause the given number of seconds between two subsequent connection requests to the same host. Default is no pause between requests.""")) -group.add_option("-N", "--nntp-server", type="string", dest="nntpserver", +group.add_option("-r", "--recursion-level", type="int", dest="recursionlevel", + metavar="NUMBER", + help=_( +"""Check recursively all links up to given depth. A negative depth +will enable infinite recursion. Default depth is infinite.""")) +group.add_option("--timeout", type="int", dest="timeout", + metavar="NUMBER", + help=_( +"""Set the timeout for connection attempts in seconds. The default +timeout is %d seconds.""") % config["timeout"]) +group.add_option("-u", "--user", type="string", dest="username", metavar="STRING", help=_( -"""Specify an NNTP server for 'news:...' links. Default is the -environment variable NNTP_SERVER. If no host is given, -only the syntax of the link is checked.""")) +"""Try the given username for HTTP and FTP authorization. +For FTP the default username is 'anonymous'. For HTTP there is +no default username. See also -p.""")) group.add_option("--user-agent", type="string", dest="useragent", metavar="STRING", help=_( @@ -772,7 +767,7 @@ args.extend(read_stdin_urls()) if args: for url in args: - aggregate_url(aggregate, config, strformat.stripall(url)) + aggregate_url(aggregate, config, strformat.stripurl(url)) else: log.warn(LOG_CMDLINE, _("no files or URLs given")) # set up profiling @@ -800,8 +795,10 @@ else: check_urls(aggregate) -# if printed errors or warnings are encountered, exit with non-zero status stats = config['logger'].stats -if stats.errors_printed or \ - (stats.warnings_printed and config['warnings']): +# on internal errors, exit with status 2 +if stats.internal_errors: + sys.exit(2) +# on errors or printed warnings, exit with status 1 +if stats.errors or (stats.warnings_printed and config['warnings']): sys.exit(1) diff -Nru linkchecker-7.2/linkchecker.freecode linkchecker-7.4/linkchecker.freecode --- linkchecker-7.2/linkchecker.freecode 1970-01-01 00:00:00.000000000 +0000 +++ linkchecker-7.4/linkchecker.freecode 2012-01-06 19:35:25.000000000 +0000 @@ -0,0 +1,13 @@ +Project: LinkChecker +Version: 7.4 +Release-Focus: Minor feature enhancements +Hide: N +Website-URL: http://linkchecker.sourceforge.net/ +Changelog-URL: http://linkchecker.git.sourceforge.net/git/gitweb.cgi?p=linkchecker/linkchecker;a=blob;f=doc/changelog.txt;hb=HEAD +Source-Package-URL: http://downloads.sourceforge.net/linkchecker/LinkChecker-${version}.tar.bz2 +Debian-Package-URL: http://packages.debian.org/linkchecker +GIT-Tree-URL: http://linkchecker.git.sourceforge.net/ +Windows-installer-URL: http://downloads.sourceforge.net/linkchecker/LinkChecker-${version}.exe + +HTML5 link elements and attributes are checked now. +Saving of result files in the GUI has been fixed. diff -Nru linkchecker-7.2/linkchecker.freshmeat linkchecker-7.4/linkchecker.freshmeat --- linkchecker-7.2/linkchecker.freshmeat 2011-10-20 06:12:39.000000000 +0000 +++ linkchecker-7.4/linkchecker.freshmeat 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -Project: LinkChecker -Version: 7.2 -Release-Focus: Minor bugfixes -Hide: N -Website-URL: http://linkchecker.sourceforge.net/ -Changelog-URL: http://linkchecker.git.sourceforge.net/git/gitweb.cgi?p=linkchecker/linkchecker;a=blob;f=doc/changelog.txt;hb=HEAD -Source-Package-URL: http://downloads.sourceforge.net/linkchecker/LinkChecker-${version}.tar.bz2 -Debian-Package-URL: http://packages.debian.org/linkchecker -GIT-Tree-URL: http://linkchecker.git.sourceforge.net/ -Windows-installer-URL: http://downloads.sourceforge.net/linkchecker/LinkChecker-${version}.exe -OSX-installer-URL: http://downloads.sourceforge.net/linkchecker/LinkChecker-${version}.dmg - -Bugs were fixed for HTML and FTP character encoding detection, -SQL output and HTML validation with the W3C validator. -The GUI now allows configuration of a warning regular expression for -page contents. diff -Nru linkchecker-7.2/linkchecker-gui linkchecker-7.4/linkchecker-gui --- linkchecker-7.2/linkchecker-gui 2011-05-30 20:09:36.000000000 +0000 +++ linkchecker-7.4/linkchecker-gui 2012-01-06 07:33:06.000000000 +0000 @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: iso-8859-1 -*- -# Copyright (C) 2008-2011 Bastian Kleineidam +# Copyright (C) 2008-2012 Bastian Kleineidam # # 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 @@ -40,13 +40,9 @@ window.error_signal.emit(out.getvalue()) -def sigint_handler(*args): - """Handler for the SIGINT signal.""" - sys.stderr.write('\r') - QApplication.quit() - - def main (argv=None): + """Initialize the Qt application, handle commandline arguments + and show the main window.""" if argv is None: argv = sys.argv app = QApplication(argv) @@ -60,7 +56,7 @@ url = args[1] else: url = u"" - signal.signal(signal.SIGINT, sigint_handler) + signal.signal(signal.SIGINT, signal.SIG_DFL) # use local variable here to avoid garbage collection of the main # window before app.exec_() finishes window = LinkCheckerMain(url=url) diff -Nru linkchecker-7.2/Makefile linkchecker-7.4/Makefile --- linkchecker-7.2/Makefile 2011-10-19 11:44:21.000000000 +0000 +++ linkchecker-7.4/Makefile 2012-01-07 07:32:36.000000000 +0000 @@ -21,12 +21,15 @@ --exclude="gzip2.py,httplib2.py,robotparser2.py" PY2APPOPTS ?= ifeq ($(shell uname),Darwin) + NOSETESTS:=/usr/local/share/python/nosetests NUMPROCESSORS:=$(shell sysctl -a | grep machdep.cpu.core_count | cut -d " " -f 2) + CHMODMINUSMINUS:= else + NOSETESTS:=$(shell which nosetests) NUMPROCESSORS:=$(shell grep -c processor /proc/cpuinfo) + CHMODMINUSMINUS:=-- endif - .PHONY: all all: @echo "Read the file doc/install.txt to see how to build and install this package." @@ -93,11 +96,11 @@ $(MAKE) -C ~/public_html/linkchecker.sf.net update upload @echo "Register at Python Package Index..." $(PYTHON) setup.py register - freshmeat-submit < linkchecker.freshmeat + freecode-submit < linkchecker.freecode .PHONY: chmod chmod: - -chmod -R a+rX,u+w,go-w -- * + -chmod -R a+rX,u+w,go-w $(CHMODMINUSMINUS) * find . -type d -exec chmod 755 {} \; .PHONY: dist @@ -175,6 +178,8 @@ linkcheck/updater.py \ linkcheck/url.py \ linkcheck/winutil.py \ + linkchecker \ + linkchecker-gui \ *.py filescheck: @@ -190,8 +195,8 @@ @if egrep -i "xx\.|xxxx|\.xx" doc/changelog.txt > /dev/null; then \ echo "Could not release: edit doc/changelog.txt release date"; false; \ fi - @if ! grep "Version: $(VERSION)" linkchecker.freshmeat > /dev/null; then \ - echo "Could not release: edit linkchecker.freshmeat version"; false; \ + @if ! grep "Version: $(VERSION)" linkchecker.freecode > /dev/null; then \ + echo "Could not release: edit linkchecker.freecode version"; false; \ fi # $(MAKE) -C doc test @@ -203,12 +208,12 @@ .PHONY: test test: localbuild - $(PYTHON) $(shell which nosetests) --processes=$(NUMPROCESSORS) \ + $(PYTHON) $(NOSETESTS) --processes=$(NUMPROCESSORS) \ -v -m "^test_.*" $(TESTOPTS) $(TESTS) .PHONY: pyflakes pyflakes: - pyflakes --force $(PY_FILES_DIRS) 2>&1 | \ + pyflakes $(PY_FILES_DIRS) 2>&1 | \ grep -v "redefinition of unused 'linkcheck'" | \ grep -v "undefined name '_'" | \ grep -v "undefined name '_n'" | cat @@ -247,4 +252,4 @@ # run eclipse ide .PHONY: ide ide: - eclipse-3.6 -data $(CURDIR)/.. + eclipse -data $(CURDIR)/.. diff -Nru linkchecker-7.2/MANIFEST linkchecker-7.4/MANIFEST --- linkchecker-7.2/MANIFEST 2011-10-20 08:15:13.000000000 +0000 +++ linkchecker-7.4/MANIFEST 2012-01-07 10:56:30.000000000 +0000 @@ -2,11 +2,11 @@ COPYING MANIFEST.in Makefile +README.txt install-rpm.sh linkchecker linkchecker-gui -linkchecker.freshmeat -readme.txt +linkchecker.freecode setup.cfg setup.py cgi-bin/README @@ -23,7 +23,6 @@ config/linkchecker-completion config/linkchecker.apache2.conf config/linkcheckerrc -config/logging.conf debian/NEWS debian/README.Debian debian/changelog @@ -51,7 +50,6 @@ doc/linkchecker.doc.pot doc/po4a.conf doc/robots.txt.example -doc/todo.txt doc/upgrading.txt doc/de/linkchecker-gui.1 doc/de/linkchecker.1 @@ -121,6 +119,7 @@ linkcheck/bookmarks/chromium.py linkcheck/bookmarks/firefox.py linkcheck/bookmarks/opera.py +linkcheck/bookmarks/safari.py linkcheck/cache/__init__.py linkcheck/cache/addrinfo.py linkcheck/cache/connection.py @@ -166,7 +165,6 @@ linkcheck/gui/linkchecker_ui_editor.py linkcheck/gui/linkchecker_ui_main.py linkcheck/gui/linkchecker_ui_options.py -linkcheck/gui/linkchecker_ui_progress.py linkcheck/gui/logger.py linkcheck/gui/options.py linkcheck/gui/properties.py @@ -248,12 +246,14 @@ tests/test_url.py tests/test_urlbuild.py tests/cache/__init__.py +tests/cache/test_addrinfo.py tests/cache/test_cookiejar.py tests/checker/__init__.py tests/checker/ftpserver.py tests/checker/httpserver.py tests/checker/test_anchor.py tests/checker/test_base.py +tests/checker/test_bookmarks.py tests/checker/test_error.py tests/checker/test_file.py tests/checker/test_frames.py @@ -272,6 +272,8 @@ tests/checker/data/Bookmarks.result tests/checker/data/anchor.html tests/checker/data/anchor.html.result +tests/checker/data/archive.html +tests/checker/data/archive.html.result tests/checker/data/base1.html tests/checker/data/base1.html.result tests/checker/data/base2.html @@ -295,6 +297,8 @@ tests/checker/data/file.txt.result tests/checker/data/frames.html tests/checker/data/frames.html.result +tests/checker/data/html5.html +tests/checker/data/html5.html.result tests/checker/data/http.html tests/checker/data/http.html.result tests/checker/data/http.xhtml @@ -318,6 +322,8 @@ tests/checker/data/a b/el.html tests/checker/data/a b/t.txt tests/checker/data/base/test.txt +tests/checker/data/plist_binary/Bookmarks.plist.result +tests/checker/data/plist_xml/Bookmarks.plist.result tests/configuration/__init__.py tests/configuration/test_config.py tests/logger/__init__.py diff -Nru linkchecker-7.2/MANIFEST.in linkchecker-7.4/MANIFEST.in --- linkchecker-7.2/MANIFEST.in 2011-10-19 11:44:40.000000000 +0000 +++ linkchecker-7.4/MANIFEST.in 2012-01-04 19:48:37.000000000 +0000 @@ -1,9 +1,9 @@ -include readme.txt doc/install.txt COPYING doc/todo.txt doc/upgrading.txt +include README.txt doc/install.txt COPYING doc/upgrading.txt include MANIFEST.in doc/changelog.txt include config/linkchecker-completion config/create.sql -include config/linkcheckerrc config/logging.conf +include config/linkcheckerrc include config/linkchecker.apache2.conf install-rpm.sh -include linkchecker.freshmeat +include linkchecker.freecode include cgi-bin/lc.cgi cgi-bin/README include Makefile include debian/rules @@ -52,5 +52,5 @@ include doc/Makefile include doc/examples/*.sh doc/examples/*.bat doc/examples/*.py include doc/examples/linkcheckerrc_loginurl -recursive-include third_party * +recursive-include third_party *.py *.txt Makefile example* recursive-include tests *.py *.result *.html *.ico *.txt *.zip *.asc *.css *.xhtml *.sqlite *.adr *.swf diff -Nru linkchecker-7.2/PKG-INFO linkchecker-7.4/PKG-INFO --- linkchecker-7.2/PKG-INFO 2011-10-20 08:15:13.000000000 +0000 +++ linkchecker-7.4/PKG-INFO 2012-01-07 10:56:30.000000000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: LinkChecker -Version: 7.2 +Version: 7.4 Summary: check websites and HTML documents for broken links Home-page: http://linkchecker.sourceforge.net/ Author: Bastian Kleineidam diff -Nru linkchecker-7.2/po/de.po linkchecker-7.4/po/de.po --- linkchecker-7.2/po/de.po 2011-10-19 20:39:47.000000000 +0000 +++ linkchecker-7.4/po/de.po 2012-01-04 17:58:12.000000000 +0000 @@ -5,8 +5,8 @@ msgstr "" "Project-Id-Version: $Id$\n" "Report-Msgid-Bugs-To: calvin@users.sourceforge.net\n" -"POT-Creation-Date: 2011-10-19 22:32+0200\n" -"PO-Revision-Date: 2011-10-19 22:39+0100\n" +"POT-Creation-Date: 2012-01-04 18:58+0100\n" +"PO-Revision-Date: 2012-01-04 18:58+0100\n" "Last-Translator: Bastian Kleineidam \n" "Language-Team: de \n" "Language: \n" @@ -15,1122 +15,844 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../linkcheck/gui/editor.py:104 -msgid "Save file?" -msgstr "Datei speichern?" +#: ../linkcheck/director/aggregator.py:70 +msgid "These URLs are still active:" +msgstr "Folgende URLs sind noch aktiv:" -#: ../linkcheck/gui/editor.py:105 -msgid "The document has been modified." -msgstr "Das Dokument wurde verändert." +#: ../linkcheck/director/console.py:47 +#, python-format +msgid "%2d URL active" +msgid_plural "%2d URLs active" +msgstr[0] "%2d URL aktiv" +msgstr[1] "%2d URLs aktiv" -#: ../linkcheck/gui/editor.py:106 -msgid "Do you want to save your changes?" -msgstr "Wollen Sie Ihre Änderungen speichern?" +#: ../linkcheck/director/console.py:50 +#, python-format +msgid "%5d URL queued" +msgid_plural "%5d URLs queued" +msgstr[0] "%5d URL überprüft" +msgstr[1] "%5d URLs überprüft" -#: ../linkcheck/gui/editor.py:115 -msgid "Save File As" -msgstr "Speichern unter" +#: ../linkcheck/director/console.py:52 +#, python-format +msgid "%4d URL checked" +msgid_plural "%4d URLs checked" +msgstr[0] "%4d Verknüpfung überprüft" +msgstr[1] "%4d Verknüpfungen überprüft" -#: ../linkcheck/gui/editor.py:158 -msgid "readonly" -msgstr "nur lesen" +#: ../linkcheck/director/console.py:54 +#, python-format +msgid "runtime %s" +msgstr "Laufzeit %s" -#: ../linkcheck/gui/updater.py:40 +#: ../linkcheck/director/console.py:74 #, python-format -msgid "%(app)s update information" -msgstr "%(app)s Update-Informationen" +msgid "" +"********** Oops, I did it again. *************\n" +"\n" +"You have found an internal error in LinkChecker. Please write a bug report\n" +"at %s\n" +"and include the following information:\n" +"- the URL or file you are testing\n" +"- the system information below\n" +"\n" +"When using the commandline client:\n" +"- your commandline arguments and any custom configuration files.\n" +"- the output of a debug run with option \"-Dall\"\n" +"\n" +"Not disclosing some of the information above due to privacy reasons is ok.\n" +"I will try to help you nonetheless, but you have to give me something\n" +"I can work with ;) .\n" +msgstr "" +"********** Hoppla. *************\n" +"\n" +"Sie haben einen internen Fehler in LinkChecker entdeckt. Bitte schreiben Sie\n" +"einen Fehlerbericht an %s\n" +"mit den folgenden Informationen:\n" +"- die URL oder Datei, welche Sie gerade prüfen\n" +"- die untenstehenden Systeminformationen.\n" +"\n" +"Bei Benutzung des Kommandozeilenprogramms:\n" +"- ihre Kommandozeilenargumente und/oder Ihre Konfiguration.\n" +"- die Ausgabe eines Debuglaufs mit Option \"-Dall\"\n" +"\n" +"Wenn Sie Informationen aus privaten Gründen unterlassen, ist das in Ordnung.\n" +"Ich werde trotzdem versuchen, Ihnen zu helfen. Sie müssen mir allerdings\n" +"irgendwas geben, womit ich arbeiten kann ;).\n" -#: ../linkcheck/gui/updater.py:50 -msgid "Checking for updates..." -msgstr "Suche nach Updates..." +#: ../linkcheck/director/console.py:102 +msgid "******** LinkChecker internal error, over and out ********" +msgstr "******** LinkChecker interner Fehler, und tschüß ********" -#: ../linkcheck/gui/updater.py:58 -#, python-format -msgid "Congratulations: the latest version %(app)s is installed." -msgstr "Gratulation: die aktuellste Version %(app)s ist installiert." +#: ../linkcheck/director/console.py:122 +msgid "Default locale:" +msgstr "Standard Locale:" -#: ../linkcheck/gui/updater.py:65 -#, python-format -msgid "Detected local or development version %(currentversion)s. Available version of %(app)s is %(version)s." -msgstr "Lokale oder Entwicklerversion %(currentversion)s entdeckt. Verfügbare Version von %(app)s ist %(version)s." +#: ../linkcheck/director/console.py:127 +msgid "System info:" +msgstr "Systeminformation:" -#: ../linkcheck/gui/updater.py:69 +#: ../linkcheck/director/console.py:129 +#: ../linkchecker:566 #, python-format -msgid "A new version %(version)s of %(app)s is available for
download." -msgstr "Eine neue Version %(version)s von %(app)s ist verfügbar als Download." +msgid "Python %(version)s on %(platform)s" +msgstr "Python %(version)s auf %(platform)s" -#: ../linkcheck/gui/updater.py:77 -msgid "update thread has been terminated" -msgstr "der Update-Thread wurde beendet" +#: ../linkcheck/director/console.py:134 +msgid "Local time:" +msgstr "Uhrzeit:" -#: ../linkcheck/gui/updater.py:79 +#: ../linkcheck/director/__init__.py:39 +msgid "Could not import twill for login URL visit" +msgstr "Konnte twill nicht importieren, um die Login URL zu besuchen." + +#: ../linkcheck/director/__init__.py:45 #, python-format -msgid "An error occured while checking for an update of %(app)s: %(error)s." -msgstr "Ein Fehler ist während der Update-Prüfung von %(app)s aufgetreten: %(error)s." +msgid "Error visiting login URL %(url)s." +msgstr "Fehler beim Besuchen der Login URL %(url)s." -#: ../linkcheck/gui/linkchecker_ui_progress.py:82 -msgid "LinkChecker progress" -msgstr "LinkChecker Fortschritt" - -#: ../linkcheck/gui/linkchecker_ui_progress.py:83 -msgid "Status" -msgstr "Status" +#: ../linkcheck/director/__init__.py:50 +#, python-format +msgid "Error posting form at login URL %(url)s." +msgstr "Fehler beim Abschicken des Formulars bei Login URL %(url)s." -#: ../linkcheck/gui/linkchecker_ui_progress.py:84 -#: ../linkcheck/gui/linkchecker_ui_main.py:762 -msgid "Active:" -msgstr "Aktiv:" +#: ../linkcheck/director/__init__.py:127 +#, python-format +msgid "Error using login URL: %(msg)s." +msgstr "Fehler bei Login URL: %(msg)s." -#: ../linkcheck/gui/linkchecker_ui_progress.py:85 -#: ../linkcheck/gui/linkchecker_ui_progress.py:87 -#: ../linkcheck/gui/linkchecker_ui_progress.py:89 -#: ../linkcheck/gui/linkchecker_ui_main.py:763 -#: ../linkcheck/gui/linkchecker_ui_main.py:765 -#: ../linkcheck/gui/linkchecker_ui_main.py:767 -msgid "0" -msgstr "0" +#: ../linkcheck/director/__init__.py:143 +msgid "Could not start a new thread. Check that the current user is allowed to start new threads." +msgstr "Konnte keinen neuen Thread starten. Überprüfen sie, ob der aktuelle Benutzer neue Threads starten darf." -#: ../linkcheck/gui/linkchecker_ui_progress.py:86 -#: ../linkcheck/gui/linkchecker_ui_main.py:764 -msgid "Queued:" -msgstr "Wartend:" +#: ../linkcheck/director/__init__.py:176 +msgid "user interrupt; waiting for active threads to finish" +msgstr "Benutzerabbruch; warte auf Beendigung von aktiven Verbindungen" -#: ../linkcheck/gui/linkchecker_ui_progress.py:88 -#: ../linkcheck/gui/linkchecker_ui_main.py:766 -msgid "Checked:" -msgstr "Geprüft:" +#: ../linkcheck/director/__init__.py:178 +msgid "another interrupt will exit immediately" +msgstr "ein weiter Abbruch beendet dieses Programm sofort" -#: ../linkcheck/gui/linkchecker_ui_progress.py:90 -msgid "Cancel" -msgstr "Abbrechen" - -#: ../linkcheck/gui/options.py:51 -msgid "Invalid regular expression" -msgstr "Ungültiger regulärer Ausdruck" +#: ../linkcheck/director/__init__.py:194 +msgid "user abort; force shutdown" +msgstr "Benutzerabbruch; erzwinge Programmende" -#: ../linkcheck/gui/options.py:116 -#: ../linkcheck/gui/linkchecker_ui_options.py:184 -msgid "Edit" -msgstr "Bearbeiten" +#: ../linkcheck/updater.py:63 +msgid "could not download update information" +msgstr "konnte Update-Informationen nicht herunterladen" -#: ../linkcheck/gui/options.py:118 -msgid "Read" -msgstr "Lesen" +#: ../linkcheck/cache/addrinfo.py:51 +#, python-format +msgid "could not parse host %(host)r: %(msg)s" +msgstr "konnte Rechnernamen %(host)r nicht parsen: %(msg)s" -#: ../linkcheck/gui/options.py:121 -msgid "File not found" -msgstr "Datei nicht gefunden" +#: ../linkcheck/configuration/confparse.py:57 +#, python-format +msgid "Error parsing configuration: %s" +msgstr "Fehler beim Parsen der Konfiguration: %s" -#: ../linkcheck/gui/linkchecker_ui_main.py:758 -msgid "LinkChecker" -msgstr "LinkChecker" +#: ../linkcheck/configuration/confparse.py:116 +#, python-format +msgid "invalid negative value for timeout: %d\n" +msgstr "ungültiger negativer Wert für timeout: %d\n" -#: ../linkcheck/gui/linkchecker_ui_main.py:759 -msgid "URL:" -msgstr "URL:" +#: ../linkcheck/configuration/confparse.py:168 +#, python-format +msgid "missing auth part in entry %(val)r" +msgstr "fehlende Authentifizierung in entry %(val)r" -#: ../linkcheck/gui/linkchecker_ui_main.py:760 -msgid "Start checking the given URL." -msgstr "Beginne, die gegebene URL zu Prüfen" +#: ../linkcheck/configuration/confparse.py:174 +#, python-format +msgid "invalid login URL `%s'. Only HTTP and HTTPS URLs are supported." +msgstr "ungültige Login URL `%s'. Nur HTTP und HTTPS URLs sind unterstützt." -#: ../linkcheck/gui/linkchecker_ui_main.py:768 -msgid "Info:" -msgstr "Info:" +#: ../linkcheck/configuration/__init__.py:290 +msgid "warning: missing user or URL pattern in authentication data." +msgstr "Warnung: Fehlende Benutzer oder regulärer URL Ausdruck in Authentifizierungsdaten." -#: ../linkcheck/gui/linkchecker_ui_main.py:769 -msgid "-" -msgstr "-" +#: ../linkcheck/configuration/__init__.py:340 +msgid "warning: activating text logger output." +msgstr "Warnung: aktiviere text Loggerausgabe." -#: ../linkcheck/gui/linkchecker_ui_main.py:770 -msgid "URL properties" -msgstr "URL Eigenschaften" +#: ../linkcheck/configuration/__init__.py:348 +#: ../linkcheck/checker/urlbase.py:790 +msgid "warning: tidy module is not available; download from http://utidylib.berlios.de/" +msgstr "Warnung: tidy Modul ist nicht verfügbar; Download von http://utidylib.berlios.de/" -#: ../linkcheck/gui/linkchecker_ui_main.py:771 -#: ../linkcheck/gui/urlmodel.py:22 -#: ../linkcheck/logger/__init__.py:43 -msgid "URL" -msgstr "URL" +#: ../linkcheck/configuration/__init__.py:356 +#: ../linkcheck/checker/urlbase.py:819 +msgid "warning: cssutils module is not available; download from http://cthedot.de/cssutils/" +msgstr "Warnung: cssutils Modul ist nicht verfügbar; Download von http://cthedot.de/cssutils/" -#: ../linkcheck/gui/linkchecker_ui_main.py:772 -#: ../linkcheck/gui/urlmodel.py:22 -#: ../linkcheck/logger/__init__.py:35 -msgid "Name" -msgstr "Name" +#: ../linkcheck/configuration/__init__.py:366 +msgid "warning: Clamav could not be initialized" +msgstr "Warnung: Clamav konnte nicht initialisiert werden" -#: ../linkcheck/gui/linkchecker_ui_main.py:773 -#: ../linkcheck/logger/__init__.py:36 -msgid "Parent URL" -msgstr "Vater URL" +#: ../linkcheck/configuration/__init__.py:372 +msgid "warning: activating sendcookies because storecookies is active." +msgstr "Warnung: aktiviere Option sendcookies weil Option storecookes aktiviert ist." -#: ../linkcheck/gui/linkchecker_ui_main.py:774 -#: ../linkcheck/logger/__init__.py:34 -msgid "Base" -msgstr "Basis" +#: ../linkcheck/configuration/__init__.py:382 +msgid "warning: no CGI password fieldname given for login URL." +msgstr "Warnung: kein CGI Passwort Feldname für Login URL angegeben." -#: ../linkcheck/gui/linkchecker_ui_main.py:775 -#: ../linkcheck/logger/__init__.py:42 -msgid "Check time" -msgstr "Prüfzeit" +#: ../linkcheck/configuration/__init__.py:386 +msgid "warning: no CGI user fieldname given for login URL." +msgstr "Warnung: kein CGI Benutzer Feldname für Login URL angegeben." -#: ../linkcheck/gui/linkchecker_ui_main.py:776 -#: ../linkcheck/logger/__init__.py:40 -msgid "D/L time" -msgstr "D/L Zeit" +#: ../linkcheck/configuration/__init__.py:390 +msgid "warning: no user/password authentication data found for login URL." +msgstr "Warnung: keine Benutzer/Passwort-Authentifizierung für Login URL gefunden." -#: ../linkcheck/gui/linkchecker_ui_main.py:777 -#: ../linkcheck/logger/__init__.py:41 -msgid "Size" -msgstr "Größe" +#: ../linkcheck/configuration/__init__.py:393 +msgid "warning: login URL is not a HTTP URL." +msgstr "Warnung: Login URL ist keine HTTP URL." -#: ../linkcheck/gui/linkchecker_ui_main.py:778 -#: ../linkcheck/logger/__init__.py:38 -msgid "Info" -msgstr "Info" +#: ../linkcheck/configuration/__init__.py:397 +msgid "warning: login URL is incomplete." +msgstr "Warnung: Login URL ist unvollständig." -#: ../linkcheck/gui/linkchecker_ui_main.py:779 -#: ../linkcheck/logger/__init__.py:39 -msgid "Warning" -msgstr "Warnung" +#: ../linkcheck/configuration/__init__.py:401 +#, python-format +msgid "warning: disabling login URL %(url)s." +msgstr "Warnung: deaktiviere Login URL %(url)s." -#: ../linkcheck/gui/linkchecker_ui_main.py:780 -#: ../linkcheck/gui/urlmodel.py:22 -#: ../linkcheck/logger/__init__.py:33 -msgid "Result" -msgstr "Ergebnis" - -#: ../linkcheck/gui/linkchecker_ui_main.py:781 -msgid "Check results" -msgstr "Prüfergebnisse" +#: ../linkcheck/logger/html.py:95 +#: ../linkcheck/logger/text.py:85 +#, python-format +msgid "Start checking at %s" +msgstr "Beginne Prüfen am %s" -#: ../linkcheck/gui/linkchecker_ui_main.py:782 -msgid "Valid URLs" -msgstr "Gültige URLs" +#: ../linkcheck/logger/html.py:140 +msgid "checked link" +msgstr "geprüfte Verknüpfung" -#: ../linkcheck/gui/linkchecker_ui_main.py:783 -msgid "Warnings" -msgstr "Warnungen" +#: ../linkcheck/logger/html.py:160 +#: ../linkcheck/logger/text.py:126 +msgid " (cached)" +msgstr " (aus dem Cache)" -#: ../linkcheck/gui/linkchecker_ui_main.py:784 -msgid "Invalid URLs" -msgstr "Ungültige URLs" +#: ../linkcheck/logger/html.py:174 +#: ../linkcheck/logger/text.py:138 +#: ../linkcheck/gui/urlmodel.py:78 +#, python-format +msgid ", line %d" +msgstr ", Zeile %d" -#: ../linkcheck/gui/linkchecker_ui_main.py:785 -msgid "Content type statistics" -msgstr "Inhaltstatistik" +#: ../linkcheck/logger/html.py:175 +#: ../linkcheck/logger/text.py:139 +#: ../linkcheck/gui/urlmodel.py:79 +#, python-format +msgid ", col %d" +msgstr ", Spalte %d" -#: ../linkcheck/gui/linkchecker_ui_main.py:786 -msgid "Image" -msgstr "Bild" +#: ../linkcheck/logger/html.py:199 +#: ../linkcheck/logger/html.py:211 +#: ../linkcheck/logger/text.py:155 +#: ../linkcheck/logger/text.py:167 +#: ../linkcheck/gui/properties.py:36 +#: ../linkcheck/gui/properties.py:38 +#, python-format +msgid "%.3f seconds" +msgstr "%.3f Sekunden" -#: ../linkcheck/gui/linkchecker_ui_main.py:787 -msgid "Text" -msgstr "Text" +#: ../linkcheck/logger/html.py:235 +#: ../linkcheck/logger/text.py:186 +msgid "Valid" +msgstr "Gültig" -#: ../linkcheck/gui/linkchecker_ui_main.py:788 -msgid "Application" -msgstr "Anwendung" +#: ../linkcheck/logger/html.py:240 +#: ../linkcheck/logger/text.py:189 +msgid "Error" +msgstr "Fehler" -#: ../linkcheck/gui/linkchecker_ui_main.py:789 -msgid "Audio" -msgstr "Audio" +#: ../linkcheck/logger/html.py:247 +msgid "Statistics" +msgstr "Statistik" -#: ../linkcheck/gui/linkchecker_ui_main.py:790 -msgid "Video" -msgstr "Video" +#: ../linkcheck/logger/html.py:249 +#: ../linkcheck/logger/text.py:238 +#, python-format +msgid "Number of domains: %d" +msgstr "Anzahl von Domains: %d" -#: ../linkcheck/gui/linkchecker_ui_main.py:791 -msgid "Other" -msgstr "Andere" +#: ../linkcheck/logger/html.py:253 +#: ../linkcheck/logger/text.py:241 +#, python-format +msgid "Content types: %(image)d image, %(text)d text, %(video)d video, %(audio)d audio, %(application)d application, %(mail)d mail and %(other)d other." +msgstr "Inhalte: %(image)d Bild, %(text)d Text, %(video)d Video, %(audio)d Audio, %(application)d Anwendung, %(mail)d E-Mail und %(other)d andere Inhalte." -#: ../linkcheck/gui/linkchecker_ui_main.py:792 -msgid "Mail" -msgstr "E-Mail" +#: ../linkcheck/logger/html.py:257 +#: ../linkcheck/logger/text.py:244 +#, python-format +msgid "URL lengths: min=%(min)d, max=%(max)d, avg=%(avg)d." +msgstr "URL Längen: min=%(min)d, max=%(max)d, ∅=%(avg)d" -#: ../linkcheck/gui/linkchecker_ui_main.py:793 -msgid "URL statistics" -msgstr "URL Statistik" +#: ../linkcheck/logger/html.py:262 +#: ../linkcheck/logger/text.py:249 +msgid "No statistics available since zero URLs were checked." +msgstr "Keine Statistik verfügbar, da Null URLs geprüft wurden." -#: ../linkcheck/gui/linkchecker_ui_main.py:794 -msgid "Min. length" -msgstr "Min. Länge" +#: ../linkcheck/logger/html.py:268 +#: ../linkcheck/logger/text.py:197 +msgid "That's it." +msgstr "Das war's." -#: ../linkcheck/gui/linkchecker_ui_main.py:795 -msgid "Avg. length" -msgstr "Durchschn. Länge" +#: ../linkcheck/logger/html.py:270 +#: ../linkcheck/logger/text.py:198 +#, python-format +msgid "%d link checked." +msgid_plural "%d links checked." +msgstr[0] "%d Verknüpfung überprüft." +msgstr[1] "%d Verknüpfungen überprüft." -#: ../linkcheck/gui/linkchecker_ui_main.py:796 -msgid "Max. length" -msgstr "Max. Länge" +#: ../linkcheck/logger/html.py:273 +#: ../linkcheck/logger/text.py:201 +#, python-format +msgid "%d warning found" +msgid_plural "%d warnings found" +msgstr[0] "%d Warnung gefunden" +msgstr[1] "%d Warnungen gefunden" -#: ../linkcheck/gui/linkchecker_ui_main.py:797 -msgid "Domains" -msgstr "Domains" +#: ../linkcheck/logger/html.py:276 +#: ../linkcheck/logger/text.py:209 +#, python-format +msgid " (%d ignored or duplicates not printed)" +msgstr " (%d ignorierte oder doppelte Vorkommen nicht ausgegeben)" -#: ../linkcheck/gui/linkchecker_ui_main.py:798 -msgid "&Edit" -msgstr "&Bearbeiten" +#: ../linkcheck/logger/html.py:279 +#: ../linkcheck/logger/text.py:212 +#, python-format +msgid "%d error found" +msgid_plural "%d errors found" +msgstr[0] "%d Fehler gefunden" +msgstr[1] "%d Fehler gefunden" -#: ../linkcheck/gui/linkchecker_ui_main.py:799 -#: ../linkcheck/gui/linkchecker_ui_editor.py:56 -msgid "&File" -msgstr "&Datei" +#: ../linkcheck/logger/html.py:282 +#: ../linkcheck/logger/text.py:220 +#, python-format +msgid " (%d duplicates not printed)" +msgstr " (%d doppelte Vorkommen nicht ausgegeben)" -#: ../linkcheck/gui/linkchecker_ui_main.py:800 -#: ../linkcheck/gui/linkchecker_ui_main.py:803 -msgid "&Help" -msgstr "&Hilfe" +#: ../linkcheck/logger/html.py:288 +#: ../linkcheck/logger/text.py:225 +#, python-format +msgid "There was %(num)d internal error." +msgid_plural "There were %(num)d internal errors." +msgstr[0] "Es gab %(num)d internen Fehler." +msgstr[1] "Es gab %(num)d interne Fehler." -#: ../linkcheck/gui/linkchecker_ui_main.py:801 -msgid "A&bout" -msgstr "Ü&ber" +#: ../linkcheck/logger/html.py:293 +#: ../linkcheck/logger/text.py:229 +#: ../linkcheck/logger/__init__.py:355 +#, python-format +msgid "Stopped checking at %(time)s (%(duration)s)" +msgstr "Beende Prüfen am %(time)s (%(duration)s)" -#: ../linkcheck/gui/linkchecker_ui_main.py:802 -msgid "About" -msgstr "Über" +#: ../linkcheck/logger/html.py:298 +#, python-format +msgid "Get the newest version at %s" +msgstr "Die neueste Version gibt es unter %s" -#: ../linkcheck/gui/linkchecker_ui_main.py:804 -msgid "Help" -msgstr "Hilfe" +#: ../linkcheck/logger/html.py:301 +#, python-format +msgid "Write comments and bugs to %s" +msgstr "Schreiben Sie Kommentare und Fehler an %s" -#: ../linkcheck/gui/linkchecker_ui_main.py:805 -msgid "View online" -msgstr "Online anschauen" +#: ../linkcheck/logger/text.py:79 +#: ../linkcheck/logger/__init__.py:345 +#, python-format +msgid "Get the newest version at %(url)s" +msgstr "Die neueste Version gibt es unter %(url)s" -#: ../linkcheck/gui/linkchecker_ui_main.py:806 -msgid "View URL online" -msgstr "URL Online anschauen" +#: ../linkcheck/logger/text.py:81 +#: ../linkcheck/logger/__init__.py:347 +#, python-format +msgid "Write comments and bugs to %(url)s" +msgstr "Schreiben Sie Kommentare und Fehler an %(url)s" -#: ../linkcheck/gui/linkchecker_ui_main.py:807 -msgid "&Options" -msgstr "&Optionen" +#: ../linkcheck/logger/text.py:236 +msgid "Statistics:" +msgstr "Statistik:" -#: ../linkcheck/gui/linkchecker_ui_main.py:808 -#: /usr/lib/python2.6/optparse.py:1621 -msgid "Options" -msgstr "Optionen" +#: ../linkcheck/logger/__init__.py:31 +msgid "Real URL" +msgstr "Tats. URL" -#: ../linkcheck/gui/linkchecker_ui_main.py:809 -msgid "Copy to clipboard" -msgstr "URL kopieren" +#: ../linkcheck/logger/__init__.py:32 +msgid "Cache key" +msgstr "Cache Schlüssel" -#: ../linkcheck/gui/linkchecker_ui_main.py:810 -msgid "Copy URL to clipboard" -msgstr "URL in die Zwischenablage kopieren" +#: ../linkcheck/logger/__init__.py:33 +#: ../linkcheck/gui/linkchecker_ui_main.py:315 +#: ../linkcheck/gui/urlmodel.py:22 +msgid "Result" +msgstr "Ergebnis" -#: ../linkcheck/gui/linkchecker_ui_main.py:811 -msgid "Ctrl+C" -msgstr "Strg+C" +#: ../linkcheck/logger/__init__.py:34 +#: ../linkcheck/gui/linkchecker_ui_main.py:209 +msgid "Base" +msgstr "Basis" -#: ../linkcheck/gui/linkchecker_ui_main.py:812 -msgid "View parent online" -msgstr "Vater-URL Online anschauen" +#: ../linkcheck/logger/__init__.py:35 +#: ../linkcheck/gui/linkchecker_ui_main.py:174 +#: ../linkcheck/gui/urlmodel.py:22 +msgid "Name" +msgstr "Name" -#: ../linkcheck/gui/linkchecker_ui_main.py:813 -msgid "View parent URL online" -msgstr "Vater-URL Online anschauen" +#: ../linkcheck/logger/__init__.py:36 +#: ../linkcheck/gui/linkchecker_ui_main.py:191 +msgid "Parent URL" +msgstr "Vater URL" -#: ../linkcheck/gui/linkchecker_ui_main.py:814 -msgid "View parent source" -msgstr "Quellcode der Vater-URL anzeigen" +#: ../linkcheck/logger/__init__.py:37 +msgid "Extern" +msgstr "Extern" -#: ../linkcheck/gui/linkchecker_ui_main.py:815 -msgid "View parent URL source" -msgstr "Quellcode der Vater-URL anzeigen" +#: ../linkcheck/logger/__init__.py:38 +#: ../linkcheck/gui/linkchecker_ui_main.py:278 +msgid "Info" +msgstr "Info" -#: ../linkcheck/gui/linkchecker_ui_main.py:816 -msgid "Show debug" -msgstr "Zeige Debug" +#: ../linkcheck/logger/__init__.py:39 +#: ../linkcheck/gui/linkchecker_ui_main.py:296 +msgid "Warning" +msgstr "Warnung" -#: ../linkcheck/gui/linkchecker_ui_main.py:817 -msgid "View properties" -msgstr "Eigenschaften anschauen" +#: ../linkcheck/logger/__init__.py:40 +#: ../linkcheck/gui/linkchecker_ui_main.py:244 +msgid "D/L time" +msgstr "D/L Zeit" -#: ../linkcheck/gui/linkchecker_ui_main.py:818 -msgid "View URL properties" -msgstr "URL Eigenschaften anschauen" +#: ../linkcheck/logger/__init__.py:41 +#: ../linkcheck/gui/linkchecker_ui_main.py:261 +msgid "Size" +msgstr "Größe" -#: ../linkcheck/gui/linkchecker_ui_main.py:819 -msgid "&Save results..." -msgstr "Ergebnisse &speichern..." +#: ../linkcheck/logger/__init__.py:42 +#: ../linkcheck/gui/linkchecker_ui_main.py:227 +msgid "Check time" +msgstr "Prüfzeit" -#: ../linkcheck/gui/linkchecker_ui_main.py:820 -#: ../linkcheck/gui/linkchecker_ui_editor.py:58 -msgid "Ctrl+S" -msgstr "Strg+S" +#: ../linkcheck/logger/__init__.py:43 +#: ../linkcheck/gui/linkchecker_ui_main.py:156 +#: ../linkcheck/gui/urlmodel.py:22 +msgid "URL" +msgstr "URL" -#: ../linkcheck/gui/linkchecker_ui_main.py:821 -msgid "&Quit" -msgstr "&Beenden" +#: ../linkcheck/logger/__init__.py:44 +msgid "Level" +msgstr "Tiefe" -#: ../linkcheck/gui/linkchecker_ui_main.py:822 -msgid "Ctrl+Q" -msgstr "Strg+Q" - -#: ../linkcheck/gui/linkchecker_ui_main.py:823 -msgid "Check for updates" -msgstr "Prüfe auf Updates" - -#: ../linkcheck/gui/linkchecker_ui_main.py:824 -msgid "Donate" -msgstr "Spenden" - -#: ../linkcheck/gui/lineedit.py:175 -#, python-format -msgid "Insert %(browser)s bookmark file" -msgstr "%(browser)s Favoritendatei einfügen" - -#: ../linkcheck/gui/linkchecker_ui_options.py:169 -msgid "Linkchecker options" -msgstr "LinkChecker Optionen" - -#: ../linkcheck/gui/linkchecker_ui_options.py:170 -msgid "The most common check options are configurable. They override any configuration file settings." -msgstr "Die gebräuchlichsten Prüfoptionen sind konfigurierbar. Sie überschreiben alle Einträge der Konfigurationsdateien." - -#: ../linkcheck/gui/linkchecker_ui_options.py:171 -#: ../linkcheck/gui/linkchecker_ui_options.py:173 -msgid "Check recursively all links up to given depth. A negative depth will enable infinite recursion." -msgstr "" -"Prüfe rekursiv alle Verknüpfungen bis zu der angegebenen Tiefe. Eine\n" -"negative Tiefe erwirkt unendliche Rekursion." - -#: ../linkcheck/gui/linkchecker_ui_options.py:172 -msgid "Recursive depth" -msgstr "Rekursionstiefe" - -#: ../linkcheck/gui/linkchecker_ui_options.py:174 -#: ../linkcheck/gui/linkchecker_ui_options.py:176 -msgid "Log all checked URLs once. Default is to log only errors and warnings." -msgstr "Gebe alle URLs aus. Standard ist es, nur fehlerhafte URLs und Warnungen auszugeben." - -#: ../linkcheck/gui/linkchecker_ui_options.py:175 -msgid "Verbose output" -msgstr "Ausführliche Ausgabe" - -#: ../linkcheck/gui/linkchecker_ui_options.py:177 -msgid "Debug" -msgstr "Debug" - -#: ../linkcheck/gui/linkchecker_ui_options.py:178 -msgid "Warning regex" -msgstr "Reg. Ausdruck für Warnung" - -#: ../linkcheck/gui/linkchecker_ui_options.py:179 -msgid "Close" -msgstr "Schließen" - -#: ../linkcheck/gui/linkchecker_ui_options.py:180 -msgid "GUI options" -msgstr "GUI Optionen" - -#: ../linkcheck/gui/linkchecker_ui_options.py:181 -msgid "The user configuration file holds advanced options and can be edited with an integrated text editor." -msgstr "Die Benutzer-Konfigurationsdatei enthält fortgeschrittene Optionen und kann mit einem integrierten Texteditor bearbeitet werden." - -#: ../linkcheck/gui/linkchecker_ui_options.py:182 -msgid "Overrides system wide configuration file settings." -msgstr "Überschreibt systemweite Konfiguration." - -#: ../linkcheck/gui/linkchecker_ui_options.py:183 -msgid "/home/user/.linkchecker/linkcheckerrc" -msgstr "/home/user/.linkchecker/linkcheckerrc" - -#: ../linkcheck/gui/linkchecker_ui_options.py:185 -msgid "Configuration file" -msgstr "Konfigurationsdatei" - -#: ../linkcheck/gui/properties.py:36 -#: ../linkcheck/gui/properties.py:38 -#: ../linkcheck/logger/text.py:155 -#: ../linkcheck/logger/text.py:167 -#: ../linkcheck/logger/html.py:199 -#: ../linkcheck/logger/html.py:211 -#, python-format -msgid "%.3f seconds" -msgstr "%.3f Sekunden" - -#: ../linkcheck/gui/urlsave.py:21 -msgid "HTML output (*.html)" -msgstr "HTML Ausgabe (*.html)" - -#: ../linkcheck/gui/urlsave.py:22 -msgid "Text output (*.txt)" -msgstr "Text Ausgabe (*.txt)" - -#: ../linkcheck/gui/urlsave.py:23 -msgid "XML output (*.xml)" -msgstr "XML Ausgabe (*.xml)" - -#: ../linkcheck/gui/urlsave.py:24 -msgid "CSV output (*.csv)" -msgstr "CSV Ausgabe (*.csv)" - -#: ../linkcheck/gui/urlsave.py:57 -msgid "Save check results" -msgstr "Prüfergebnisse speichern" - -#: ../linkcheck/gui/urlmodel.py:22 -msgid "Parent" -msgstr "Vater" - -#: ../linkcheck/gui/urlmodel.py:78 -#: ../linkcheck/logger/text.py:138 -#: ../linkcheck/logger/html.py:174 +#: ../linkcheck/logger/__init__.py:252 #, python-format -msgid ", line %d" -msgstr ", Zeile %d" - -#: ../linkcheck/gui/urlmodel.py:79 -#: ../linkcheck/logger/text.py:139 -#: ../linkcheck/logger/html.py:175 -#, python-format -msgid ", col %d" -msgstr ", Spalte %d" - -#: ../linkcheck/gui/__init__.py:138 -#: ../linkcheck/gui/__init__.py:417 -msgid "Ready." -msgstr "Bereit." - -#: ../linkcheck/gui/__init__.py:165 -msgid "Check finished." -msgstr "Prüfung beendet." - -#: ../linkcheck/gui/__init__.py:235 -msgid "Start" -msgstr "Start" - -#: ../linkcheck/gui/__init__.py:259 -msgid "Stop" -msgstr "Anhalten" - -#: ../linkcheck/gui/__init__.py:307 -#, python-format -msgid "About %(appname)s" -msgstr "Über %(appname)s" - -#: ../linkcheck/gui/__init__.py:308 -#, python-format -msgid "" -"
\n" -"

%(app)s

\n" -"

Released on %(releasedate)s\n" -"

Python: %(pyver)s
\n" -"%(modules)s\n" -"

%(copyright)s\n" -"
%(appname)s is licensed under the\n" -"GPL\n" -"Version 2 or later.\n" -"

If you like %(appname)s, consider one of several ways to\n" -"donate. Thanks!\n" -"

" -msgstr "" -"
\n" -"

%(app)s

\n" -"

Veröffentlicht am %(releasedate)s\n" -"

Python: %(pyver)s
\n" -"%(modules)s\n" -"

%(copyright)s\n" -"

%(appname)s ist lizensiert unter der\n" -"GPL\n" -"Version 2 oder später.\n" -"

Falls Ihnen %(appname)s gefällt, können Sie mehrere Arten einer\n" -"Spende in Betracht ziehen. Vielen Dank!\n" -"" - -#: ../linkcheck/gui/__init__.py:353 -msgid "Closing pending connections..." -msgstr "Schließe aktuelle Verbindungen..." - -#: ../linkcheck/gui/__init__.py:387 -msgid "Error, empty URL" -msgstr "Fehler, leere URL" - -#: ../linkcheck/gui/__init__.py:389 -#, python-format -msgid "Checking '%s'." -msgstr "Prüfe '%s'" - -#: ../linkcheck/gui/__init__.py:394 -#, python-format -msgid "Error, invalid URL `%s'." -msgstr "Fehler, ungültige URL `%s'." - -#: ../linkcheck/gui/__init__.py:414 -#, python-format -msgid "%d URL selected." -msgid_plural "%d URLs selected" -msgstr[0] "%4d Verknüpfung ausgewählt" -msgstr[1] "%4d Verknüpfungen ausgewählt" - -#: ../linkcheck/gui/__init__.py:494 -msgid "LinkChecker internal error" -msgstr "LinkChecker interner Fehler" - -#: ../linkcheck/gui/linkchecker_ui_editor.py:55 -msgid "LinkChecker source view" -msgstr "LinkChecker Quellcodeanzeige" - -#: ../linkcheck/gui/linkchecker_ui_editor.py:57 -msgid "&Save" -msgstr "&Speichern" - -#: ../linkcheck/gui/linkchecker_ui_debug.py:42 -msgid "LinkChecker debug log" -msgstr "LinkChecker Debugausgabe" +msgid "Happy birthday for LinkChecker, I'm %d years old today!" +msgstr "Herzlichen Glückwunsch zum Geburtstag, LinkChecker, ich bin heute %d Jahre alt geworden!" -#: ../linkcheck/lc_cgi.py:90 +#: ../linkcheck/logger/__init__.py:342 #, python-format -msgid "URL has unparsable domain name: %s" -msgstr "URL besitzt einen nicht analysierbaren Rechnernamen: %s" - -#: ../linkcheck/lc_cgi.py:113 -msgid "unsupported language" -msgstr "nicht unterstützte Sprache" - -#: ../linkcheck/lc_cgi.py:118 -msgid "empty url was given" -msgstr "leere URL wurde angegeben" - -#: ../linkcheck/lc_cgi.py:120 -msgid "disallowed url was given" -msgstr "eine ungültige URL wurde angegeben" - -#: ../linkcheck/lc_cgi.py:122 -msgid "no url was given" -msgstr "keine URL wurde angegeben" - -#: ../linkcheck/lc_cgi.py:127 -msgid "invalid recursion level" -msgstr "ungültiger Rekursionslevel" +msgid "created by %(app)s at %(time)s" +msgstr "erstellt von %(app)s am %(time)s" -#: ../linkcheck/lc_cgi.py:132 -#, python-format -msgid "invalid %s option syntax" -msgstr "ungültige Option %s" +#: ../linkcheck/clamav.py:56 +msgid "clamd is not ready for stream scanning" +msgstr "clamd ist nicht bereit, einen Stream zu prüfen" -#: ../linkcheck/lc_cgi.py:154 -#, python-format -msgid "" -"\n" -"\n" -"LinkChecker Online Error\n" -"\n" -"

\n" -"Error: %s
\n" -"The LinkChecker Online script has encountered an error. Please ensure\n" -"that your provided URL link begins with http:// and\n" -"contains only these characters: A-Za-z0-9./_~-

\n" -"Errors are logged.\n" -"
\n" -"\n" -"" -msgstr "" -"\n" -"\n" -"LinkChecker Online Fehler\n" -"
Fehler: %s
Das LinkChecker Online Skript ist\n" -"auf einen Fehler gestoßen. Bitte stellen Sie sicher, daß die\n" -"angegebene URL mit http:// beginnt und nur diese Zeichen\n" -"enthält: A-Za-z0-9./_~-

Fehler werden geloggt.\n" -"
" +#: ../linkcheck/clamav.py:126 +msgid "ScannerDaemonOutputFormat must be disabled" +msgstr "ScannerDaemonOutputFormat muss deaktiviert sein" -#: ../linkcheck/director/console.py:47 -#, python-format -msgid "%2d URL active" -msgid_plural "%2d URLs active" -msgstr[0] "%2d URL aktiv" -msgstr[1] "%2d URLs aktiv" +#: ../linkcheck/clamav.py:128 +msgid "only one of TCPSocket and LocalSocket must be enabled" +msgstr "nur einer von TCPSocket oder LocalSocket muss aktiviert sein" -#: ../linkcheck/director/console.py:50 -#, python-format -msgid "%5d URL queued" -msgid_plural "%5d URLs queued" -msgstr[0] "%5d URL überprüft" -msgstr[1] "%5d URLs überprüft" +#: ../linkcheck/clamav.py:157 +msgid "one of TCPSocket or LocalSocket must be enabled" +msgstr "einer von TCPSocket oder LocalSocket muss aktiviert sein" -#: ../linkcheck/director/console.py:52 -#, python-format -msgid "%4d URL checked" -msgid_plural "%4d URLs checked" -msgstr[0] "%4d Verknüpfung überprüft" -msgstr[1] "%4d Verknüpfungen überprüft" +#: ../linkcheck/checker/telneturl.py:52 +msgid "Host is empty" +msgstr "Rechnername ist leer" -#: ../linkcheck/director/console.py:54 -#, python-format -msgid "runtime %s" -msgstr "Laufzeit %s" +#: ../linkcheck/checker/unknownurl.py:77 +#: ../linkcheck/checker/urlbase.py:493 +msgid "Outside of domain filter, checked only syntax." +msgstr "Außerhalb des Domain Filters; prüfe lediglich Syntax." -#: ../linkcheck/director/console.py:74 +#: ../linkcheck/checker/unknownurl.py:79 #, python-format -msgid "" -"********** Oops, I did it again. *************\n" -"\n" -"You have found an internal error in LinkChecker. Please write a bug report\n" -"at %s\n" -"and include the following information:\n" -"- the URL or file you are testing\n" -"- the system information below\n" -"\n" -"When using the commandline client:\n" -"- your commandline arguments and any custom configuration files.\n" -"- the output of a debug run with option \"-Dall\"\n" -"\n" -"Not disclosing some of the information above due to privacy reasons is ok.\n" -"I will try to help you nonetheless, but you have to give me something\n" -"I can work with ;) .\n" -msgstr "" -"********** Hoppla. *************\n" -"\n" -"Sie haben einen internen Fehler in LinkChecker entdeckt. Bitte schreiben Sie\n" -"einen Fehlerbericht an %s\n" -"mit den folgenden Informationen:\n" -"- die URL oder Datei, welche Sie gerade prüfen\n" -"- die untenstehenden Systeminformationen.\n" -"\n" -"Bei Benutzung des Kommandozeilenprogramms:\n" -"- ihre Kommandozeilenargumente und/oder Ihre Konfiguration.\n" -"- die Ausgabe eines Debuglaufs mit Option \"-Dall\"\n" -"\n" -"Wenn Sie Informationen aus privaten Gründen unterlassen, ist das in Ordnung.\n" -"Ich werde trotzdem versuchen, Ihnen zu helfen. Sie müssen mir allerdings\n" -"irgendwas geben, womit ich arbeiten kann ;).\n" - -#: ../linkcheck/director/console.py:102 -msgid "******** LinkChecker internal error, over and out ********" -msgstr "******** LinkChecker interner Fehler, und tschüß ********" - -#: ../linkcheck/director/console.py:122 -msgid "Default locale:" -msgstr "Standard Locale:" - -#: ../linkcheck/director/console.py:127 -msgid "System info:" -msgstr "Systeminformation:" +msgid "%(scheme)s URL ignored." +msgstr "%(scheme)s URL ignoriert." -#: ../linkcheck/director/console.py:129 -#: ../linkchecker:576 -#, python-format -msgid "Python %(version)s on %(platform)s" -msgstr "Python %(version)s auf %(platform)s" +#: ../linkcheck/checker/unknownurl.py:83 +msgid "URL is unrecognized or has invalid syntax" +msgstr "URL ist unbekannt oder besitzt ungültige Syntax" -#: ../linkcheck/director/console.py:134 -msgid "Local time:" -msgstr "Uhrzeit:" +#: ../linkcheck/checker/const.py:104 +msgid "The effective URL is different from the original." +msgstr "Die effektive URL unterscheidet sich vom Original." -#: ../linkcheck/director/__init__.py:39 -msgid "Could not import twill for login URL visit" -msgstr "Konnte twill nicht importieren, um die Login URL zu besuchen." +#: ../linkcheck/checker/const.py:106 +msgid "Could not get the content of the URL." +msgstr "Konnte den Inhalt der URL nicht bekommen." -#: ../linkcheck/director/__init__.py:45 -#, python-format -msgid "Error visiting login URL %(url)s." -msgstr "Fehler beim Besuchen der Login URL %(url)s." +#: ../linkcheck/checker/const.py:107 +msgid "URL anchor was not found." +msgstr "URL Anker wurde nicht gefunden." -#: ../linkcheck/director/__init__.py:50 -#, python-format -msgid "Error posting form at login URL %(url)s." -msgstr "Fehler beim Abschicken des Formulars bei Login URL %(url)s." +#: ../linkcheck/checker/const.py:109 +msgid "The warning regular expression was found in the URL contents." +msgstr "Der reguläre Ausdruck für Warnungen wurde in den URL Inhalten gefunden." -#: ../linkcheck/director/__init__.py:127 -#, python-format -msgid "Error using login URL: %(msg)s." -msgstr "Fehler bei Login URL: %(msg)s." +#: ../linkcheck/checker/const.py:110 +msgid "The URL content size is too large." +msgstr "Der URL Inhalt ist zu groß." -#: ../linkcheck/director/__init__.py:143 -msgid "Could not start a new thread. Check that the current user is allowed to start new threads." -msgstr "Konnte keinen neuen Thread starten. Überprüfen sie, ob der aktuelle Benutzer neue Threads starten darf." +#: ../linkcheck/checker/const.py:111 +msgid "The URL content size is zero." +msgstr "Der URL Inhaltsgrößenangabe ist Null." -#: ../linkcheck/director/__init__.py:175 -msgid "user interrupt; waiting for active threads to finish" -msgstr "Benutzerabbruch; warte auf Beendigung von aktiven Verbindungen" +#: ../linkcheck/checker/const.py:112 +msgid "The URL content size and download size are unequal." +msgstr "Der URL Inhaltsgrößenangabe und die Download-Größe sind unterschiedlich." -#: ../linkcheck/director/__init__.py:177 -msgid "another interrupt will exit immediately" -msgstr "ein weiter Abbruch beendet dieses Programm sofort" +#: ../linkcheck/checker/const.py:113 +msgid "The URL contains leading or trailing whitespace." +msgstr "Die URL %(url)s enthält Leerzeichen am Anfang oder Ende." -#: ../linkcheck/director/__init__.py:193 -msgid "user abort; force shutdown" -msgstr "Benutzerabbruch; erzwinge Programmende" +#: ../linkcheck/checker/const.py:114 +msgid "The file: URL is missing a trailing slash." +msgstr "Der file: URL fehlt ein abschließender Schrägstrich." -#: ../linkcheck/director/aggregator.py:70 -msgid "These URLs are still active:" -msgstr "Folgende URLs sind noch aktiv:" +#: ../linkcheck/checker/const.py:116 +msgid "The file: path is not the same as the system specific path." +msgstr "Der file: Pfad ist nicht derselbe wie der Systempfad." -#: ../linkcheck/strformat.py:230 -#, python-format -msgid "%(prefix)s%(duration).02f seconds" -msgstr "%(prefix)s%(duration).02f Sekunden" +#: ../linkcheck/checker/const.py:117 +msgid "The ftp: URL is missing a trailing slash." +msgstr "Der ftp: URL fehlt ein abschließender Schrägstrich." -#: ../linkcheck/strformat.py:233 -#, python-format -msgid "%d second" -msgid_plural "%d seconds" -msgstr[0] "%d Sekunde" -msgstr[1] "%d Sekunden" +#: ../linkcheck/checker/const.py:118 +msgid "The http: URL checking has been denied." +msgstr "Die http: URL-Überprüfung wurde verweigert." -#: ../linkcheck/strformat.py:234 -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d Minute" -msgstr[1] "%d Minuten" +#: ../linkcheck/checker/const.py:119 +msgid "The URL has moved permanently." +msgstr "Die URL wurde dauerhaft verschoben." -#: ../linkcheck/strformat.py:235 -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d Stunde" -msgstr[1] "%d Stunden" +#: ../linkcheck/checker/const.py:121 +msgid "The URL has been redirected to an URL of a different type." +msgstr "Die URL wurde zu einem anderen URL-Typ umgeleitet." -#: ../linkcheck/strformat.py:236 -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d Tag" -msgstr[1] "%d Tage" +#: ../linkcheck/checker/const.py:122 +msgid "The URL had no content." +msgstr "Die URL besitzt keinen Inhalt." -#: ../linkcheck/strformat.py:237 -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d Jahr" -msgstr[1] "%d Jahre" +#: ../linkcheck/checker/const.py:124 +msgid "An error occurred while storing a cookie." +msgstr "Ein Fehler trat auf während des Speicherns eines Cookies." -#: ../linkcheck/updater.py:63 -msgid "could not download update information" -msgstr "konnte Update-Informationen nicht herunterladen" +#: ../linkcheck/checker/const.py:126 +msgid "An error occurred while decompressing the URL content." +msgstr "Ein Fehler trat beim Dekomprimieren des URL Inhalts auf." -#: ../linkcheck/logger/text.py:79 -#: ../linkcheck/logger/__init__.py:340 -#, python-format -msgid "Get the newest version at %(url)s" -msgstr "Die neueste Version gibt es unter %(url)s" +#: ../linkcheck/checker/const.py:128 +msgid "The URL content is encoded with an unknown encoding." +msgstr "Der URL-Inhalt ist in einer unbekannten Kodierung verfasst." -#: ../linkcheck/logger/text.py:81 -#: ../linkcheck/logger/__init__.py:342 -#, python-format -msgid "Write comments and bugs to %(url)s" -msgstr "Schreiben Sie Kommentare und Fehler an %(url)s" +#: ../linkcheck/checker/const.py:130 +msgid "Unsupported HTTP authentication method." +msgstr "Nicht unterstützte HTTP Authentifizierungsmethode." -#: ../linkcheck/logger/text.py:85 -#: ../linkcheck/logger/html.py:95 -#, python-format -msgid "Start checking at %s" -msgstr "Beginne Prüfen am %s" +#: ../linkcheck/checker/const.py:131 +msgid "The URL has been ignored." +msgstr "Die URL wurde ignoriert." -#: ../linkcheck/logger/text.py:126 -#: ../linkcheck/logger/html.py:160 -msgid " (cached)" -msgstr " (aus dem Cache)" +#: ../linkcheck/checker/const.py:132 +msgid "The mail MX host could not be found." +msgstr "Der MX Mail-Rechner konnte nicht gefunden werden." -#: ../linkcheck/logger/text.py:186 -#: ../linkcheck/logger/html.py:235 -msgid "Valid" -msgstr "Gültig" +#: ../linkcheck/checker/const.py:134 +msgid "The mailto: address could not be verified." +msgstr "Die mailto: Addresse konnte nicht überprüft werden." -#: ../linkcheck/logger/text.py:189 -#: ../linkcheck/logger/html.py:240 -msgid "Error" -msgstr "Fehler" +#: ../linkcheck/checker/const.py:136 +msgid "No connection to a MX host could be established." +msgstr "Es konnte keine Verbindung zu einem MX-Rechner hergestellt werden." -#: ../linkcheck/logger/text.py:197 -#: ../linkcheck/logger/html.py:268 -msgid "That's it." -msgstr "Das war's." +#: ../linkcheck/checker/const.py:137 +msgid "No NNTP server was found." +msgstr "Es wurde kein NNTP Server gefunden." -#: ../linkcheck/logger/text.py:198 -#: ../linkcheck/logger/html.py:270 -#, python-format -msgid "%d link checked." -msgid_plural "%d links checked." -msgstr[0] "%d Verknüpfung überprüft." -msgstr[1] "%d Verknüpfungen überprüft." +#: ../linkcheck/checker/const.py:138 +msgid "The NNTP newsgroup could not be found." +msgstr "Die NNTP Nachrichtengruppe konnte nicht gefunden werden." -#: ../linkcheck/logger/text.py:201 -#: ../linkcheck/logger/html.py:273 -#, python-format -msgid "%d warning found" -msgid_plural "%d warnings found" -msgstr[0] "%d Warnung gefunden" -msgstr[1] "%d Warnungen gefunden" +#: ../linkcheck/checker/const.py:139 +msgid "The IP is obfuscated." +msgstr "Die IP-Adresse ist verschleiert." -#: ../linkcheck/logger/text.py:209 -#: ../linkcheck/logger/html.py:276 +#: ../linkcheck/checker/mailtourl.py:87 #, python-format -msgid " (%d ignored or duplicates not printed)" -msgstr " (%d ignorierte oder doppelte Vorkommen nicht ausgegeben)" +msgid "No mail addresses found in `%(url)s'." +msgstr "Keine Adressen wurden in `%(url)s' gefunden." -#: ../linkcheck/logger/text.py:212 -#: ../linkcheck/logger/html.py:279 +#: ../linkcheck/checker/mailtourl.py:126 #, python-format -msgid "%d error found" -msgid_plural "%d errors found" -msgstr[0] "%d Fehler gefunden" -msgstr[1] "%d Fehler gefunden" +msgid "Error parsing CGI values: %s" +msgstr "Fehler beim Parsen der CGI-Werte: %s" -#: ../linkcheck/logger/text.py:220 -#: ../linkcheck/logger/html.py:282 +#: ../linkcheck/checker/mailtourl.py:149 #, python-format -msgid " (%d duplicates not printed)" -msgstr " (%d doppelte Vorkommen nicht ausgegeben)" +msgid "Mail address `%(addr)s' too long. Allowed 256 chars, was %(length)d chars." +msgstr "E-Mail-Adresse `%(addr)s' ist zu lang. Erlaubt sind 256 Zeichen, es waren aber %(length)d Zeichen." -#: ../linkcheck/logger/text.py:225 -#: ../linkcheck/logger/html.py:288 -#: ../linkcheck/logger/__init__.py:350 +#: ../linkcheck/checker/mailtourl.py:153 #, python-format -msgid "Stopped checking at %(time)s (%(duration)s)" -msgstr "Beende Prüfen am %(time)s (%(duration)s)" - -#: ../linkcheck/logger/text.py:232 -msgid "Statistics:" -msgstr "Statistik:" +msgid "Missing `@' in mail address `%(addr)s'." +msgstr "Fehlendes `@' in E-Mail-Adresse `%(addr)s'." -#: ../linkcheck/logger/text.py:234 -#: ../linkcheck/logger/html.py:249 +#: ../linkcheck/checker/mailtourl.py:159 #, python-format -msgid "Number of domains: %d" -msgstr "Anzahl von Domains: %d" +msgid "Missing local part of mail address `%(addr)s'." +msgstr "Fehlender lokaler Teil der E-Mail-Adresse `%(addr)s'." -#: ../linkcheck/logger/text.py:237 -#: ../linkcheck/logger/html.py:253 +#: ../linkcheck/checker/mailtourl.py:163 #, python-format -msgid "Content types: %(image)d image, %(text)d text, %(video)d video, %(audio)d audio, %(application)d application, %(mail)d mail and %(other)d other." -msgstr "Inhalte: %(image)d Bild, %(text)d Text, %(video)d Video, %(audio)d Audio, %(application)d Anwendung, %(mail)d E-Mail und %(other)d andere Inhalte." +msgid "Missing domain part of mail address `%(addr)s'." +msgstr "Fehlender Domänen-Teil der E-Mail-Adresse `%(addr)s'." -#: ../linkcheck/logger/text.py:240 -#: ../linkcheck/logger/html.py:257 +#: ../linkcheck/checker/mailtourl.py:167 #, python-format -msgid "URL lengths: min=%(min)d, max=%(max)d, avg=%(avg)d." -msgstr "URL Längen: min=%(min)d, max=%(max)d, ∅=%(avg)d" - -#: ../linkcheck/logger/text.py:245 -#: ../linkcheck/logger/html.py:262 -msgid "No statistics available since zero URLs were checked." -msgstr "Keine Statistik verfügbar, da Null URLs geprüft wurden." - -#: ../linkcheck/logger/html.py:140 -msgid "checked link" -msgstr "geprüfte Verknüpfung" +msgid "Local part of mail address `%(addr)s' too long. Allowed 64 chars, was %(length)d chars." +msgstr "Lokaler Teil der E-Mail-Adresse `%(addr)s' ist zu lang. Erlaubt sind 64 Zeichen, es waren aber %(length)d Zeichen." -#: ../linkcheck/logger/html.py:247 -msgid "Statistics" -msgstr "Statistik" +#: ../linkcheck/checker/mailtourl.py:171 +#, python-format +msgid "Domain part of mail address `%(addr)s' too long. Allowed 255 chars, was %(length)d chars." +msgstr "Domänen-Teil der E-Mail-Adresse `%(addr)s' ist zu lang. Erlaubt sind 255 Zeichen, es waren aber %(length)d Zeichen." -#: ../linkcheck/logger/html.py:293 +#: ../linkcheck/checker/mailtourl.py:180 #, python-format -msgid "Get the newest version at %s" -msgstr "Die neueste Version gibt es unter %s" +msgid "Unquoted double quote or backslash in mail address `%(addr)s'." +msgstr "Nicht kodiertes doppeltes Anführungszeichen oder Escape in E-Mail-Adresse `%(addr)s'." -#: ../linkcheck/logger/html.py:296 +#: ../linkcheck/checker/mailtourl.py:185 #, python-format -msgid "Write comments and bugs to %s" -msgstr "Schreiben Sie Kommentare und Fehler an %s" - -#: ../linkcheck/logger/__init__.py:31 -msgid "Real URL" -msgstr "Tats. URL" - -#: ../linkcheck/logger/__init__.py:32 -msgid "Cache key" -msgstr "Cache Schlüssel" +msgid "Local part of mail address `%(addr)s' may not start with a dot." +msgstr "Der lokale Teil der E-Mail-Adresse `%(addr)s' darf nicht mit einem Punkt beginnen." -#: ../linkcheck/logger/__init__.py:37 -msgid "Extern" -msgstr "Extern" +#: ../linkcheck/checker/mailtourl.py:189 +#, python-format +msgid "Local part of mail address `%(addr)s' may not end with a dot." +msgstr "Der lokale Teil der E-Mail-Adresse `%(addr)s' darf nicht mit einem Punkt enden." -#: ../linkcheck/logger/__init__.py:44 -msgid "Level" -msgstr "Tiefe" +#: ../linkcheck/checker/mailtourl.py:193 +#, python-format +msgid "Local part of mail address `%(addr)s' may not contain two dots." +msgstr "Der lokale Teil der E-Mail-Adresse `%(addr)s' darf nicht zwei Punkte beinhalten." -#: ../linkcheck/logger/__init__.py:246 +#: ../linkcheck/checker/mailtourl.py:198 #, python-format -msgid "Happy birthday for LinkChecker, I'm %d years old today!" -msgstr "Herzlichen Glückwunsch zum Geburtstag, LinkChecker, ich bin heute %d Jahre alt geworden!" +msgid "Local part of mail address `%(addr)s' contains unquoted character `%(char)s." +msgstr "Lokaler Teil der E-Mail-Adresse `%(addr)s' beinhaltet ein nicht kodiertes Zeichen `%(char)s." -#: ../linkcheck/logger/__init__.py:337 +#: ../linkcheck/checker/mailtourl.py:210 #, python-format -msgid "created by %(app)s at %(time)s" -msgstr "erstellt von %(app)s am %(time)s" +msgid "Domain part of mail address `%(addr)s' has invalid IP." +msgstr "Domänen-Teil der E-Mail-Adresse `%(addr)s' besitzt eine ungültige IP-Adresse." -#: ../linkcheck/checker/proxysupport.py:42 +#: ../linkcheck/checker/mailtourl.py:216 #, python-format -msgid "Proxy value `%(proxy)s' must start with 'http:' or 'https:'." -msgstr "Proxy `%(proxy)s' muss mit 'http:' oder 'https:' beginnen." +msgid "Invalid domain part of mail address `%(addr)s'." +msgstr "Ungültige Domänen-Teil der E-Mail-Adresse `%(addr)s'." -#: ../linkcheck/checker/proxysupport.py:51 +#: ../linkcheck/checker/mailtourl.py:220 #, python-format -msgid "Ignoring proxy setting `%(proxy)s'." -msgstr "Ignoriere Proxy Einstellung `%(proxy)s'" +msgid "Invalid top level domain part of mail address `%(addr)s'." +msgstr "Ungültige Toplevel-Domänen-Teil der E-Mail-Adresse `%(addr)s'." -#: ../linkcheck/checker/proxysupport.py:54 +#: ../linkcheck/checker/mailtourl.py:258 #, python-format -msgid "Using proxy `%(proxy)s'." -msgstr "Verwende Proxy `%(proxy)s'." +msgid "No MX mail host for %(domain)s found." +msgstr "Kein MX mail host für %(domain)s gefunden." -#: ../linkcheck/checker/unknownurl.py:77 -#: ../linkcheck/checker/urlbase.py:492 -msgid "Outside of domain filter, checked only syntax." -msgstr "Außerhalb des Domain Filters; prüfe lediglich Syntax." +#: ../linkcheck/checker/mailtourl.py:266 +#, python-format +msgid "No host for %(domain)s found." +msgstr "Kein Rechner für %(domain)s gefunden." -#: ../linkcheck/checker/unknownurl.py:79 +#: ../linkcheck/checker/mailtourl.py:280 #, python-format -msgid "%(scheme)s URL ignored." -msgstr "%(scheme)s URL ignoriert." +msgid "Got invalid DNS answer %(answer)s for %(domain)s." +msgstr "Ungültige DNS Antwort %(answer)s für %(domain)s erhalten." -#: ../linkcheck/checker/unknownurl.py:83 -msgid "URL is unrecognized or has invalid syntax" -msgstr "URL ist unbekannt oder besitzt ungültige Syntax" +#: ../linkcheck/checker/mailtourl.py:324 +#, python-format +msgid "Verified address %(mail)s: %(info)s." +msgstr "Gültige Adresse %(mail)s: %(info)s." -#: ../linkcheck/checker/fileurl.py:142 -msgid "Added trailing slash to directory." -msgstr "Schrägstrich wurde zu Verzeichnis hinzugefügt." +#: ../linkcheck/checker/mailtourl.py:328 +#, python-format +msgid "Unverified but presumably valid address %(mail)s: %(info)s." +msgstr "Unverifizierte aber wahrscheinlich gültige Adresse %(mail)s: %(info)s." -#: ../linkcheck/checker/fileurl.py:163 -msgid "directory" -msgstr "Verzeichnis" +#: ../linkcheck/checker/mailtourl.py:331 +#, python-format +msgid "Unverified address: %(info)s." +msgstr "Unverifizierte Adresse: %(info)s." -#: ../linkcheck/checker/fileurl.py:180 +#: ../linkcheck/checker/mailtourl.py:335 #, python-format -msgid "The URL path %(path)r is not the same as the system path %(realpath)r. You should always use the system path in URLs." -msgstr "Der URL Pfad %(path)r ist nicht derselbe wie der Systempfad %(realpath)r. Sie sollten immer den Systempfad in URLs benutzen." +msgid "MX mail host %(host)s did not accept connections: %(error)s." +msgstr "Der MX mail host %(host)s akzeptierte keine SMTP Verbindungen: %(error)s." -#: ../linkcheck/checker/fileurl.py:190 -#: ../linkcheck/checker/urlbase.py:706 -#: ../linkcheck/checker/httpurl.py:656 -msgid "File size too large" -msgstr "Dateigröße ist zu groß" +#: ../linkcheck/checker/mailtourl.py:341 +msgid "Could not connect, but syntax is correct" +msgstr "Konnte nicht konnektieren, aber die Syntax ist korrekt" -#: ../linkcheck/checker/telneturl.py:52 -msgid "Host is empty" -msgstr "Rechnername ist leer" +#: ../linkcheck/checker/mailtourl.py:344 +#, python-format +msgid "Found MX mail host %(host)s" +msgstr "MX Mail host %(host)s gefunden" #: ../linkcheck/checker/urlbase.py:69 #, python-format msgid "URL has unparsable domain name: %(name)s" msgstr "URL besitzt einen nicht analysierbaren Rechnernamen: %(name)s" -#: ../linkcheck/checker/urlbase.py:136 +#: ../linkcheck/checker/urlbase.py:137 #, python-format msgid "Leading or trailing whitespace in URL `%(url)s'." msgstr "Die URL %(url)s enthält Leerzeichen am Anfang oder Ende." -#: ../linkcheck/checker/urlbase.py:372 +#: ../linkcheck/checker/urlbase.py:373 msgid "URL is missing" msgstr "URL fehlt" -#: ../linkcheck/checker/urlbase.py:375 +#: ../linkcheck/checker/urlbase.py:376 msgid "URL is empty" msgstr "URL ist leer" -#: ../linkcheck/checker/urlbase.py:382 +#: ../linkcheck/checker/urlbase.py:383 #, python-format msgid "Effective URL %(url)r." msgstr "Effektive URL %(url)r." -#: ../linkcheck/checker/urlbase.py:435 +#: ../linkcheck/checker/urlbase.py:436 #, python-format msgid "URL has invalid port %(port)r" msgstr "URL hat eine ungültige Portnummer %(port)r" -#: ../linkcheck/checker/urlbase.py:450 +#: ../linkcheck/checker/urlbase.py:451 #, python-format msgid "URL %(url)s has obfuscated IP address %(ip)s" msgstr "URL %(url)s besitzt die verschleierte IP-Adresse %(ip)s" -#: ../linkcheck/checker/urlbase.py:477 +#: ../linkcheck/checker/urlbase.py:478 #, python-format msgid "URL is located in %(country)s." msgstr "URL befindet sich in %(country)s." -#: ../linkcheck/checker/urlbase.py:505 +#: ../linkcheck/checker/urlbase.py:506 msgid "Hostname not found" msgstr "Rechnername nicht gefunden" -#: ../linkcheck/checker/urlbase.py:508 +#: ../linkcheck/checker/urlbase.py:509 #, python-format msgid "Bad HTTP response %(line)r" msgstr "Ungültige HTTP Antwort %(line)r" -#: ../linkcheck/checker/urlbase.py:521 +#: ../linkcheck/checker/urlbase.py:522 #, python-format msgid "could not get content: %(msg)r" msgstr "konnte Inhalt nicht parsen: %(msg)r" -#: ../linkcheck/checker/urlbase.py:651 +#: ../linkcheck/checker/urlbase.py:652 #, python-format msgid "Anchor `%(name)s' not found." msgstr "Anker `%(name)s' nicht gefunden." -#: ../linkcheck/checker/urlbase.py:652 +#: ../linkcheck/checker/urlbase.py:653 #, python-format msgid "Available anchors: %(anchors)s." msgstr "Verfügbare Anker: %(anchors)s." -#: ../linkcheck/checker/urlbase.py:752 +#: ../linkcheck/checker/urlbase.py:707 +#: ../linkcheck/checker/fileurl.py:190 +#: ../linkcheck/checker/httpurl.py:656 +msgid "File size too large" +msgstr "Dateigröße ist zu groß" + +#: ../linkcheck/checker/urlbase.py:753 #, python-format msgid "Found %(match)r at line %(line)d in link contents." msgstr "Habe %(match)r in Zeile %(line)d im Inhalt der Verknüpfung gefunden." -#: ../linkcheck/checker/urlbase.py:768 +#: ../linkcheck/checker/urlbase.py:769 msgid "Content size is zero." msgstr "Größe des Inhalts ist Null." -#: ../linkcheck/checker/urlbase.py:774 +#: ../linkcheck/checker/urlbase.py:775 #, python-format msgid "Content size %(dlsize)s is larger than %(maxbytes)s." msgstr "Inhalt %(dlsize)s is größer als %(maxbytes)s." -#: ../linkcheck/checker/urlbase.py:779 +#: ../linkcheck/checker/urlbase.py:780 #, python-format msgid "Download size (%(dlsize)d Byte) does not equal content size (%(size)d Byte)." msgstr "Download Grüße (%(dlsize)d Byte) ist ungleich der Inhaltsgröße (%(size)d Byte)." -#: ../linkcheck/checker/urlbase.py:789 -#: ../linkcheck/configuration/__init__.py:348 -msgid "warning: tidy module is not available; download from http://utidylib.berlios.de/" -msgstr "Warnung: tidy Modul ist nicht verfügbar; Download von http://utidylib.berlios.de/" - -#: ../linkcheck/checker/urlbase.py:802 -#: ../linkcheck/checker/urlbase.py:871 +#: ../linkcheck/checker/urlbase.py:803 +#: ../linkcheck/checker/urlbase.py:872 msgid "valid HTML syntax" msgstr "gültige HTML Syntax" -#: ../linkcheck/checker/urlbase.py:808 +#: ../linkcheck/checker/urlbase.py:809 #, python-format msgid "warning: tidy HTML parsing caused error: %(msg)s " msgstr "Warnung: tidy HTML Parser verursachte Fehler: %(msg)s" -#: ../linkcheck/checker/urlbase.py:818 -#: ../linkcheck/configuration/__init__.py:356 -msgid "warning: cssutils module is not available; download from http://cthedot.de/cssutils/" -msgstr "Warnung: cssutils Modul ist nicht verfügbar; Download von http://cthedot.de/cssutils/" - -#: ../linkcheck/checker/urlbase.py:834 -#: ../linkcheck/checker/urlbase.py:907 +#: ../linkcheck/checker/urlbase.py:835 +#: ../linkcheck/checker/urlbase.py:908 msgid "valid CSS syntax" msgstr "gültige CSS Syntax" -#: ../linkcheck/checker/urlbase.py:840 +#: ../linkcheck/checker/urlbase.py:841 #, python-format msgid "warning: cssutils parsing caused error: %(msg)s" msgstr "Warnung: cssutils Parser verursachte Fehler: %(msg)s" -#: ../linkcheck/checker/urlbase.py:849 +#: ../linkcheck/checker/urlbase.py:850 #, python-format msgid "%(w3type)s validation error at line %(line)s col %(column)s: %(msg)s" msgstr "%(w3type)s Validierungsfehler in Zeile %(line)s Spalte %(column)s: %(msg)s" -#: ../linkcheck/checker/urlbase.py:880 +#: ../linkcheck/checker/urlbase.py:881 #, python-format msgid "warning: HTML W3C validation caused error: %(msg)s " msgstr "Warnung: HTML W3C Validierung verursachte Fehler: %(msg)s" -#: ../linkcheck/checker/urlbase.py:915 +#: ../linkcheck/checker/urlbase.py:916 #, python-format msgid "warning: CSS W3C validation caused error: %(msg)s " msgstr "Warnung: CSS W3C Validierung verursachte Fehler: %(msg)s" +#: ../linkcheck/checker/proxysupport.py:42 +#, python-format +msgid "Proxy value `%(proxy)s' must start with 'http:' or 'https:'." +msgstr "Proxy `%(proxy)s' muss mit 'http:' oder 'https:' beginnen." + +#: ../linkcheck/checker/proxysupport.py:51 +#, python-format +msgid "Ignoring proxy setting `%(proxy)s'." +msgstr "Ignoriere Proxy Einstellung `%(proxy)s'" + +#: ../linkcheck/checker/proxysupport.py:54 +#, python-format +msgid "Using proxy `%(proxy)s'." +msgstr "Verwende Proxy `%(proxy)s'." + #: ../linkcheck/checker/httpsurl.py:35 #, python-format msgid "%s URL ignored." @@ -1149,9 +871,129 @@ msgid "Missing trailing directory slash in ftp url." msgstr "Fehlender / am Ende der FTP url." -#: ../linkcheck/checker/ftpurl.py:235 -msgid "FTP file size too large" -msgstr "FTP Dateigröße ist zu groß" +#: ../linkcheck/checker/ftpurl.py:235 +msgid "FTP file size too large" +msgstr "FTP Dateigröße ist zu groß" + +#: ../linkcheck/checker/fileurl.py:142 +msgid "Added trailing slash to directory." +msgstr "Schrägstrich wurde zu Verzeichnis hinzugefügt." + +#: ../linkcheck/checker/fileurl.py:163 +msgid "directory" +msgstr "Verzeichnis" + +#: ../linkcheck/checker/fileurl.py:180 +#, python-format +msgid "The URL path %(path)r is not the same as the system path %(realpath)r. You should always use the system path in URLs." +msgstr "Der URL Pfad %(path)r ist nicht derselbe wie der Systempfad %(realpath)r. Sie sollten immer den Systempfad in URLs benutzen." + +#: ../linkcheck/checker/httpurl.py:136 +msgid "Access denied by robots.txt, skipping content checks." +msgstr "Zugriff verweigert durch robots.txt; lasse das Prüfen des URL Inhalts aus." + +#: ../linkcheck/checker/httpurl.py:143 +msgid "Amazon servers block HTTP HEAD requests." +msgstr "Amazon Server blockieren HTTP HEAD Anfragen." + +#: ../linkcheck/checker/httpurl.py:145 +msgid "Using GET method for Amazon server." +msgstr "Benutze die GET-Methode für Amazon-Server." + +#: ../linkcheck/checker/httpurl.py:152 +msgid "unknown" +msgstr "unbekannt" + +#: ../linkcheck/checker/httpurl.py:154 +#, python-format +msgid "Server `%(name)s' did not support HEAD request; a GET request was used instead." +msgstr "Server `%(name)s' unterstützte keine HEAD Anfrage; eine GET Anfrage wurde stattdessen verwendet." + +#: ../linkcheck/checker/httpurl.py:205 +#, python-format +msgid "Enforced proxy `%(name)s'." +msgstr "Erzwungener Proxy `%(name)s'." + +#: ../linkcheck/checker/httpurl.py:210 +#, python-format +msgid "Enforced proxy `%(name)s' ignored, aborting." +msgstr "Erzwungener Proxy `%(name)s' wurde ignoriert, breche ab." + +#: ../linkcheck/checker/httpurl.py:241 +#, python-format +msgid "more than %d redirections, aborting" +msgstr "mehr als %d Weiterleitungen, breche ab" + +#: ../linkcheck/checker/httpurl.py:251 +#, python-format +msgid "Unsupported HTTP authentication `%(auth)s', only `Basic' authentication is supported." +msgstr "Nicht unterstützte HTTP Authentifizierungsmethode `%(auth)s', nur `Basic' Authentifizierung ist unterstützt." + +#: ../linkcheck/checker/httpurl.py:315 +#, python-format +msgid "Redirected to `%(url)s'." +msgstr "Zu `%(url)s' umgeleitet." + +#: ../linkcheck/checker/httpurl.py:355 +#, python-format +msgid "Redirection to url `%(newurl)s' is not allowed." +msgstr "Umleitung zu `%(newurl)s' ist nicht erlaubt." + +#: ../linkcheck/checker/httpurl.py:378 +msgid "The redirected URL is outside of the domain filter, checked only syntax." +msgstr "Die Weiterleitungs-URL ist außerhalb des Domain Filters; prüfe lediglich Syntax." + +#: ../linkcheck/checker/httpurl.py:391 +msgid "Access to redirected URL denied by robots.txt, checked only syntax." +msgstr "Zugriff zur Weiterleitungs-URL verweigert durch robots.txt; prüfe lediglich Syntax." + +#: ../linkcheck/checker/httpurl.py:409 +#, python-format +msgid "" +"recursive redirection encountered:\n" +" %(urls)s" +msgstr "" +"Rekursive Weiterleitung entdeckt:\n" +" %(urls)s" + +#: ../linkcheck/checker/httpurl.py:426 +#, python-format +msgid "Redirection to URL `%(newurl)s' with different scheme found; the original URL was `%(url)s'." +msgstr "Weiterleitung zu URL `%(newurl)s' mit anderem Schema gefunden; die Original-URL war `%(url)s'." + +#: ../linkcheck/checker/httpurl.py:438 +msgid "HTTP 301 (moved permanent) encountered: you should update this link." +msgstr "HTTP 301 (moved permanent) gefunden: sie sollten diesen Link aktualisieren." + +#: ../linkcheck/checker/httpurl.py:467 +#, python-format +msgid "Sent Cookie: %(cookie)s." +msgstr "Gesendetes Cookie: %(cookie)s." + +#: ../linkcheck/checker/httpurl.py:473 +#, python-format +msgid "Could not store cookies from headers: %(error)s." +msgstr "Konnte Cookies nicht aus Kopfdaten speichern: %(error)s." + +#: ../linkcheck/checker/httpurl.py:482 +#, python-format +msgid "Last modified %(date)s." +msgstr "Letzte Änderung %(date)s." + +#: ../linkcheck/checker/httpurl.py:631 +#, python-format +msgid "Unsupported HTTP url scheme `%(scheme)s'" +msgstr "Nicht unterstütztes HTTP URL Schema `%(scheme)s'" + +#: ../linkcheck/checker/httpurl.py:676 +#, python-format +msgid "Decompress error %(err)s" +msgstr "Entkomprimierungsfehler %(err)s" + +#: ../linkcheck/checker/httpurl.py:692 +#, python-format +msgid "Unsupported content encoding `%(encoding)s'." +msgstr "Content-Encoding `%(encoding)s' wird nicht unterstützt." #: ../linkcheck/checker/nntpurl.py:45 msgid "No NNTP server was specified, skipping this URL." @@ -1176,449 +1018,599 @@ msgid "NNTP server too busy; tried more than %d times." msgstr "NNTP Server zu beschäftigt; habe es mehr als %d mal versucht." -#: ../linkcheck/checker/const.py:104 -msgid "The effective URL is different from the original." -msgstr "Die effektive URL unterscheidet sich vom Original." +#: ../linkcheck/__init__.py:129 +msgid "CRITICAL" +msgstr "KRITISCH" -#: ../linkcheck/checker/const.py:106 -msgid "Could not get the content of the URL." -msgstr "Konnte den Inhalt der URL nicht bekommen." +#: ../linkcheck/__init__.py:130 +msgid "ERROR" +msgstr "FEHLER" -#: ../linkcheck/checker/const.py:107 -msgid "URL anchor was not found." -msgstr "URL Anker wurde nicht gefunden." +#: ../linkcheck/__init__.py:131 +msgid "WARN" +msgstr "WARN" -#: ../linkcheck/checker/const.py:109 -msgid "The warning regular expression was found in the URL contents." -msgstr "Der reguläre Ausdruck für Warnungen wurde in den URL Inhalten gefunden." +#: ../linkcheck/__init__.py:132 +msgid "WARNING" +msgstr "WARNUNG" -#: ../linkcheck/checker/const.py:110 -msgid "The URL content size is too large." -msgstr "Der URL Inhalt ist zu groß." +#: ../linkcheck/__init__.py:133 +msgid "INFO" +msgstr "INFO" -#: ../linkcheck/checker/const.py:111 -msgid "The URL content size is zero." -msgstr "Der URL Inhaltsgrößenangabe ist Null." +#: ../linkcheck/__init__.py:134 +msgid "DEBUG" +msgstr "DEBUG" -#: ../linkcheck/checker/const.py:112 -msgid "The URL content size and download size are unequal." -msgstr "Der URL Inhaltsgrößenangabe und die Download-Größe sind unterschiedlich." +#: ../linkcheck/__init__.py:135 +msgid "NOTSET" +msgstr "NICHTS" -#: ../linkcheck/checker/const.py:113 -msgid "The URL contains leading or trailing whitespace." -msgstr "Die URL %(url)s enthält Leerzeichen am Anfang oder Ende." +#: ../linkcheck/__init__.py:146 +msgid "Running as root user; dropping privileges by changing user to nobody." +msgstr "Laufe als Benutzer root; Privilegien werden aufgegeben indem auf Benutzer nobody gewechselt wird." -#: ../linkcheck/checker/const.py:114 -msgid "The file: URL is missing a trailing slash." -msgstr "Der file: URL fehlt ein abschließender Schrägstrich." +#: ../linkcheck/gui/linkchecker_ui_debug.py:22 +msgid "LinkChecker debug log" +msgstr "LinkChecker Debugausgabe" -#: ../linkcheck/checker/const.py:116 -msgid "The file: path is not the same as the system specific path." -msgstr "Der file: Pfad ist nicht derselbe wie der Systempfad." +#: ../linkcheck/gui/linkchecker_ui_main.py:26 +msgid "LinkChecker" +msgstr "LinkChecker" -#: ../linkcheck/checker/const.py:117 -msgid "The ftp: URL is missing a trailing slash." -msgstr "Der ftp: URL fehlt ein abschließender Schrägstrich." +#: ../linkcheck/gui/linkchecker_ui_main.py:39 +msgid "URL:" +msgstr "URL:" -#: ../linkcheck/checker/const.py:118 -msgid "The http: URL checking has been denied." -msgstr "Die http: URL-Überprüfung wurde verweigert." +#: ../linkcheck/gui/linkchecker_ui_main.py:56 +msgid "Start checking the given URL." +msgstr "Beginne, die gegebene URL zu Prüfen" -#: ../linkcheck/checker/const.py:119 -msgid "The URL has moved permanently." -msgstr "Die URL wurde dauerhaft verschoben." +#: ../linkcheck/gui/linkchecker_ui_main.py:71 +msgid "Active:" +msgstr "Aktiv:" -#: ../linkcheck/checker/const.py:121 -msgid "The URL has been redirected to an URL of a different type." -msgstr "Die URL wurde zu einem anderen URL-Typ umgeleitet." +#: ../linkcheck/gui/linkchecker_ui_main.py:76 +#: ../linkcheck/gui/linkchecker_ui_main.py:85 +#: ../linkcheck/gui/linkchecker_ui_main.py:94 +msgid "0" +msgstr "0" -#: ../linkcheck/checker/const.py:122 -msgid "The URL had no content." -msgstr "Die URL besitzt keinen Inhalt." +#: ../linkcheck/gui/linkchecker_ui_main.py:80 +msgid "Queued:" +msgstr "Wartend:" -#: ../linkcheck/checker/const.py:124 -msgid "An error occurred while storing a cookie." -msgstr "Ein Fehler trat auf während des Speicherns eines Cookies." +#: ../linkcheck/gui/linkchecker_ui_main.py:89 +msgid "Checked:" +msgstr "Geprüft:" -#: ../linkcheck/checker/const.py:126 -msgid "An error occurred while decompressing the URL content." -msgstr "Ein Fehler trat beim Dekomprimieren des URL Inhalts auf." +#: ../linkcheck/gui/linkchecker_ui_main.py:98 +msgid "Info:" +msgstr "Info:" -#: ../linkcheck/checker/const.py:128 -msgid "The URL content is encoded with an unknown encoding." -msgstr "Der URL-Inhalt ist in einer unbekannten Kodierung verfasst." +#: ../linkcheck/gui/linkchecker_ui_main.py:108 +msgid "-" +msgstr "-" -#: ../linkcheck/checker/const.py:130 -msgid "Unsupported HTTP authentication method." -msgstr "Nicht unterstützte HTTP Authentifizierungsmethode." +#: ../linkcheck/gui/linkchecker_ui_main.py:142 +msgid "URL properties" +msgstr "URL Eigenschaften" -#: ../linkcheck/checker/const.py:131 -msgid "The URL has been ignored." -msgstr "Die URL wurde ignoriert." +#: ../linkcheck/gui/linkchecker_ui_main.py:353 +msgid "Check results" +msgstr "Prüfergebnisse" -#: ../linkcheck/checker/const.py:132 -msgid "The mail MX host could not be found." -msgstr "Der MX Mail-Rechner konnte nicht gefunden werden." +#: ../linkcheck/gui/linkchecker_ui_main.py:363 +msgid "Valid URLs" +msgstr "Gültige URLs" -#: ../linkcheck/checker/const.py:134 -msgid "The mailto: address could not be verified." -msgstr "Die mailto: Addresse konnte nicht überprüft werden." +#: ../linkcheck/gui/linkchecker_ui_main.py:387 +msgid "Warnings" +msgstr "Warnungen" -#: ../linkcheck/checker/const.py:136 -msgid "No connection to a MX host could be established." -msgstr "Es konnte keine Verbindung zu einem MX-Rechner hergestellt werden." +#: ../linkcheck/gui/linkchecker_ui_main.py:411 +msgid "Invalid URLs" +msgstr "Ungültige URLs" -#: ../linkcheck/checker/const.py:137 -msgid "No NNTP server was found." -msgstr "Es wurde kein NNTP Server gefunden." +#: ../linkcheck/gui/linkchecker_ui_main.py:436 +msgid "Content type statistics" +msgstr "Inhaltstatistik" -#: ../linkcheck/checker/const.py:138 -msgid "The NNTP newsgroup could not be found." -msgstr "Die NNTP Nachrichtengruppe konnte nicht gefunden werden." +#: ../linkcheck/gui/linkchecker_ui_main.py:446 +msgid "Image" +msgstr "Bild" -#: ../linkcheck/checker/const.py:139 -msgid "The IP is obfuscated." -msgstr "Die IP-Adresse ist verschleiert." +#: ../linkcheck/gui/linkchecker_ui_main.py:470 +msgid "Text" +msgstr "Text" -#: ../linkcheck/checker/mailtourl.py:87 -#, python-format -msgid "No mail addresses found in `%(url)s'." -msgstr "Keine Adressen wurden in `%(url)s' gefunden." +#: ../linkcheck/gui/linkchecker_ui_main.py:494 +msgid "Application" +msgstr "Anwendung" -#: ../linkcheck/checker/mailtourl.py:126 -#, python-format -msgid "Error parsing CGI values: %s" -msgstr "Fehler beim Parsen der CGI-Werte: %s" +#: ../linkcheck/gui/linkchecker_ui_main.py:518 +msgid "Audio" +msgstr "Audio" -#: ../linkcheck/checker/mailtourl.py:149 -#, python-format -msgid "Mail address `%(addr)s' too long. Allowed 256 chars, was %(length)d chars." -msgstr "E-Mail-Adresse `%(addr)s' ist zu lang. Erlaubt sind 256 Zeichen, es waren aber %(length)d Zeichen." +#: ../linkcheck/gui/linkchecker_ui_main.py:542 +msgid "Video" +msgstr "Video" + +#: ../linkcheck/gui/linkchecker_ui_main.py:580 +msgid "Other" +msgstr "Andere" + +#: ../linkcheck/gui/linkchecker_ui_main.py:604 +msgid "Mail" +msgstr "E-Mail" + +#: ../linkcheck/gui/linkchecker_ui_main.py:615 +msgid "URL statistics" +msgstr "URL Statistik" + +#: ../linkcheck/gui/linkchecker_ui_main.py:625 +msgid "Min. length" +msgstr "Min. Länge" + +#: ../linkcheck/gui/linkchecker_ui_main.py:649 +msgid "Avg. length" +msgstr "Durchschn. Länge" + +#: ../linkcheck/gui/linkchecker_ui_main.py:673 +msgid "Max. length" +msgstr "Max. Länge" + +#: ../linkcheck/gui/linkchecker_ui_main.py:697 +msgid "Domains" +msgstr "Domains" + +#: ../linkcheck/gui/linkchecker_ui_main.py:723 +msgid "&Edit" +msgstr "&Bearbeiten" + +#: ../linkcheck/gui/linkchecker_ui_main.py:726 +#: ../linkcheck/gui/linkchecker_ui_editor.py:34 +msgid "&File" +msgstr "&Datei" + +#: ../linkcheck/gui/linkchecker_ui_main.py:729 +#: ../linkcheck/gui/linkchecker_ui_main.py:746 +msgid "&Help" +msgstr "&Hilfe" + +#: ../linkcheck/gui/linkchecker_ui_main.py:739 +msgid "A&bout" +msgstr "Ü&ber" + +#: ../linkcheck/gui/linkchecker_ui_main.py:740 +msgid "About" +msgstr "Über" + +#: ../linkcheck/gui/linkchecker_ui_main.py:747 +msgid "Help" +msgstr "Hilfe" + +#: ../linkcheck/gui/linkchecker_ui_main.py:753 +msgid "View online" +msgstr "Online anschauen" + +#: ../linkcheck/gui/linkchecker_ui_main.py:754 +msgid "View URL online" +msgstr "URL Online anschauen" + +#: ../linkcheck/gui/linkchecker_ui_main.py:760 +msgid "&Options" +msgstr "&Optionen" + +#: ../linkcheck/gui/linkchecker_ui_main.py:761 +#: /usr/lib/python2.7/optparse.py:1626 +msgid "Options" +msgstr "Optionen" + +#: ../linkcheck/gui/linkchecker_ui_main.py:767 +msgid "Copy to clipboard" +msgstr "URL kopieren" + +#: ../linkcheck/gui/linkchecker_ui_main.py:768 +msgid "Copy URL to clipboard" +msgstr "URL in die Zwischenablage kopieren" + +#: ../linkcheck/gui/linkchecker_ui_main.py:769 +msgid "Ctrl+C" +msgstr "Strg+C" + +#: ../linkcheck/gui/linkchecker_ui_main.py:773 +msgid "View parent online" +msgstr "Vater-URL Online anschauen" + +#: ../linkcheck/gui/linkchecker_ui_main.py:774 +msgid "View parent URL online" +msgstr "Vater-URL Online anschauen" + +#: ../linkcheck/gui/linkchecker_ui_main.py:778 +msgid "View parent source" +msgstr "Quellcode der Vater-URL anzeigen" + +#: ../linkcheck/gui/linkchecker_ui_main.py:779 +msgid "View parent URL source" +msgstr "Quellcode der Vater-URL anzeigen" + +#: ../linkcheck/gui/linkchecker_ui_main.py:782 +msgid "Show debug" +msgstr "Zeige Debug" + +#: ../linkcheck/gui/linkchecker_ui_main.py:785 +msgid "View properties" +msgstr "Eigenschaften anschauen" + +#: ../linkcheck/gui/linkchecker_ui_main.py:786 +msgid "View URL properties" +msgstr "URL Eigenschaften anschauen" -#: ../linkcheck/checker/mailtourl.py:153 -#, python-format -msgid "Missing `@' in mail address `%(addr)s'." -msgstr "Fehlendes `@' in E-Mail-Adresse `%(addr)s'." +#: ../linkcheck/gui/linkchecker_ui_main.py:792 +msgid "&Save results..." +msgstr "Ergebnisse &speichern..." -#: ../linkcheck/checker/mailtourl.py:159 -#, python-format -msgid "Missing local part of mail address `%(addr)s'." -msgstr "Fehlender lokaler Teil der E-Mail-Adresse `%(addr)s'." +#: ../linkcheck/gui/linkchecker_ui_main.py:793 +#: ../linkcheck/gui/linkchecker_ui_editor.py:50 +msgid "Ctrl+S" +msgstr "Strg+S" -#: ../linkcheck/checker/mailtourl.py:163 -#, python-format -msgid "Missing domain part of mail address `%(addr)s'." -msgstr "Fehlender Domänen-Teil der E-Mail-Adresse `%(addr)s'." +#: ../linkcheck/gui/linkchecker_ui_main.py:799 +msgid "&Quit" +msgstr "&Beenden" -#: ../linkcheck/checker/mailtourl.py:167 -#, python-format -msgid "Local part of mail address `%(addr)s' too long. Allowed 64 chars, was %(length)d chars." -msgstr "Lokaler Teil der E-Mail-Adresse `%(addr)s' ist zu lang. Erlaubt sind 64 Zeichen, es waren aber %(length)d Zeichen." +#: ../linkcheck/gui/linkchecker_ui_main.py:800 +msgid "Ctrl+Q" +msgstr "Strg+Q" -#: ../linkcheck/checker/mailtourl.py:171 -#, python-format -msgid "Domain part of mail address `%(addr)s' too long. Allowed 255 chars, was %(length)d chars." -msgstr "Domänen-Teil der E-Mail-Adresse `%(addr)s' ist zu lang. Erlaubt sind 255 Zeichen, es waren aber %(length)d Zeichen." +#: ../linkcheck/gui/linkchecker_ui_main.py:803 +msgid "Check for updates" +msgstr "Prüfe auf Updates" -#: ../linkcheck/checker/mailtourl.py:180 -#, python-format -msgid "Unquoted double quote or backslash in mail address `%(addr)s'." -msgstr "Nicht kodiertes doppeltes Anführungszeichen oder Escape in E-Mail-Adresse `%(addr)s'." +#: ../linkcheck/gui/linkchecker_ui_main.py:806 +msgid "Donate" +msgstr "Spenden" -#: ../linkcheck/checker/mailtourl.py:185 -#, python-format -msgid "Local part of mail address `%(addr)s' may not start with a dot." -msgstr "Der lokale Teil der E-Mail-Adresse `%(addr)s' darf nicht mit einem Punkt beginnen." +#: ../linkcheck/gui/editor.py:104 +msgid "Save file?" +msgstr "Datei speichern?" -#: ../linkcheck/checker/mailtourl.py:189 -#, python-format -msgid "Local part of mail address `%(addr)s' may not end with a dot." -msgstr "Der lokale Teil der E-Mail-Adresse `%(addr)s' darf nicht mit einem Punkt enden." +#: ../linkcheck/gui/editor.py:105 +msgid "The document has been modified." +msgstr "Das Dokument wurde verändert." -#: ../linkcheck/checker/mailtourl.py:193 -#, python-format -msgid "Local part of mail address `%(addr)s' may not contain two dots." -msgstr "Der lokale Teil der E-Mail-Adresse `%(addr)s' darf nicht zwei Punkte beinhalten." +#: ../linkcheck/gui/editor.py:106 +msgid "Do you want to save your changes?" +msgstr "Wollen Sie Ihre Änderungen speichern?" -#: ../linkcheck/checker/mailtourl.py:198 -#, python-format -msgid "Local part of mail address `%(addr)s' contains unquoted character `%(char)s." -msgstr "Lokaler Teil der E-Mail-Adresse `%(addr)s' beinhaltet ein nicht kodiertes Zeichen `%(char)s." +#: ../linkcheck/gui/editor.py:115 +msgid "Save File As" +msgstr "Speichern unter" -#: ../linkcheck/checker/mailtourl.py:210 -#, python-format -msgid "Domain part of mail address `%(addr)s' has invalid IP." -msgstr "Domänen-Teil der E-Mail-Adresse `%(addr)s' besitzt eine ungültige IP-Adresse." +#: ../linkcheck/gui/editor.py:158 +msgid "readonly" +msgstr "nur lesen" -#: ../linkcheck/checker/mailtourl.py:216 +#: ../linkcheck/gui/updater.py:40 #, python-format -msgid "Invalid domain part of mail address `%(addr)s'." -msgstr "Ungültige Domänen-Teil der E-Mail-Adresse `%(addr)s'." +msgid "%(app)s update information" +msgstr "%(app)s Update-Informationen" -#: ../linkcheck/checker/mailtourl.py:220 -#, python-format -msgid "Invalid top level domain part of mail address `%(addr)s'." -msgstr "Ungültige Toplevel-Domänen-Teil der E-Mail-Adresse `%(addr)s'." +#: ../linkcheck/gui/updater.py:50 +msgid "Checking for updates..." +msgstr "Suche nach Updates..." -#: ../linkcheck/checker/mailtourl.py:258 +#: ../linkcheck/gui/updater.py:58 #, python-format -msgid "No MX mail host for %(domain)s found." -msgstr "Kein MX mail host für %(domain)s gefunden." +msgid "Congratulations: the latest version %(app)s is installed." +msgstr "Gratulation: die aktuellste Version %(app)s ist installiert." -#: ../linkcheck/checker/mailtourl.py:266 +#: ../linkcheck/gui/updater.py:65 #, python-format -msgid "No host for %(domain)s found." -msgstr "Kein Rechner für %(domain)s gefunden." +msgid "Detected local or development version %(currentversion)s. Available version of %(app)s is %(version)s." +msgstr "Lokale oder Entwicklerversion %(currentversion)s entdeckt. Verfügbare Version von %(app)s ist %(version)s." -#: ../linkcheck/checker/mailtourl.py:280 +#: ../linkcheck/gui/updater.py:69 #, python-format -msgid "Got invalid DNS answer %(answer)s for %(domain)s." -msgstr "Ungültige DNS Antwort %(answer)s für %(domain)s erhalten." +msgid "A new version %(version)s of %(app)s is available for download." +msgstr "Eine neue Version %(version)s von %(app)s ist verfügbar als Download." -#: ../linkcheck/checker/mailtourl.py:324 -#, python-format -msgid "Verified address %(mail)s: %(info)s." -msgstr "Gültige Adresse %(mail)s: %(info)s." +#: ../linkcheck/gui/updater.py:77 +msgid "update thread has been terminated" +msgstr "der Update-Thread wurde beendet" -#: ../linkcheck/checker/mailtourl.py:328 +#: ../linkcheck/gui/updater.py:79 #, python-format -msgid "Unverified but presumably valid address %(mail)s: %(info)s." -msgstr "Unverifizierte aber wahrscheinlich gültige Adresse %(mail)s: %(info)s." +msgid "An error occured while checking for an update of %(app)s: %(error)s." +msgstr "Ein Fehler ist während der Update-Prüfung von %(app)s aufgetreten: %(error)s." -#: ../linkcheck/checker/mailtourl.py:331 +#: ../linkcheck/gui/lineedit.py:175 #, python-format -msgid "Unverified address: %(info)s." -msgstr "Unverifizierte Adresse: %(info)s." +msgid "Insert %(browser)s bookmark file" +msgstr "%(browser)s Favoritendatei einfügen" -#: ../linkcheck/checker/mailtourl.py:335 -#, python-format -msgid "MX mail host %(host)s did not accept connections: %(error)s." -msgstr "Der MX mail host %(host)s akzeptierte keine SMTP Verbindungen: %(error)s." +#: ../linkcheck/gui/options.py:104 +#: ../linkcheck/gui/linkchecker_ui_options.py:123 +msgid "Edit" +msgstr "Bearbeiten" -#: ../linkcheck/checker/mailtourl.py:341 -msgid "Could not connect, but syntax is correct" -msgstr "Konnte nicht konnektieren, aber die Syntax ist korrekt" +#: ../linkcheck/gui/options.py:106 +msgid "Read" +msgstr "Lesen" -#: ../linkcheck/checker/mailtourl.py:344 -#, python-format -msgid "Found MX mail host %(host)s" -msgstr "MX Mail host %(host)s gefunden" +#: ../linkcheck/gui/options.py:109 +msgid "File not found" +msgstr "Datei nicht gefunden" -#: ../linkcheck/checker/httpurl.py:136 -msgid "Access denied by robots.txt, skipping content checks." -msgstr "Zugriff verweigert durch robots.txt; lasse das Prüfen des URL Inhalts aus." +#: ../linkcheck/gui/urlmodel.py:22 +msgid "Parent" +msgstr "Vater" -#: ../linkcheck/checker/httpurl.py:143 -msgid "Amazon servers block HTTP HEAD requests." -msgstr "Amazon Server blockieren HTTP HEAD Anfragen." +#: ../linkcheck/gui/urlsave.py:21 +msgid "HTML output (*.html)" +msgstr "HTML Ausgabe (*.html)" -#: ../linkcheck/checker/httpurl.py:145 -msgid "Using GET method for Amazon server." -msgstr "Benutze die GET-Methode für Amazon-Server." +#: ../linkcheck/gui/urlsave.py:22 +msgid "Text output (*.txt)" +msgstr "Text Ausgabe (*.txt)" -#: ../linkcheck/checker/httpurl.py:152 -msgid "unknown" -msgstr "unbekannt" +#: ../linkcheck/gui/urlsave.py:23 +msgid "XML output (*.xml)" +msgstr "XML Ausgabe (*.xml)" -#: ../linkcheck/checker/httpurl.py:154 -#, python-format -msgid "Server `%(name)s' did not support HEAD request; a GET request was used instead." -msgstr "Server `%(name)s' unterstützte keine HEAD Anfrage; eine GET Anfrage wurde stattdessen verwendet." +#: ../linkcheck/gui/urlsave.py:24 +msgid "CSV output (*.csv)" +msgstr "CSV Ausgabe (*.csv)" -#: ../linkcheck/checker/httpurl.py:205 -#, python-format -msgid "Enforced proxy `%(name)s'." -msgstr "Erzwungener Proxy `%(name)s'." +#: ../linkcheck/gui/urlsave.py:57 +msgid "Save check results" +msgstr "Prüfergebnisse speichern" -#: ../linkcheck/checker/httpurl.py:210 -#, python-format -msgid "Enforced proxy `%(name)s' ignored, aborting." -msgstr "Erzwungener Proxy `%(name)s' wurde ignoriert, breche ab." +#: ../linkcheck/gui/linkchecker_ui_editor.py:27 +msgid "LinkChecker source view" +msgstr "LinkChecker Quellcodeanzeige" -#: ../linkcheck/checker/httpurl.py:241 -#, python-format -msgid "more than %d redirections, aborting" -msgstr "mehr als %d Weiterleitungen, breche ab" +#: ../linkcheck/gui/linkchecker_ui_editor.py:49 +msgid "&Save" +msgstr "&Speichern" -#: ../linkcheck/checker/httpurl.py:251 -#, python-format -msgid "Unsupported HTTP authentication `%(auth)s', only `Basic' authentication is supported." -msgstr "Nicht unterstützte HTTP Authentifizierungsmethode `%(auth)s', nur `Basic' Authentifizierung ist unterstützt." +#: ../linkcheck/gui/__init__.py:145 +#: ../linkcheck/gui/__init__.py:456 +msgid "Ready." +msgstr "Bereit." -#: ../linkcheck/checker/httpurl.py:315 -#, python-format -msgid "Redirected to `%(url)s'." -msgstr "Zu `%(url)s' umgeleitet." +#: ../linkcheck/gui/__init__.py:172 +msgid "Check finished." +msgstr "Prüfung beendet." -#: ../linkcheck/checker/httpurl.py:355 -#, python-format -msgid "Redirection to url `%(newurl)s' is not allowed." -msgstr "Umleitung zu `%(newurl)s' ist nicht erlaubt." +#: ../linkcheck/gui/__init__.py:272 +msgid "Start" +msgstr "Start" -#: ../linkcheck/checker/httpurl.py:378 -msgid "The redirected URL is outside of the domain filter, checked only syntax." -msgstr "Die Weiterleitungs-URL ist außerhalb des Domain Filters; prüfe lediglich Syntax." +#: ../linkcheck/gui/__init__.py:297 +msgid "Stop" +msgstr "Anhalten" -#: ../linkcheck/checker/httpurl.py:391 -msgid "Access to redirected URL denied by robots.txt, checked only syntax." -msgstr "Zugriff zur Weiterleitungs-URL verweigert durch robots.txt; prüfe lediglich Syntax." +#: ../linkcheck/gui/__init__.py:345 +#, python-format +msgid "About %(appname)s" +msgstr "Über %(appname)s" -#: ../linkcheck/checker/httpurl.py:409 +#: ../linkcheck/gui/__init__.py:346 #, python-format msgid "" -"recursive redirection encountered:\n" -" %(urls)s" +"
\n" +"

%(app)s

\n" +"

Released on %(releasedate)s\n" +"

Python: %(pyver)s
\n" +"%(modules)s\n" +"

%(copyright)s\n" +"
%(appname)s is licensed under the\n" +"GPL\n" +"Version 2 or later.\n" +"

If you like %(appname)s, consider one of several ways to\n" +"donate. Thanks!\n" +"

" msgstr "" -"Rekursive Weiterleitung entdeckt:\n" -" %(urls)s" - -#: ../linkcheck/checker/httpurl.py:426 -#, python-format -msgid "Redirection to URL `%(newurl)s' with different scheme found; the original URL was `%(url)s'." -msgstr "Weiterleitung zu URL `%(newurl)s' mit anderem Schema gefunden; die Original-URL war `%(url)s'." +"
\n" +"

%(app)s

\n" +"

Veröffentlicht am %(releasedate)s\n" +"

Python: %(pyver)s
\n" +"%(modules)s\n" +"

%(copyright)s\n" +"

%(appname)s ist lizensiert unter der\n" +"GPL\n" +"Version 2 oder später.\n" +"

Falls Ihnen %(appname)s gefällt, können Sie mehrere Arten einer\n" +"Spende in Betracht ziehen. Vielen Dank!\n" +"" -#: ../linkcheck/checker/httpurl.py:438 -msgid "HTTP 301 (moved permanent) encountered: you should update this link." -msgstr "HTTP 301 (moved permanent) gefunden: sie sollten diesen Link aktualisieren." +#: ../linkcheck/gui/__init__.py:391 +msgid "Closing pending connections..." +msgstr "Schließe aktuelle Verbindungen..." -#: ../linkcheck/checker/httpurl.py:467 -#, python-format -msgid "Sent Cookie: %(cookie)s." -msgstr "Gesendetes Cookie: %(cookie)s." +#: ../linkcheck/gui/__init__.py:425 +msgid "Error, empty URL" +msgstr "Fehler, leere URL" -#: ../linkcheck/checker/httpurl.py:473 +#: ../linkcheck/gui/__init__.py:427 #, python-format -msgid "Could not store cookies from headers: %(error)s." -msgstr "Konnte Cookies nicht aus Kopfdaten speichern: %(error)s." +msgid "Checking '%s'." +msgstr "Prüfe '%s'" -#: ../linkcheck/checker/httpurl.py:482 +#: ../linkcheck/gui/__init__.py:433 #, python-format -msgid "Last modified %(date)s." -msgstr "Letzte Änderung %(date)s." +msgid "Error, invalid URL `%s'." +msgstr "Fehler, ungültige URL `%s'." -#: ../linkcheck/checker/httpurl.py:631 +#: ../linkcheck/gui/__init__.py:453 #, python-format -msgid "Unsupported HTTP url scheme `%(scheme)s'" -msgstr "Nicht unterstütztes HTTP URL Schema `%(scheme)s'" +msgid "%d URL selected." +msgid_plural "%d URLs selected" +msgstr[0] "%4d Verknüpfung ausgewählt" +msgstr[1] "%4d Verknüpfungen ausgewählt" -#: ../linkcheck/checker/httpurl.py:676 -#, python-format -msgid "Decompress error %(err)s" -msgstr "Entkomprimierungsfehler %(err)s" +#: ../linkcheck/gui/__init__.py:533 +msgid "LinkChecker internal error" +msgstr "LinkChecker interner Fehler" -#: ../linkcheck/checker/httpurl.py:692 -#, python-format -msgid "Unsupported content encoding `%(encoding)s'." -msgstr "Content-Encoding `%(encoding)s' wird nicht unterstützt." +#: ../linkcheck/gui/linkchecker_ui_options.py:22 +msgid "Dialog" +msgstr "Dialog" -#: ../linkcheck/__init__.py:129 -msgid "CRITICAL" -msgstr "KRITISCH" +#: ../linkcheck/gui/linkchecker_ui_options.py:26 +#: ../linkchecker:439 +msgid "Checking options" +msgstr "Prüf-Optionen" -#: ../linkcheck/__init__.py:130 -msgid "ERROR" -msgstr "FEHLER" +#: ../linkcheck/gui/linkchecker_ui_options.py:36 +#: ../linkcheck/gui/linkchecker_ui_options.py:47 +msgid "Check recursively all links up to given depth. A negative depth will enable infinite recursion." +msgstr "" +"Prüfe rekursiv alle Verknüpfungen bis zu der angegebenen Tiefe. Eine\n" +"negative Tiefe erwirkt unendliche Rekursion." -#: ../linkcheck/__init__.py:131 -msgid "WARN" -msgstr "WARN" +#: ../linkcheck/gui/linkchecker_ui_options.py:37 +msgid "Recursive depth" +msgstr "Rekursionstiefe" -#: ../linkcheck/__init__.py:132 -msgid "WARNING" -msgstr "WARNUNG" +#: ../linkcheck/gui/linkchecker_ui_options.py:54 +#: ../linkcheck/gui/linkchecker_ui_options.py:60 +msgid "Log all checked URLs once. Default is to log only errors and warnings." +msgstr "Gebe alle URLs aus. Standard ist es, nur fehlerhafte URLs und Warnungen auszugeben." -#: ../linkcheck/__init__.py:133 -msgid "INFO" -msgstr "INFO" +#: ../linkcheck/gui/linkchecker_ui_options.py:55 +msgid "Verbose output" +msgstr "Ausführliche Ausgabe" -#: ../linkcheck/__init__.py:134 -msgid "DEBUG" -msgstr "DEBUG" +#: ../linkcheck/gui/linkchecker_ui_options.py:65 +msgid "Debug" +msgstr "Debug" -#: ../linkcheck/__init__.py:135 -msgid "NOTSET" -msgstr "NICHTS" +#: ../linkcheck/gui/linkchecker_ui_options.py:76 +msgid "Warn when one of these strings are found (one per line):" +msgstr "Warne wenn einer dieser Zeichenketten gefunden wurde (eine pro Zeile):" + +#: ../linkcheck/gui/linkchecker_ui_options.py:84 +msgid "Ignore URLs matching one of these patterns (one per line):" +msgstr "Ignoriere URLs die auf einen dieser Ausdrücke passen (einer pro Zeile):" -#: ../linkcheck/__init__.py:146 -msgid "Running as root user; dropping privileges by changing user to nobody." -msgstr "Laufe als Benutzer root; Privilegien werden aufgegeben indem auf Benutzer nobody gewechselt wird." +#: ../linkcheck/gui/linkchecker_ui_options.py:93 +msgid "Configuration file" +msgstr "Konfigurationsdatei" -#: ../linkcheck/configuration/confparse.py:57 -#, python-format -msgid "Error parsing configuration: %s" -msgstr "Fehler beim Parsen der Konfiguration: %s" +#: ../linkcheck/gui/linkchecker_ui_options.py:98 +msgid "The configuration file holds advanced options and can be edited with an integrated text editor." +msgstr "Die Konfigurationsdatei enthält fortgeschrittene Optionen und kann mit einem integrierten Texteditor bearbeitet werden." -#: ../linkcheck/configuration/confparse.py:116 -#, python-format -msgid "invalid negative value for timeout: %d\n" -msgstr "ungültiger negativer Wert für timeout: %d\n" +#: ../linkcheck/gui/linkchecker_ui_options.py:110 +msgid "Overrides system wide configuration file settings." +msgstr "Überschreibt systemweite Konfiguration." -#: ../linkcheck/configuration/confparse.py:168 -#, python-format -msgid "missing auth part in entry %(val)r" -msgstr "fehlende Authentifizierung in entry %(val)r" +#: ../linkcheck/gui/linkchecker_ui_options.py:113 +msgid "/home/user/.linkchecker/linkcheckerrc" +msgstr "/home/user/.linkchecker/linkcheckerrc" -#: ../linkcheck/configuration/confparse.py:174 -#, python-format -msgid "invalid login URL `%s'. Only HTTP and HTTPS URLs are supported." -msgstr "ungültige Login URL `%s'. Nur HTTP und HTTPS URLs sind unterstützt." +#: ../linkcheck/gui/linkchecker_ui_options.py:135 +msgid "Close" +msgstr "Schließen" -#: ../linkcheck/configuration/__init__.py:290 -msgid "warning: missing user or URL pattern in authentication data." -msgstr "Warnung: Fehlende Benutzer oder regulärer URL Ausdruck in Authentifizierungsdaten." +#: ../linkcheck/lc_cgi.py:90 +#, python-format +msgid "URL has unparsable domain name: %s" +msgstr "URL besitzt einen nicht analysierbaren Rechnernamen: %s" -#: ../linkcheck/configuration/__init__.py:340 -msgid "warning: activating text logger output." -msgstr "Warnung: aktiviere text Loggerausgabe." +#: ../linkcheck/lc_cgi.py:113 +msgid "unsupported language" +msgstr "nicht unterstützte Sprache" -#: ../linkcheck/configuration/__init__.py:366 -msgid "warning: Clamav could not be initialized" -msgstr "Warnung: Clamav konnte nicht initialisiert werden" +#: ../linkcheck/lc_cgi.py:118 +msgid "empty url was given" +msgstr "leere URL wurde angegeben" -#: ../linkcheck/configuration/__init__.py:372 -msgid "warning: activating sendcookies because storecookies is active." -msgstr "Warnung: aktiviere Option sendcookies weil Option storecookes aktiviert ist." +#: ../linkcheck/lc_cgi.py:120 +msgid "disallowed url was given" +msgstr "eine ungültige URL wurde angegeben" -#: ../linkcheck/configuration/__init__.py:382 -msgid "warning: no CGI password fieldname given for login URL." -msgstr "Warnung: kein CGI Passwort Feldname für Login URL angegeben." +#: ../linkcheck/lc_cgi.py:122 +msgid "no url was given" +msgstr "keine URL wurde angegeben" -#: ../linkcheck/configuration/__init__.py:386 -msgid "warning: no CGI user fieldname given for login URL." -msgstr "Warnung: kein CGI Benutzer Feldname für Login URL angegeben." +#: ../linkcheck/lc_cgi.py:127 +msgid "invalid recursion level" +msgstr "ungültiger Rekursionslevel" -#: ../linkcheck/configuration/__init__.py:390 -msgid "warning: no user/password authentication data found for login URL." -msgstr "Warnung: keine Benutzer/Passwort-Authentifizierung für Login URL gefunden." +#: ../linkcheck/lc_cgi.py:132 +#, python-format +msgid "invalid %s option syntax" +msgstr "ungültige Option %s" -#: ../linkcheck/configuration/__init__.py:393 -msgid "warning: login URL is not a HTTP URL." -msgstr "Warnung: Login URL ist keine HTTP URL." +#: ../linkcheck/lc_cgi.py:154 +#, python-format +msgid "" +"\n" +"\n" +"LinkChecker Online Error\n" +"\n" +"

\n" +"Error: %s
\n" +"The LinkChecker Online script has encountered an error. Please ensure\n" +"that your provided URL link begins with http:// and\n" +"contains only these characters: A-Za-z0-9./_~-

\n" +"Errors are logged.\n" +"
\n" +"\n" +"" +msgstr "" +"\n" +"\n" +"LinkChecker Online Fehler\n" +"
Fehler: %s
Das LinkChecker Online Skript ist\n" +"auf einen Fehler gestoßen. Bitte stellen Sie sicher, daß die\n" +"angegebene URL mit http:// beginnt und nur diese Zeichen\n" +"enthält: A-Za-z0-9./_~-

Fehler werden geloggt.\n" +"
" -#: ../linkcheck/configuration/__init__.py:397 -msgid "warning: login URL is incomplete." -msgstr "Warnung: Login URL ist unvollständig." +#: ../linkcheck/strformat.py:230 +#, python-format +msgid "%(prefix)s%(duration).02f seconds" +msgstr "%(prefix)s%(duration).02f Sekunden" -#: ../linkcheck/configuration/__init__.py:401 +#: ../linkcheck/strformat.py:233 #, python-format -msgid "warning: disabling login URL %(url)s." -msgstr "Warnung: deaktiviere Login URL %(url)s." +msgid "%d second" +msgid_plural "%d seconds" +msgstr[0] "%d Sekunde" +msgstr[1] "%d Sekunden" -#: ../linkcheck/clamav.py:56 -msgid "clamd is not ready for stream scanning" -msgstr "clamd ist nicht bereit, einen Stream zu prüfen" +#: ../linkcheck/strformat.py:234 +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d Minute" +msgstr[1] "%d Minuten" -#: ../linkcheck/clamav.py:126 -msgid "ScannerDaemonOutputFormat must be disabled" -msgstr "ScannerDaemonOutputFormat muss deaktiviert sein" +#: ../linkcheck/strformat.py:235 +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d Stunde" +msgstr[1] "%d Stunden" -#: ../linkcheck/clamav.py:128 -msgid "only one of TCPSocket and LocalSocket must be enabled" -msgstr "nur einer von TCPSocket oder LocalSocket muss aktiviert sein" +#: ../linkcheck/strformat.py:236 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d Tag" +msgstr[1] "%d Tage" -#: ../linkcheck/clamav.py:157 -msgid "one of TCPSocket or LocalSocket must be enabled" -msgstr "einer von TCPSocket oder LocalSocket muss aktiviert sein" +#: ../linkcheck/strformat.py:237 +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d Jahr" +msgstr[1] "%d Jahre" #: ../linkchecker:53 msgid "USAGE\tlinkchecker [options] [file-or-url]...\n" @@ -1929,11 +1921,11 @@ msgid "Syntax error in %(arg)r: %(msg)s" msgstr "Syntaxfehler in %(arg)r: %(msg)s" -#: ../linkchecker:322 +#: ../linkchecker:323 msgid "General options" msgstr "Allgemeine Optionen" -#: ../linkchecker:326 +#: ../linkchecker:327 msgid "" "Use FILENAME as configuration file. Per default LinkChecker first\n" "searches /etc/linkchecker/linkcheckerrc and then ~/.linkchecker/linkcheckerrc\n" @@ -1943,35 +1935,29 @@ " LinkChecker zuerst /etc/linkchecker/linkcheckerrc und dann ~/.linkchecker/linkcheckerrc\n" "(unter Windows \\linkcheckerrc)." -#: ../linkchecker:332 -#: ../linkchecker:340 -#: ../linkchecker:346 -msgid "This option is deprecated and does nothing." -msgstr "Diese Option ist veraltet und bewirkt nichts." - -#: ../linkchecker:336 +#: ../linkchecker:333 msgid "" "Generate no more than the given number of threads. Default number\n" "of threads is 10. To disable threading specify a non-positive number." msgstr "Generiere nicht mehr als die angegebene Anzahl von Threads. Standard Anzahl von Threads ist 10. Geben Sie eine negative Zahl an, um Threading zu deaktivieren." -#: ../linkchecker:342 +#: ../linkchecker:336 msgid "Print version and exit." msgstr "Drucke die Version und beende das Programm." -#: ../linkchecker:349 +#: ../linkchecker:339 msgid "Read list of white-space separated URLs to check from stdin." msgstr "Lese eine Liste von URLs zum Prüfen von der Standardeingabe, getrennt durch Leerzeichen." -#: ../linkchecker:353 +#: ../linkchecker:343 msgid "Output options" msgstr "Ausgabeoptionen" -#: ../linkchecker:356 +#: ../linkchecker:346 msgid "Log all URLs. Default is to log only errors and warnings." msgstr "Logge alle URLs. Standard ist es, nur fehlerhafte URLs zu loggen." -#: ../linkchecker:358 +#: ../linkchecker:348 msgid "" "Log all URLs, including duplicates.\n" "Default is to log duplicate URLs only once." @@ -1979,11 +1965,11 @@ "Logge alle URLs, inklusive Duplikate.\n" "Standard ist, doppelte URLs nur einmal zu loggen." -#: ../linkchecker:361 +#: ../linkchecker:351 msgid "Don't log warnings. Default is to log warnings." msgstr "Gebe keine Warnungen aus. Standard ist die Ausgabe von Warnungen." -#: ../linkchecker:365 +#: ../linkchecker:355 msgid "" "Define a regular expression which prints a warning if it matches\n" "any content of the checked link. This applies only to valid pages,\n" @@ -2006,7 +1992,7 @@ "Man beachte, dass mehrere Werte in dem regulären Ausdruck kombiniert\n" "werden können, zum Beispiel \"(Diese Seite ist umgezogen|Oracle Applikationsfehler)\"." -#: ../linkchecker:378 +#: ../linkchecker:368 msgid "" "Print a warning if content size info is available and exceeds the\n" "given number of bytes." @@ -2014,27 +2000,27 @@ "Gebe eine Warnung aus wenn die Inhaltsgröße bekannt ist und die\n" "angegebene Anzahl an Bytes übersteigt." -#: ../linkchecker:382 +#: ../linkchecker:372 msgid "Check syntax of HTML URLs with local library (HTML tidy)." msgstr "Prüfe Syntax von HTML URLs mit lokaler Bibliothek (HTML tidy)." -#: ../linkchecker:385 +#: ../linkchecker:375 msgid "Check syntax of HTML URLs with W3C online validator." msgstr "Prüfe Syntax von HTML URLs mit W3C Online Validator." -#: ../linkchecker:388 +#: ../linkchecker:378 msgid "Check syntax of CSS URLs with local library (cssutils)." msgstr "Prüfe Syntax von CSS URLs mit lokaler Bibliothek (cssutils)." -#: ../linkchecker:391 +#: ../linkchecker:381 msgid "Check syntax of CSS URLs with W3C online validator." msgstr "Prüfe Syntax von CSS URLs mit W3C Online Validator." -#: ../linkchecker:394 +#: ../linkchecker:384 msgid "Scan content of URLs with ClamAV virus scanner." msgstr "Prüfe Inhalt von URLs mit dem ClamAV Antivirus Programm." -#: ../linkchecker:397 +#: ../linkchecker:387 msgid "" "Quiet operation, an alias for '-o none'.\n" "This is only useful with -F." @@ -2042,7 +2028,7 @@ "Keine Ausgabe, ein Alias für '-o none'.\n" "Dies ist nur in Verbindung mit -F nützlich." -#: ../linkchecker:402 +#: ../linkchecker:392 #, python-format msgid "" "Specify output as %(loggertypes)s. Default output type is text.\n" @@ -2054,7 +2040,7 @@ "Enkodierung der ausgewählten Spracheinstellung.\n" "Gültige Enkodierungen sind unter http://docs.python.org/lib/standard-encodings.html aufgeführt." -#: ../linkchecker:411 +#: ../linkchecker:401 #, python-format msgid "" "Output to a file linkchecker-out.TYPE, $HOME/.linkchecker/blacklist for\n" @@ -2082,11 +2068,11 @@ "Standard ist keine Dateiausgabe. Beachten Sie dass die Option\n" "'-o none' jegliche Ausgaben auf der Konsole verhindert." -#: ../linkchecker:425 +#: ../linkchecker:415 msgid "Do not print check status messages." msgstr "Gebe keine Statusmeldungen aus." -#: ../linkchecker:428 +#: ../linkchecker:418 #, python-format msgid "" "Print debugging output for the given logger.\n" @@ -2106,11 +2092,11 @@ "\n" "Für exakte Resultate wird Threading während Debugläufen deaktiviert." -#: ../linkchecker:437 +#: ../linkchecker:427 msgid "Print tracing information." msgstr "Trace-Information ausgeben." -#: ../linkchecker:440 +#: ../linkchecker:430 #, python-format msgid "" "Write profiling data into a file named %s in the\n" @@ -2120,15 +2106,11 @@ "aktuellen Arbeitsverzeichnis.\n" "Siehe auch --viewprof." -#: ../linkchecker:444 +#: ../linkchecker:434 msgid "Print out previously generated profiling data. See also --profile." msgstr "Gebe vorher generierte Profiling-Daten aus. Siehe auch --profile." -#: ../linkchecker:449 -msgid "Checking options" -msgstr "Prüf-Optionen" - -#: ../linkchecker:453 +#: ../linkchecker:443 msgid "" "Check recursively all links up to given depth. A negative depth\n" "will enable infinite recursion. Default depth is infinite." @@ -2137,19 +2119,19 @@ "negative Tiefe erwirkt unendliche Rekursion. Standard Tiefe ist\n" "unendlich." -#: ../linkchecker:458 +#: ../linkchecker:448 msgid "" "Check but do not recurse into URLs matching the given regular\n" "expression. This option can be given multiple times." msgstr "Prüfe URLs die auf den angegebenen regulären Ausdruck zutreffen, aber steige nicht rekursiv in sie hinab. Diese Option kann mehrmals angegeben werden." -#: ../linkchecker:463 +#: ../linkchecker:453 msgid "" "Only check syntax of URLs matching the given regular expression.\n" " This option can be given multiple times." msgstr "Prüfe lediglich den Syntax der URLs, welche auf den angegebenen regulären Ausdruck zutreffen. Diese Option kann mehrmals angegebenen werden." -#: ../linkchecker:467 +#: ../linkchecker:457 msgid "" "Accept and send HTTP cookies according to RFC 2109. Only cookies\n" "which are sent back to the originating server are accepted.\n" @@ -2162,7 +2144,7 @@ "Gesendete und akzeptierte Cookies werden als zusätzlich geloggte\n" "Information aufgeführt." -#: ../linkchecker:474 +#: ../linkchecker:464 msgid "" "Read a file with initial cookie data. The cookie data format is\n" "explained below." @@ -2170,7 +2152,7 @@ "Lese eine Datei mit Cookie-Daten. Das Datenformat\n" "ist weiter unten erklärt." -#: ../linkchecker:478 +#: ../linkchecker:468 msgid "" "Check HTTP anchor references. Default is not to check anchors.\n" "This option enables logging of the warning 'url-anchor-not-found'." @@ -2178,7 +2160,7 @@ "Prüfe HTTP Anker Verweise. Standard ist keine Überprüfung.\n" "Diese Option aktiviert die Ausgabe der Warnung 'url-anchor-not-found'." -#: ../linkchecker:483 +#: ../linkchecker:473 msgid "" "Try the given username for HTTP and FTP authorization.\n" "For FTP the default username is 'anonymous'. For HTTP there is\n" @@ -2187,7 +2169,7 @@ "Verwende den angegebenen Benutzernamen für HTTP und FTP\n" "Authorisation. Für FTP ist der Standardname 'anonymous'. Für HTTP gibt es kein Standardnamen. Siehe auch -p." -#: ../linkchecker:489 +#: ../linkchecker:479 msgid "" "Read a password from console and use it for HTTP and FTP authorization.\n" "For FTP the default password is 'anonymous@'. For HTTP there is\n" @@ -2197,7 +2179,7 @@ "Für FTP ist das Standardpasswort 'anonymous@'. Für HTTP gibt es kein Standardpasswort.\n" "Siehe auch -u." -#: ../linkchecker:495 +#: ../linkchecker:485 #, python-format msgid "" "Set the timeout for connection attempts in seconds. The default\n" @@ -2206,7 +2188,7 @@ "Setze den Timeout für Verbindungen in Sekunden. Der Standard\n" "Timeout ist %d Sekunden." -#: ../linkchecker:500 +#: ../linkchecker:490 msgid "" "Pause the given number of seconds between two subsequent connection\n" "requests to the same host. Default is no pause between requests." @@ -2214,7 +2196,7 @@ "Pausiere die angegebene Anzahl von Sekunden zwischen zwei aufeinander folgenden\n" "Verbindungen zum demselben Rechner. Standard ist keine Pause zwischen Verbindungen." -#: ../linkchecker:505 +#: ../linkchecker:495 msgid "" "Specify an NNTP server for 'news:...' links. Default is the\n" "environment variable NNTP_SERVER. If no host is given,\n" @@ -2224,7 +2206,7 @@ "Umgebungsvariable NNTP_SERVER. Falls kein Rechner angegeben ist,\n" "wird lediglich auf korrekte Syntax des Links geprüft." -#: ../linkchecker:511 +#: ../linkchecker:501 msgid "" "Specify the User-Agent string to send to the HTTP server, for example\n" "\"Mozilla/4.0\". The default is \"LinkChecker/X.Y\" where X.Y is the current\n" @@ -2234,71 +2216,71 @@ "z.B. \"Mozilla/4.0\". Der Standard ist \"LinkChecker/X.Y\", wobei X.Y\n" "die aktuelle Version von LinkChecker ist." -#: ../linkchecker:549 +#: ../linkchecker:539 #, python-format msgid "URL has unparsable domain name: %(domain)s" msgstr "URL besitzt einen nicht analysierbaren Rechnernamen: %(domain)s" -#: ../linkchecker:574 +#: ../linkchecker:564 #, python-format msgid "Invalid debug level %(level)r" msgstr "Ungültiger Debuglevel %(level)r" -#: ../linkchecker:587 +#: ../linkchecker:577 #, python-format msgid "Unreadable config file: %r" msgstr "Nicht lesbare Konfigurationsdatei: %r" -#: ../linkchecker:595 +#: ../linkchecker:585 msgid "Running with python -O disables debugging." msgstr "Die Option python -O verhindert das Debuggen." -#: ../linkchecker:617 -#: ../linkchecker:648 +#: ../linkchecker:607 +#: ../linkchecker:638 #, python-format msgid "Unknown logger type %(type)r in %(output)r for option %(option)s" msgstr "Unbekannter Logtyp %(type)r in %(output)r für Option %(option)s" -#: ../linkchecker:621 -#: ../linkchecker:654 +#: ../linkchecker:611 +#: ../linkchecker:644 #, python-format msgid "Unknown encoding %(encoding)r in %(output)r for option %(option)s" msgstr "Unbekanntes Encoding %(encoding)r in %(output)r für Option %(option)s" -#: ../linkchecker:666 +#: ../linkchecker:656 #, python-format msgid "Enter LinkChecker HTTP/FTP password for user %(user)s:" msgstr "Gebe LinkChecker HTTP/FTP Passwort für Benutzer %(user)s ein:" -#: ../linkchecker:669 +#: ../linkchecker:659 msgid "Enter LinkChecker HTTP/FTP password:" msgstr "Gebe LinkChecker HTTP/FTP Passwort ein:" -#: ../linkchecker:676 -#: ../linkchecker:694 +#: ../linkchecker:666 +#: ../linkchecker:684 #, python-format msgid "Illegal argument %(arg)r for option %(option)s" msgstr "Ungültiges Argument %(arg)r für Option %(option)s" -#: ../linkchecker:733 +#: ../linkchecker:723 #, python-format msgid "Enter LinkChecker password for user %(user)s at %(strpattern)s:" msgstr "Gebe LinkChecker Passwort für Benutzer %(user)s bei %(strpattern)s ein:" -#: ../linkchecker:750 +#: ../linkchecker:740 msgid "Using DOT or GML loggers without --complete output gives an incomplete sitemap graph." msgstr "Benutzung von DOT oder GML Ausgaben ohne --complete ergibt einen unvollständigen Sitemap Graphen." -#: ../linkchecker:763 +#: ../linkchecker:753 #, python-format msgid "Could not parse cookie file: %s" msgstr "Konnte Cookie-Datei nicht parsen: %s" -#: ../linkchecker:777 +#: ../linkchecker:767 msgid "no files or URLs given" msgstr "keine Dateien oder URLs angegeben" -#: ../linkchecker:782 +#: ../linkchecker:772 #, python-format msgid "" "Overwrite profiling file %(file)r?\n" @@ -2307,88 +2289,123 @@ "Profildatei %(file)r überschreiben?\n" "Drücken Sie Strg-C zum Abbrechen, EINGABETASTE zum Fortfahren." -#: ../linkchecker:788 +#: ../linkchecker:778 msgid "Canceled." msgstr "Abgebrochen." -#: ../linkchecker:792 +#: ../linkchecker:782 msgid "The `profile' Python module is not installed, therefore the --profile option is disabled." msgstr "Das `profile' Python Modul ist nicht installiert, deshalb ist die --profile Option deaktiviert." -#: /usr/lib/python2.6/optparse.py:140 +#: /usr/lib/python2.7/optparse.py:140 #, python-format msgid "no such option: %s" msgstr "Keine solche Option: %s" -#: /usr/lib/python2.6/optparse.py:151 +#: /usr/lib/python2.7/optparse.py:151 #, python-format msgid "ambiguous option: %s (%s?)" msgstr "Mehrdeutige Option: %s (%s?)" -#: /usr/lib/python2.6/optparse.py:374 +#: /usr/lib/python2.7/optparse.py:374 #, python-format msgid "Usage: %s\n" msgstr "Syntax: %s\n" -#: /usr/lib/python2.6/optparse.py:393 +#: /usr/lib/python2.7/optparse.py:393 msgid "Usage" msgstr "Syntax" -#: /usr/lib/python2.6/optparse.py:418 +#: /usr/lib/python2.7/optparse.py:418 msgid "integer" msgstr "Nummer" -#: /usr/lib/python2.6/optparse.py:419 +#: /usr/lib/python2.7/optparse.py:419 msgid "long integer" msgstr "Nummer" -#: /usr/lib/python2.6/optparse.py:420 +#: /usr/lib/python2.7/optparse.py:420 msgid "floating-point" msgstr "Fließkommazahl" -#: /usr/lib/python2.6/optparse.py:421 +#: /usr/lib/python2.7/optparse.py:421 msgid "complex" msgstr "komplex" -#: /usr/lib/python2.6/optparse.py:429 +#: /usr/lib/python2.7/optparse.py:429 #, python-format msgid "option %s: invalid %s value: %r" msgstr "Option %s: Ungültiger %s Wert: %r" -#: /usr/lib/python2.6/optparse.py:437 +#: /usr/lib/python2.7/optparse.py:437 #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "Option %s: ungültige Auswahl: %r (wähle von %s)" -#: /usr/lib/python2.6/optparse.py:1245 +#: /usr/lib/python2.7/optparse.py:1250 msgid "show this help message and exit" msgstr "Zeige diesen Hilfetext und beende" -#: /usr/lib/python2.6/optparse.py:1250 +#: /usr/lib/python2.7/optparse.py:1255 msgid "show program's version number and exit" msgstr "Zeige Programmversion und beende" -#: /usr/lib/python2.6/optparse.py:1273 +#: /usr/lib/python2.7/optparse.py:1278 msgid "%prog [options]" msgstr "%prog [Optionen]" -#: /usr/lib/python2.6/optparse.py:1493 -#: /usr/lib/python2.6/optparse.py:1532 +#: /usr/lib/python2.7/optparse.py:1498 +#: /usr/lib/python2.7/optparse.py:1537 #, python-format msgid "%s option requires an argument" msgstr "%s Option erfordert ein Argument" -#: /usr/lib/python2.6/optparse.py:1495 -#: /usr/lib/python2.6/optparse.py:1534 +#: /usr/lib/python2.7/optparse.py:1500 +#: /usr/lib/python2.7/optparse.py:1539 #, python-format msgid "%s option requires %d arguments" msgstr "%s Option erfordert %d Argumente" -#: /usr/lib/python2.6/optparse.py:1504 +#: /usr/lib/python2.7/optparse.py:1509 #, python-format msgid "%s option does not take a value" msgstr "%s Option nimmt kein Wert" +#~ msgid "This option is deprecated and does nothing." +#~ msgstr "Diese Option ist veraltet und bewirkt nichts." + +#, fuzzy +#~ msgid "Scanning options" +#~ msgstr "Prüf-Optionen" + +#~ msgid "LinkChecker progress" +#~ msgstr "LinkChecker Fortschritt" + +#~ msgid "Status" +#~ msgstr "Status" + +#~ msgid "Cancel" +#~ msgstr "Abbrechen" + +#~ msgid "Invalid regular expression" +#~ msgstr "Ungültiger regulärer Ausdruck" + +#~ msgid "Linkchecker options" +#~ msgstr "LinkChecker Optionen" + +#~ msgid "" +#~ "The most common check options are configurable. They override any " +#~ "configuration file settings." +#~ msgstr "" +#~ "Die gebräuchlichsten Prüfoptionen sind konfigurierbar. Sie überschreiben " +#~ "alle Einträge der Konfigurationsdateien." + +#~ msgid "Warning regex" +#~ msgstr "Reg. Ausdruck für Warnung" + +#~ msgid "GUI options" +#~ msgstr "GUI Optionen" + #~ msgid "Status:" #~ msgstr "Status:" @@ -2503,9 +2520,6 @@ #~ "die ignore%(num)d Syntax ist veraltet; benutzen Sie die neue mehrzeilige " #~ "Syntax" -#~ msgid "Dialog" -#~ msgstr "Dialog" - #~ msgid "User specific configuration file" #~ msgstr "Benutzerspezifische Konfigurationsdatei" diff -Nru linkchecker-7.2/po/linkchecker.pot linkchecker-7.4/po/linkchecker.pot --- linkchecker-7.2/po/linkchecker.pot 2011-10-20 06:13:53.000000000 +0000 +++ linkchecker-7.4/po/linkchecker.pot 2012-01-04 17:59:53.000000000 +0000 @@ -1,5 +1,5 @@ # SOME DESCRIPTIVE TITLE. -# Copyright (C) 2011 Bastian Kleineidam +# Copyright (C) 2012 Bastian Kleineidam # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: calvin@users.sourceforge.net\n" -"POT-Creation-Date: 2011-10-19 22:32+0200\n" +"POT-Creation-Date: 2012-01-04 18:58+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,892 +18,796 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: ../linkcheck/gui/editor.py:104 -msgid "Save file?" -msgstr "" - -#: ../linkcheck/gui/editor.py:105 -msgid "The document has been modified." -msgstr "" - -#: ../linkcheck/gui/editor.py:106 -msgid "Do you want to save your changes?" -msgstr "" - -#: ../linkcheck/gui/editor.py:115 -msgid "Save File As" -msgstr "" - -#: ../linkcheck/gui/editor.py:158 -msgid "readonly" +#: ../linkcheck/director/aggregator.py:70 +msgid "These URLs are still active:" msgstr "" -#: ../linkcheck/gui/updater.py:40 +#: ../linkcheck/director/console.py:47 #, python-format -msgid "%(app)s update information" -msgstr "" +msgid "%2d URL active" +msgid_plural "%2d URLs active" +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/gui/updater.py:50 -msgid "Checking for updates..." -msgstr "" +#: ../linkcheck/director/console.py:50 +#, python-format +msgid "%5d URL queued" +msgid_plural "%5d URLs queued" +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/gui/updater.py:58 +#: ../linkcheck/director/console.py:52 #, python-format -msgid "Congratulations: the latest version %(app)s is installed." -msgstr "" +msgid "%4d URL checked" +msgid_plural "%4d URLs checked" +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/gui/updater.py:65 +#: ../linkcheck/director/console.py:54 #, python-format -msgid "" -"Detected local or development version %(currentversion)s. Available version " -"of %(app)s is %(version)s." +msgid "runtime %s" msgstr "" -#: ../linkcheck/gui/updater.py:69 +#: ../linkcheck/director/console.py:74 #, python-format msgid "" -"A new version %(version)s of %(app)s is available for download." +"********** Oops, I did it again. *************\n" +"\n" +"You have found an internal error in LinkChecker. Please write a bug report\n" +"at %s\n" +"and include the following information:\n" +"- the URL or file you are testing\n" +"- the system information below\n" +"\n" +"When using the commandline client:\n" +"- your commandline arguments and any custom configuration files.\n" +"- the output of a debug run with option \"-Dall\"\n" +"\n" +"Not disclosing some of the information above due to privacy reasons is ok.\n" +"I will try to help you nonetheless, but you have to give me something\n" +"I can work with ;) .\n" msgstr "" -#: ../linkcheck/gui/updater.py:77 -msgid "update thread has been terminated" +#: ../linkcheck/director/console.py:102 +msgid "******** LinkChecker internal error, over and out ********" msgstr "" -#: ../linkcheck/gui/updater.py:79 -#, python-format -msgid "An error occured while checking for an update of %(app)s: %(error)s." +#: ../linkcheck/director/console.py:122 +msgid "Default locale:" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_progress.py:82 -msgid "LinkChecker progress" +#: ../linkcheck/director/console.py:127 +msgid "System info:" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_progress.py:83 -msgid "Status" +#: ../linkcheck/director/console.py:129 ../linkchecker:566 +#, python-format +msgid "Python %(version)s on %(platform)s" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_progress.py:84 -#: ../linkcheck/gui/linkchecker_ui_main.py:762 -msgid "Active:" +#: ../linkcheck/director/console.py:134 +msgid "Local time:" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_progress.py:85 -#: ../linkcheck/gui/linkchecker_ui_progress.py:87 -#: ../linkcheck/gui/linkchecker_ui_progress.py:89 -#: ../linkcheck/gui/linkchecker_ui_main.py:763 -#: ../linkcheck/gui/linkchecker_ui_main.py:765 -#: ../linkcheck/gui/linkchecker_ui_main.py:767 -msgid "0" +#: ../linkcheck/director/__init__.py:39 +msgid "Could not import twill for login URL visit" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_progress.py:86 -#: ../linkcheck/gui/linkchecker_ui_main.py:764 -msgid "Queued:" +#: ../linkcheck/director/__init__.py:45 +#, python-format +msgid "Error visiting login URL %(url)s." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_progress.py:88 -#: ../linkcheck/gui/linkchecker_ui_main.py:766 -msgid "Checked:" +#: ../linkcheck/director/__init__.py:50 +#, python-format +msgid "Error posting form at login URL %(url)s." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_progress.py:90 -msgid "Cancel" +#: ../linkcheck/director/__init__.py:127 +#, python-format +msgid "Error using login URL: %(msg)s." msgstr "" -#: ../linkcheck/gui/options.py:51 -msgid "Invalid regular expression" +#: ../linkcheck/director/__init__.py:143 +msgid "" +"Could not start a new thread. Check that the current user is allowed to start " +"new threads." msgstr "" -#: ../linkcheck/gui/options.py:116 -#: ../linkcheck/gui/linkchecker_ui_options.py:184 -msgid "Edit" +#: ../linkcheck/director/__init__.py:176 +msgid "user interrupt; waiting for active threads to finish" msgstr "" -#: ../linkcheck/gui/options.py:118 -msgid "Read" +#: ../linkcheck/director/__init__.py:178 +msgid "another interrupt will exit immediately" msgstr "" -#: ../linkcheck/gui/options.py:121 -msgid "File not found" +#: ../linkcheck/director/__init__.py:194 +msgid "user abort; force shutdown" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:758 -msgid "LinkChecker" +#: ../linkcheck/updater.py:63 +msgid "could not download update information" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:759 -msgid "URL:" +#: ../linkcheck/cache/addrinfo.py:51 +#, python-format +msgid "could not parse host %(host)r: %(msg)s" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:760 -msgid "Start checking the given URL." +#: ../linkcheck/configuration/confparse.py:57 +#, python-format +msgid "Error parsing configuration: %s" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:768 -msgid "Info:" +#: ../linkcheck/configuration/confparse.py:116 +#, python-format +msgid "invalid negative value for timeout: %d\n" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:769 -msgid "-" +#: ../linkcheck/configuration/confparse.py:168 +#, python-format +msgid "missing auth part in entry %(val)r" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:770 -msgid "URL properties" +#: ../linkcheck/configuration/confparse.py:174 +#, python-format +msgid "invalid login URL `%s'. Only HTTP and HTTPS URLs are supported." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:771 ../linkcheck/gui/urlmodel.py:22 -#: ../linkcheck/logger/__init__.py:43 -msgid "URL" +#: ../linkcheck/configuration/__init__.py:290 +msgid "warning: missing user or URL pattern in authentication data." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:772 ../linkcheck/gui/urlmodel.py:22 -#: ../linkcheck/logger/__init__.py:35 -msgid "Name" +#: ../linkcheck/configuration/__init__.py:340 +msgid "warning: activating text logger output." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:773 -#: ../linkcheck/logger/__init__.py:36 -msgid "Parent URL" +#: ../linkcheck/configuration/__init__.py:348 +#: ../linkcheck/checker/urlbase.py:790 +msgid "" +"warning: tidy module is not available; download from http://utidylib.berlios." +"de/" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:774 -#: ../linkcheck/logger/__init__.py:34 -msgid "Base" +#: ../linkcheck/configuration/__init__.py:356 +#: ../linkcheck/checker/urlbase.py:819 +msgid "" +"warning: cssutils module is not available; download from http://cthedot.de/" +"cssutils/" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:775 -#: ../linkcheck/logger/__init__.py:42 -msgid "Check time" +#: ../linkcheck/configuration/__init__.py:366 +msgid "warning: Clamav could not be initialized" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:776 -#: ../linkcheck/logger/__init__.py:40 -msgid "D/L time" +#: ../linkcheck/configuration/__init__.py:372 +msgid "warning: activating sendcookies because storecookies is active." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:777 -#: ../linkcheck/logger/__init__.py:41 -msgid "Size" +#: ../linkcheck/configuration/__init__.py:382 +msgid "warning: no CGI password fieldname given for login URL." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:778 -#: ../linkcheck/logger/__init__.py:38 -msgid "Info" +#: ../linkcheck/configuration/__init__.py:386 +msgid "warning: no CGI user fieldname given for login URL." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:779 -#: ../linkcheck/logger/__init__.py:39 -msgid "Warning" +#: ../linkcheck/configuration/__init__.py:390 +msgid "warning: no user/password authentication data found for login URL." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:780 ../linkcheck/gui/urlmodel.py:22 -#: ../linkcheck/logger/__init__.py:33 -msgid "Result" +#: ../linkcheck/configuration/__init__.py:393 +msgid "warning: login URL is not a HTTP URL." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:781 -msgid "Check results" +#: ../linkcheck/configuration/__init__.py:397 +msgid "warning: login URL is incomplete." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:782 -msgid "Valid URLs" +#: ../linkcheck/configuration/__init__.py:401 +#, python-format +msgid "warning: disabling login URL %(url)s." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:783 -msgid "Warnings" +#: ../linkcheck/logger/html.py:95 ../linkcheck/logger/text.py:85 +#, python-format +msgid "Start checking at %s" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:784 -msgid "Invalid URLs" +#: ../linkcheck/logger/html.py:140 +msgid "checked link" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:785 -msgid "Content type statistics" +#: ../linkcheck/logger/html.py:160 ../linkcheck/logger/text.py:126 +msgid " (cached)" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:786 -msgid "Image" +#: ../linkcheck/logger/html.py:174 ../linkcheck/logger/text.py:138 +#: ../linkcheck/gui/urlmodel.py:78 +#, python-format +msgid ", line %d" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:787 -msgid "Text" +#: ../linkcheck/logger/html.py:175 ../linkcheck/logger/text.py:139 +#: ../linkcheck/gui/urlmodel.py:79 +#, python-format +msgid ", col %d" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:788 -msgid "Application" +#: ../linkcheck/logger/html.py:199 ../linkcheck/logger/html.py:211 +#: ../linkcheck/logger/text.py:155 ../linkcheck/logger/text.py:167 +#: ../linkcheck/gui/properties.py:36 ../linkcheck/gui/properties.py:38 +#, python-format +msgid "%.3f seconds" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:789 -msgid "Audio" +#: ../linkcheck/logger/html.py:235 ../linkcheck/logger/text.py:186 +msgid "Valid" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:790 -msgid "Video" +#: ../linkcheck/logger/html.py:240 ../linkcheck/logger/text.py:189 +msgid "Error" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:791 -msgid "Other" +#: ../linkcheck/logger/html.py:247 +msgid "Statistics" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:792 -msgid "Mail" +#: ../linkcheck/logger/html.py:249 ../linkcheck/logger/text.py:238 +#, python-format +msgid "Number of domains: %d" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:793 -msgid "URL statistics" +#: ../linkcheck/logger/html.py:253 ../linkcheck/logger/text.py:241 +#, python-format +msgid "" +"Content types: %(image)d image, %(text)d text, %(video)d video, %(audio)d " +"audio, %(application)d application, %(mail)d mail and %(other)d other." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:794 -msgid "Min. length" +#: ../linkcheck/logger/html.py:257 ../linkcheck/logger/text.py:244 +#, python-format +msgid "URL lengths: min=%(min)d, max=%(max)d, avg=%(avg)d." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:795 -msgid "Avg. length" +#: ../linkcheck/logger/html.py:262 ../linkcheck/logger/text.py:249 +msgid "No statistics available since zero URLs were checked." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:796 -msgid "Max. length" +#: ../linkcheck/logger/html.py:268 ../linkcheck/logger/text.py:197 +msgid "That's it." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:797 -msgid "Domains" -msgstr "" +#: ../linkcheck/logger/html.py:270 ../linkcheck/logger/text.py:198 +#, python-format +msgid "%d link checked." +msgid_plural "%d links checked." +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/gui/linkchecker_ui_main.py:798 -msgid "&Edit" -msgstr "" +#: ../linkcheck/logger/html.py:273 ../linkcheck/logger/text.py:201 +#, python-format +msgid "%d warning found" +msgid_plural "%d warnings found" +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/gui/linkchecker_ui_main.py:799 -#: ../linkcheck/gui/linkchecker_ui_editor.py:56 -msgid "&File" +#: ../linkcheck/logger/html.py:276 ../linkcheck/logger/text.py:209 +#, python-format +msgid " (%d ignored or duplicates not printed)" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:800 -#: ../linkcheck/gui/linkchecker_ui_main.py:803 -msgid "&Help" -msgstr "" - -#: ../linkcheck/gui/linkchecker_ui_main.py:801 -msgid "A&bout" -msgstr "" +#: ../linkcheck/logger/html.py:279 ../linkcheck/logger/text.py:212 +#, python-format +msgid "%d error found" +msgid_plural "%d errors found" +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/gui/linkchecker_ui_main.py:802 -msgid "About" +#: ../linkcheck/logger/html.py:282 ../linkcheck/logger/text.py:220 +#, python-format +msgid " (%d duplicates not printed)" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:804 -msgid "Help" -msgstr "" +#: ../linkcheck/logger/html.py:288 ../linkcheck/logger/text.py:225 +#, python-format +msgid "There was %(num)d internal error." +msgid_plural "There were %(num)d internal errors." +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/gui/linkchecker_ui_main.py:805 -msgid "View online" +#: ../linkcheck/logger/html.py:293 ../linkcheck/logger/text.py:229 +#: ../linkcheck/logger/__init__.py:355 +#, python-format +msgid "Stopped checking at %(time)s (%(duration)s)" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:806 -msgid "View URL online" +#: ../linkcheck/logger/html.py:298 +#, python-format +msgid "Get the newest version at %s" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:807 -msgid "&Options" +#: ../linkcheck/logger/html.py:301 +#, python-format +msgid "Write comments and bugs to %s" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:808 -#: /usr/lib/python2.6/optparse.py:1621 -msgid "Options" +#: ../linkcheck/logger/text.py:79 ../linkcheck/logger/__init__.py:345 +#, python-format +msgid "Get the newest version at %(url)s" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:809 -msgid "Copy to clipboard" +#: ../linkcheck/logger/text.py:81 ../linkcheck/logger/__init__.py:347 +#, python-format +msgid "Write comments and bugs to %(url)s" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:810 -msgid "Copy URL to clipboard" +#: ../linkcheck/logger/text.py:236 +msgid "Statistics:" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:811 -msgid "Ctrl+C" +#: ../linkcheck/logger/__init__.py:31 +msgid "Real URL" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:812 -msgid "View parent online" +#: ../linkcheck/logger/__init__.py:32 +msgid "Cache key" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:813 -msgid "View parent URL online" +#: ../linkcheck/logger/__init__.py:33 +#: ../linkcheck/gui/linkchecker_ui_main.py:315 ../linkcheck/gui/urlmodel.py:22 +msgid "Result" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:814 -msgid "View parent source" +#: ../linkcheck/logger/__init__.py:34 +#: ../linkcheck/gui/linkchecker_ui_main.py:209 +msgid "Base" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:815 -msgid "View parent URL source" +#: ../linkcheck/logger/__init__.py:35 +#: ../linkcheck/gui/linkchecker_ui_main.py:174 ../linkcheck/gui/urlmodel.py:22 +msgid "Name" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:816 -msgid "Show debug" +#: ../linkcheck/logger/__init__.py:36 +#: ../linkcheck/gui/linkchecker_ui_main.py:191 +msgid "Parent URL" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:817 -msgid "View properties" +#: ../linkcheck/logger/__init__.py:37 +msgid "Extern" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:818 -msgid "View URL properties" +#: ../linkcheck/logger/__init__.py:38 +#: ../linkcheck/gui/linkchecker_ui_main.py:278 +msgid "Info" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:819 -msgid "&Save results..." +#: ../linkcheck/logger/__init__.py:39 +#: ../linkcheck/gui/linkchecker_ui_main.py:296 +msgid "Warning" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:820 -#: ../linkcheck/gui/linkchecker_ui_editor.py:58 -msgid "Ctrl+S" +#: ../linkcheck/logger/__init__.py:40 +#: ../linkcheck/gui/linkchecker_ui_main.py:244 +msgid "D/L time" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:821 -msgid "&Quit" +#: ../linkcheck/logger/__init__.py:41 +#: ../linkcheck/gui/linkchecker_ui_main.py:261 +msgid "Size" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:822 -msgid "Ctrl+Q" +#: ../linkcheck/logger/__init__.py:42 +#: ../linkcheck/gui/linkchecker_ui_main.py:227 +msgid "Check time" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:823 -msgid "Check for updates" +#: ../linkcheck/logger/__init__.py:43 +#: ../linkcheck/gui/linkchecker_ui_main.py:156 ../linkcheck/gui/urlmodel.py:22 +msgid "URL" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_main.py:824 -msgid "Donate" +#: ../linkcheck/logger/__init__.py:44 +msgid "Level" msgstr "" -#: ../linkcheck/gui/lineedit.py:175 +#: ../linkcheck/logger/__init__.py:252 #, python-format -msgid "Insert %(browser)s bookmark file" -msgstr "" - -#: ../linkcheck/gui/linkchecker_ui_options.py:169 -msgid "Linkchecker options" -msgstr "" - -#: ../linkcheck/gui/linkchecker_ui_options.py:170 -msgid "" -"The most common check options are configurable. They override any " -"configuration file settings." -msgstr "" - -#: ../linkcheck/gui/linkchecker_ui_options.py:171 -#: ../linkcheck/gui/linkchecker_ui_options.py:173 -msgid "" -"Check recursively all links up to given depth. A negative depth will enable " -"infinite recursion." -msgstr "" - -#: ../linkcheck/gui/linkchecker_ui_options.py:172 -msgid "Recursive depth" -msgstr "" - -#: ../linkcheck/gui/linkchecker_ui_options.py:174 -#: ../linkcheck/gui/linkchecker_ui_options.py:176 -msgid "Log all checked URLs once. Default is to log only errors and warnings." -msgstr "" - -#: ../linkcheck/gui/linkchecker_ui_options.py:175 -msgid "Verbose output" -msgstr "" - -#: ../linkcheck/gui/linkchecker_ui_options.py:177 -msgid "Debug" +msgid "Happy birthday for LinkChecker, I'm %d years old today!" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_options.py:178 -msgid "Warning regex" +#: ../linkcheck/logger/__init__.py:342 +#, python-format +msgid "created by %(app)s at %(time)s" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_options.py:179 -msgid "Close" +#: ../linkcheck/clamav.py:56 +msgid "clamd is not ready for stream scanning" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_options.py:180 -msgid "GUI options" +#: ../linkcheck/clamav.py:126 +msgid "ScannerDaemonOutputFormat must be disabled" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_options.py:181 -msgid "" -"The user configuration file holds advanced options and can be edited with an " -"integrated text editor." +#: ../linkcheck/clamav.py:128 +msgid "only one of TCPSocket and LocalSocket must be enabled" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_options.py:182 -msgid "Overrides system wide configuration file settings." +#: ../linkcheck/clamav.py:157 +msgid "one of TCPSocket or LocalSocket must be enabled" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_options.py:183 -msgid "/home/user/.linkchecker/linkcheckerrc" +#: ../linkcheck/checker/telneturl.py:52 +msgid "Host is empty" msgstr "" -#: ../linkcheck/gui/linkchecker_ui_options.py:185 -msgid "Configuration file" +#: ../linkcheck/checker/unknownurl.py:77 ../linkcheck/checker/urlbase.py:493 +msgid "Outside of domain filter, checked only syntax." msgstr "" -#: ../linkcheck/gui/properties.py:36 ../linkcheck/gui/properties.py:38 -#: ../linkcheck/logger/text.py:155 ../linkcheck/logger/text.py:167 -#: ../linkcheck/logger/html.py:199 ../linkcheck/logger/html.py:211 +#: ../linkcheck/checker/unknownurl.py:79 #, python-format -msgid "%.3f seconds" +msgid "%(scheme)s URL ignored." msgstr "" -#: ../linkcheck/gui/urlsave.py:21 -msgid "HTML output (*.html)" +#: ../linkcheck/checker/unknownurl.py:83 +msgid "URL is unrecognized or has invalid syntax" msgstr "" -#: ../linkcheck/gui/urlsave.py:22 -msgid "Text output (*.txt)" +#: ../linkcheck/checker/const.py:104 +msgid "The effective URL is different from the original." msgstr "" -#: ../linkcheck/gui/urlsave.py:23 -msgid "XML output (*.xml)" +#: ../linkcheck/checker/const.py:106 +msgid "Could not get the content of the URL." msgstr "" -#: ../linkcheck/gui/urlsave.py:24 -msgid "CSV output (*.csv)" +#: ../linkcheck/checker/const.py:107 +msgid "URL anchor was not found." msgstr "" -#: ../linkcheck/gui/urlsave.py:57 -msgid "Save check results" +#: ../linkcheck/checker/const.py:109 +msgid "The warning regular expression was found in the URL contents." msgstr "" -#: ../linkcheck/gui/urlmodel.py:22 -msgid "Parent" +#: ../linkcheck/checker/const.py:110 +msgid "The URL content size is too large." msgstr "" -#: ../linkcheck/gui/urlmodel.py:78 ../linkcheck/logger/text.py:138 -#: ../linkcheck/logger/html.py:174 -#, python-format -msgid ", line %d" +#: ../linkcheck/checker/const.py:111 +msgid "The URL content size is zero." msgstr "" -#: ../linkcheck/gui/urlmodel.py:79 ../linkcheck/logger/text.py:139 -#: ../linkcheck/logger/html.py:175 -#, python-format -msgid ", col %d" +#: ../linkcheck/checker/const.py:112 +msgid "The URL content size and download size are unequal." msgstr "" -#: ../linkcheck/gui/__init__.py:138 ../linkcheck/gui/__init__.py:417 -msgid "Ready." +#: ../linkcheck/checker/const.py:113 +msgid "The URL contains leading or trailing whitespace." msgstr "" -#: ../linkcheck/gui/__init__.py:165 -msgid "Check finished." +#: ../linkcheck/checker/const.py:114 +msgid "The file: URL is missing a trailing slash." msgstr "" -#: ../linkcheck/gui/__init__.py:235 -msgid "Start" +#: ../linkcheck/checker/const.py:116 +msgid "The file: path is not the same as the system specific path." msgstr "" -#: ../linkcheck/gui/__init__.py:259 -msgid "Stop" +#: ../linkcheck/checker/const.py:117 +msgid "The ftp: URL is missing a trailing slash." msgstr "" -#: ../linkcheck/gui/__init__.py:307 -#, python-format -msgid "About %(appname)s" +#: ../linkcheck/checker/const.py:118 +msgid "The http: URL checking has been denied." msgstr "" -#: ../linkcheck/gui/__init__.py:308 -#, python-format -msgid "" -"
\n" -"

%(app)s

\n" -"

Released on %(releasedate)s\n" -"

Python: %(pyver)s
\n" -"%(modules)s\n" -"

%(copyright)s\n" -"
%(appname)s is licensed under the\n" -"GPL\n" -"Version 2 or later.\n" -"

If you like %(appname)s, consider one of several ways to\n" -"donate. Thanks!\n" -"

" +#: ../linkcheck/checker/const.py:119 +msgid "The URL has moved permanently." msgstr "" -#: ../linkcheck/gui/__init__.py:353 -msgid "Closing pending connections..." +#: ../linkcheck/checker/const.py:121 +msgid "The URL has been redirected to an URL of a different type." msgstr "" -#: ../linkcheck/gui/__init__.py:387 -msgid "Error, empty URL" +#: ../linkcheck/checker/const.py:122 +msgid "The URL had no content." msgstr "" -#: ../linkcheck/gui/__init__.py:389 -#, python-format -msgid "Checking '%s'." +#: ../linkcheck/checker/const.py:124 +msgid "An error occurred while storing a cookie." msgstr "" -#: ../linkcheck/gui/__init__.py:394 -#, python-format -msgid "Error, invalid URL `%s'." +#: ../linkcheck/checker/const.py:126 +msgid "An error occurred while decompressing the URL content." msgstr "" -#: ../linkcheck/gui/__init__.py:414 -#, python-format -msgid "%d URL selected." -msgid_plural "%d URLs selected" -msgstr[0] "" -msgstr[1] "" - -#: ../linkcheck/gui/__init__.py:494 -msgid "LinkChecker internal error" +#: ../linkcheck/checker/const.py:128 +msgid "The URL content is encoded with an unknown encoding." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_editor.py:55 -msgid "LinkChecker source view" +#: ../linkcheck/checker/const.py:130 +msgid "Unsupported HTTP authentication method." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_editor.py:57 -msgid "&Save" +#: ../linkcheck/checker/const.py:131 +msgid "The URL has been ignored." msgstr "" -#: ../linkcheck/gui/linkchecker_ui_debug.py:42 -msgid "LinkChecker debug log" +#: ../linkcheck/checker/const.py:132 +msgid "The mail MX host could not be found." msgstr "" -#: ../linkcheck/lc_cgi.py:90 -#, python-format -msgid "URL has unparsable domain name: %s" +#: ../linkcheck/checker/const.py:134 +msgid "The mailto: address could not be verified." msgstr "" -#: ../linkcheck/lc_cgi.py:113 -msgid "unsupported language" +#: ../linkcheck/checker/const.py:136 +msgid "No connection to a MX host could be established." msgstr "" -#: ../linkcheck/lc_cgi.py:118 -msgid "empty url was given" +#: ../linkcheck/checker/const.py:137 +msgid "No NNTP server was found." msgstr "" -#: ../linkcheck/lc_cgi.py:120 -msgid "disallowed url was given" +#: ../linkcheck/checker/const.py:138 +msgid "The NNTP newsgroup could not be found." msgstr "" -#: ../linkcheck/lc_cgi.py:122 -msgid "no url was given" +#: ../linkcheck/checker/const.py:139 +msgid "The IP is obfuscated." msgstr "" -#: ../linkcheck/lc_cgi.py:127 -msgid "invalid recursion level" +#: ../linkcheck/checker/mailtourl.py:87 +#, python-format +msgid "No mail addresses found in `%(url)s'." msgstr "" -#: ../linkcheck/lc_cgi.py:132 +#: ../linkcheck/checker/mailtourl.py:126 #, python-format -msgid "invalid %s option syntax" +msgid "Error parsing CGI values: %s" msgstr "" -#: ../linkcheck/lc_cgi.py:154 +#: ../linkcheck/checker/mailtourl.py:149 #, python-format msgid "" -"\n" -"\n" -"LinkChecker Online Error\n" -"\n" -"
\n" -"Error: %s
\n" -"The LinkChecker Online script has encountered an error. Please ensure\n" -"that your provided URL link begins with http:// and\n" -"contains only these characters: A-Za-z0-9./_~-

\n" -"Errors are logged.\n" -"
\n" -"\n" -"" +"Mail address `%(addr)s' too long. Allowed 256 chars, was %(length)d chars." msgstr "" -#: ../linkcheck/director/console.py:47 -#, python-format -msgid "%2d URL active" -msgid_plural "%2d URLs active" -msgstr[0] "" -msgstr[1] "" - -#: ../linkcheck/director/console.py:50 +#: ../linkcheck/checker/mailtourl.py:153 #, python-format -msgid "%5d URL queued" -msgid_plural "%5d URLs queued" -msgstr[0] "" -msgstr[1] "" +msgid "Missing `@' in mail address `%(addr)s'." +msgstr "" -#: ../linkcheck/director/console.py:52 +#: ../linkcheck/checker/mailtourl.py:159 #, python-format -msgid "%4d URL checked" -msgid_plural "%4d URLs checked" -msgstr[0] "" -msgstr[1] "" +msgid "Missing local part of mail address `%(addr)s'." +msgstr "" -#: ../linkcheck/director/console.py:54 +#: ../linkcheck/checker/mailtourl.py:163 #, python-format -msgid "runtime %s" +msgid "Missing domain part of mail address `%(addr)s'." msgstr "" -#: ../linkcheck/director/console.py:74 +#: ../linkcheck/checker/mailtourl.py:167 #, python-format msgid "" -"********** Oops, I did it again. *************\n" -"\n" -"You have found an internal error in LinkChecker. Please write a bug report\n" -"at %s\n" -"and include the following information:\n" -"- the URL or file you are testing\n" -"- the system information below\n" -"\n" -"When using the commandline client:\n" -"- your commandline arguments and any custom configuration files.\n" -"- the output of a debug run with option \"-Dall\"\n" -"\n" -"Not disclosing some of the information above due to privacy reasons is ok.\n" -"I will try to help you nonetheless, but you have to give me something\n" -"I can work with ;) .\n" -msgstr "" - -#: ../linkcheck/director/console.py:102 -msgid "******** LinkChecker internal error, over and out ********" -msgstr "" - -#: ../linkcheck/director/console.py:122 -msgid "Default locale:" -msgstr "" - -#: ../linkcheck/director/console.py:127 -msgid "System info:" +"Local part of mail address `%(addr)s' too long. Allowed 64 chars, was " +"%(length)d chars." msgstr "" -#: ../linkcheck/director/console.py:129 ../linkchecker:576 +#: ../linkcheck/checker/mailtourl.py:171 #, python-format -msgid "Python %(version)s on %(platform)s" -msgstr "" - -#: ../linkcheck/director/console.py:134 -msgid "Local time:" +msgid "" +"Domain part of mail address `%(addr)s' too long. Allowed 255 chars, was " +"%(length)d chars." msgstr "" -#: ../linkcheck/director/__init__.py:39 -msgid "Could not import twill for login URL visit" +#: ../linkcheck/checker/mailtourl.py:180 +#, python-format +msgid "Unquoted double quote or backslash in mail address `%(addr)s'." msgstr "" -#: ../linkcheck/director/__init__.py:45 +#: ../linkcheck/checker/mailtourl.py:185 #, python-format -msgid "Error visiting login URL %(url)s." +msgid "Local part of mail address `%(addr)s' may not start with a dot." msgstr "" -#: ../linkcheck/director/__init__.py:50 +#: ../linkcheck/checker/mailtourl.py:189 #, python-format -msgid "Error posting form at login URL %(url)s." +msgid "Local part of mail address `%(addr)s' may not end with a dot." msgstr "" -#: ../linkcheck/director/__init__.py:127 +#: ../linkcheck/checker/mailtourl.py:193 #, python-format -msgid "Error using login URL: %(msg)s." +msgid "Local part of mail address `%(addr)s' may not contain two dots." msgstr "" -#: ../linkcheck/director/__init__.py:143 +#: ../linkcheck/checker/mailtourl.py:198 +#, python-format msgid "" -"Could not start a new thread. Check that the current user is allowed to start " -"new threads." -msgstr "" - -#: ../linkcheck/director/__init__.py:175 -msgid "user interrupt; waiting for active threads to finish" +"Local part of mail address `%(addr)s' contains unquoted character `%(char)s." msgstr "" -#: ../linkcheck/director/__init__.py:177 -msgid "another interrupt will exit immediately" +#: ../linkcheck/checker/mailtourl.py:210 +#, python-format +msgid "Domain part of mail address `%(addr)s' has invalid IP." msgstr "" -#: ../linkcheck/director/__init__.py:193 -msgid "user abort; force shutdown" +#: ../linkcheck/checker/mailtourl.py:216 +#, python-format +msgid "Invalid domain part of mail address `%(addr)s'." msgstr "" -#: ../linkcheck/director/aggregator.py:70 -msgid "These URLs are still active:" +#: ../linkcheck/checker/mailtourl.py:220 +#, python-format +msgid "Invalid top level domain part of mail address `%(addr)s'." msgstr "" -#: ../linkcheck/strformat.py:230 +#: ../linkcheck/checker/mailtourl.py:258 #, python-format -msgid "%(prefix)s%(duration).02f seconds" +msgid "No MX mail host for %(domain)s found." msgstr "" -#: ../linkcheck/strformat.py:233 +#: ../linkcheck/checker/mailtourl.py:266 #, python-format -msgid "%d second" -msgid_plural "%d seconds" -msgstr[0] "" -msgstr[1] "" +msgid "No host for %(domain)s found." +msgstr "" -#: ../linkcheck/strformat.py:234 +#: ../linkcheck/checker/mailtourl.py:280 #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" +msgid "Got invalid DNS answer %(answer)s for %(domain)s." +msgstr "" -#: ../linkcheck/strformat.py:235 +#: ../linkcheck/checker/mailtourl.py:324 #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" +msgid "Verified address %(mail)s: %(info)s." +msgstr "" -#: ../linkcheck/strformat.py:236 +#: ../linkcheck/checker/mailtourl.py:328 #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" +msgid "Unverified but presumably valid address %(mail)s: %(info)s." +msgstr "" -#: ../linkcheck/strformat.py:237 +#: ../linkcheck/checker/mailtourl.py:331 #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#: ../linkcheck/updater.py:63 -msgid "could not download update information" +msgid "Unverified address: %(info)s." msgstr "" -#: ../linkcheck/logger/text.py:79 ../linkcheck/logger/__init__.py:340 +#: ../linkcheck/checker/mailtourl.py:335 #, python-format -msgid "Get the newest version at %(url)s" +msgid "MX mail host %(host)s did not accept connections: %(error)s." msgstr "" -#: ../linkcheck/logger/text.py:81 ../linkcheck/logger/__init__.py:342 -#, python-format -msgid "Write comments and bugs to %(url)s" +#: ../linkcheck/checker/mailtourl.py:341 +msgid "Could not connect, but syntax is correct" msgstr "" -#: ../linkcheck/logger/text.py:85 ../linkcheck/logger/html.py:95 +#: ../linkcheck/checker/mailtourl.py:344 #, python-format -msgid "Start checking at %s" +msgid "Found MX mail host %(host)s" msgstr "" -#: ../linkcheck/logger/text.py:126 ../linkcheck/logger/html.py:160 -msgid " (cached)" +#: ../linkcheck/checker/urlbase.py:69 +#, python-format +msgid "URL has unparsable domain name: %(name)s" msgstr "" -#: ../linkcheck/logger/text.py:186 ../linkcheck/logger/html.py:235 -msgid "Valid" +#: ../linkcheck/checker/urlbase.py:137 +#, python-format +msgid "Leading or trailing whitespace in URL `%(url)s'." msgstr "" -#: ../linkcheck/logger/text.py:189 ../linkcheck/logger/html.py:240 -msgid "Error" +#: ../linkcheck/checker/urlbase.py:373 +msgid "URL is missing" msgstr "" -#: ../linkcheck/logger/text.py:197 ../linkcheck/logger/html.py:268 -msgid "That's it." +#: ../linkcheck/checker/urlbase.py:376 +msgid "URL is empty" msgstr "" -#: ../linkcheck/logger/text.py:198 ../linkcheck/logger/html.py:270 -#, python-format -msgid "%d link checked." -msgid_plural "%d links checked." -msgstr[0] "" -msgstr[1] "" - -#: ../linkcheck/logger/text.py:201 ../linkcheck/logger/html.py:273 +#: ../linkcheck/checker/urlbase.py:383 #, python-format -msgid "%d warning found" -msgid_plural "%d warnings found" -msgstr[0] "" -msgstr[1] "" +msgid "Effective URL %(url)r." +msgstr "" -#: ../linkcheck/logger/text.py:209 ../linkcheck/logger/html.py:276 +#: ../linkcheck/checker/urlbase.py:436 #, python-format -msgid " (%d ignored or duplicates not printed)" +msgid "URL has invalid port %(port)r" msgstr "" -#: ../linkcheck/logger/text.py:212 ../linkcheck/logger/html.py:279 +#: ../linkcheck/checker/urlbase.py:451 #, python-format -msgid "%d error found" -msgid_plural "%d errors found" -msgstr[0] "" -msgstr[1] "" +msgid "URL %(url)s has obfuscated IP address %(ip)s" +msgstr "" -#: ../linkcheck/logger/text.py:220 ../linkcheck/logger/html.py:282 +#: ../linkcheck/checker/urlbase.py:478 #, python-format -msgid " (%d duplicates not printed)" +msgid "URL is located in %(country)s." msgstr "" -#: ../linkcheck/logger/text.py:225 ../linkcheck/logger/html.py:288 -#: ../linkcheck/logger/__init__.py:350 -#, python-format -msgid "Stopped checking at %(time)s (%(duration)s)" +#: ../linkcheck/checker/urlbase.py:506 +msgid "Hostname not found" msgstr "" -#: ../linkcheck/logger/text.py:232 -msgid "Statistics:" +#: ../linkcheck/checker/urlbase.py:509 +#, python-format +msgid "Bad HTTP response %(line)r" msgstr "" -#: ../linkcheck/logger/text.py:234 ../linkcheck/logger/html.py:249 +#: ../linkcheck/checker/urlbase.py:522 #, python-format -msgid "Number of domains: %d" +msgid "could not get content: %(msg)r" msgstr "" -#: ../linkcheck/logger/text.py:237 ../linkcheck/logger/html.py:253 +#: ../linkcheck/checker/urlbase.py:652 #, python-format -msgid "" -"Content types: %(image)d image, %(text)d text, %(video)d video, %(audio)d " -"audio, %(application)d application, %(mail)d mail and %(other)d other." +msgid "Anchor `%(name)s' not found." msgstr "" -#: ../linkcheck/logger/text.py:240 ../linkcheck/logger/html.py:257 +#: ../linkcheck/checker/urlbase.py:653 #, python-format -msgid "URL lengths: min=%(min)d, max=%(max)d, avg=%(avg)d." +msgid "Available anchors: %(anchors)s." msgstr "" -#: ../linkcheck/logger/text.py:245 ../linkcheck/logger/html.py:262 -msgid "No statistics available since zero URLs were checked." +#: ../linkcheck/checker/urlbase.py:707 ../linkcheck/checker/fileurl.py:190 +#: ../linkcheck/checker/httpurl.py:656 +msgid "File size too large" msgstr "" -#: ../linkcheck/logger/html.py:140 -msgid "checked link" +#: ../linkcheck/checker/urlbase.py:753 +#, python-format +msgid "Found %(match)r at line %(line)d in link contents." msgstr "" -#: ../linkcheck/logger/html.py:247 -msgid "Statistics" +#: ../linkcheck/checker/urlbase.py:769 +msgid "Content size is zero." msgstr "" -#: ../linkcheck/logger/html.py:293 +#: ../linkcheck/checker/urlbase.py:775 #, python-format -msgid "Get the newest version at %s" +msgid "Content size %(dlsize)s is larger than %(maxbytes)s." msgstr "" -#: ../linkcheck/logger/html.py:296 +#: ../linkcheck/checker/urlbase.py:780 #, python-format -msgid "Write comments and bugs to %s" +msgid "" +"Download size (%(dlsize)d Byte) does not equal content size (%(size)d Byte)." msgstr "" -#: ../linkcheck/logger/__init__.py:31 -msgid "Real URL" +#: ../linkcheck/checker/urlbase.py:803 ../linkcheck/checker/urlbase.py:872 +msgid "valid HTML syntax" msgstr "" -#: ../linkcheck/logger/__init__.py:32 -msgid "Cache key" +#: ../linkcheck/checker/urlbase.py:809 +#, python-format +msgid "warning: tidy HTML parsing caused error: %(msg)s " msgstr "" -#: ../linkcheck/logger/__init__.py:37 -msgid "Extern" +#: ../linkcheck/checker/urlbase.py:835 ../linkcheck/checker/urlbase.py:908 +msgid "valid CSS syntax" msgstr "" -#: ../linkcheck/logger/__init__.py:44 -msgid "Level" +#: ../linkcheck/checker/urlbase.py:841 +#, python-format +msgid "warning: cssutils parsing caused error: %(msg)s" msgstr "" -#: ../linkcheck/logger/__init__.py:246 +#: ../linkcheck/checker/urlbase.py:850 #, python-format -msgid "Happy birthday for LinkChecker, I'm %d years old today!" +msgid "%(w3type)s validation error at line %(line)s col %(column)s: %(msg)s" msgstr "" -#: ../linkcheck/logger/__init__.py:337 +#: ../linkcheck/checker/urlbase.py:881 #, python-format -msgid "created by %(app)s at %(time)s" +msgid "warning: HTML W3C validation caused error: %(msg)s " +msgstr "" + +#: ../linkcheck/checker/urlbase.py:916 +#, python-format +msgid "warning: CSS W3C validation caused error: %(msg)s " msgstr "" #: ../linkcheck/checker/proxysupport.py:42 @@ -921,17 +825,26 @@ msgid "Using proxy `%(proxy)s'." msgstr "" -#: ../linkcheck/checker/unknownurl.py:77 ../linkcheck/checker/urlbase.py:492 -msgid "Outside of domain filter, checked only syntax." +#: ../linkcheck/checker/httpsurl.py:35 +#, python-format +msgid "%s URL ignored." msgstr "" -#: ../linkcheck/checker/unknownurl.py:79 +#: ../linkcheck/checker/ftpurl.py:110 #, python-format -msgid "%(scheme)s URL ignored." +msgid "Remote host has closed connection: %(msg)s" msgstr "" -#: ../linkcheck/checker/unknownurl.py:83 -msgid "URL is unrecognized or has invalid syntax" +#: ../linkcheck/checker/ftpurl.py:117 +msgid "Got no answer from FTP server" +msgstr "" + +#: ../linkcheck/checker/ftpurl.py:160 +msgid "Missing trailing directory slash in ftp url." +msgstr "" + +#: ../linkcheck/checker/ftpurl.py:235 +msgid "FTP file size too large" msgstr "" #: ../linkcheck/checker/fileurl.py:142 @@ -949,642 +862,717 @@ "should always use the system path in URLs." msgstr "" -#: ../linkcheck/checker/fileurl.py:190 ../linkcheck/checker/urlbase.py:706 -#: ../linkcheck/checker/httpurl.py:656 -msgid "File size too large" +#: ../linkcheck/checker/httpurl.py:136 +msgid "Access denied by robots.txt, skipping content checks." msgstr "" -#: ../linkcheck/checker/telneturl.py:52 -msgid "Host is empty" +#: ../linkcheck/checker/httpurl.py:143 +msgid "Amazon servers block HTTP HEAD requests." msgstr "" -#: ../linkcheck/checker/urlbase.py:69 -#, python-format -msgid "URL has unparsable domain name: %(name)s" +#: ../linkcheck/checker/httpurl.py:145 +msgid "Using GET method for Amazon server." +msgstr "" + +#: ../linkcheck/checker/httpurl.py:152 +msgid "unknown" msgstr "" -#: ../linkcheck/checker/urlbase.py:136 +#: ../linkcheck/checker/httpurl.py:154 #, python-format -msgid "Leading or trailing whitespace in URL `%(url)s'." +msgid "" +"Server `%(name)s' did not support HEAD request; a GET request was used " +"instead." msgstr "" -#: ../linkcheck/checker/urlbase.py:372 -msgid "URL is missing" +#: ../linkcheck/checker/httpurl.py:205 +#, python-format +msgid "Enforced proxy `%(name)s'." msgstr "" -#: ../linkcheck/checker/urlbase.py:375 -msgid "URL is empty" +#: ../linkcheck/checker/httpurl.py:210 +#, python-format +msgid "Enforced proxy `%(name)s' ignored, aborting." msgstr "" -#: ../linkcheck/checker/urlbase.py:382 +#: ../linkcheck/checker/httpurl.py:241 #, python-format -msgid "Effective URL %(url)r." +msgid "more than %d redirections, aborting" msgstr "" -#: ../linkcheck/checker/urlbase.py:435 +#: ../linkcheck/checker/httpurl.py:251 #, python-format -msgid "URL has invalid port %(port)r" +msgid "" +"Unsupported HTTP authentication `%(auth)s', only `Basic' authentication is " +"supported." msgstr "" -#: ../linkcheck/checker/urlbase.py:450 +#: ../linkcheck/checker/httpurl.py:315 #, python-format -msgid "URL %(url)s has obfuscated IP address %(ip)s" +msgid "Redirected to `%(url)s'." msgstr "" -#: ../linkcheck/checker/urlbase.py:477 +#: ../linkcheck/checker/httpurl.py:355 #, python-format -msgid "URL is located in %(country)s." +msgid "Redirection to url `%(newurl)s' is not allowed." msgstr "" -#: ../linkcheck/checker/urlbase.py:505 -msgid "Hostname not found" +#: ../linkcheck/checker/httpurl.py:378 +msgid "The redirected URL is outside of the domain filter, checked only syntax." msgstr "" -#: ../linkcheck/checker/urlbase.py:508 -#, python-format -msgid "Bad HTTP response %(line)r" +#: ../linkcheck/checker/httpurl.py:391 +msgid "Access to redirected URL denied by robots.txt, checked only syntax." msgstr "" -#: ../linkcheck/checker/urlbase.py:521 +#: ../linkcheck/checker/httpurl.py:409 #, python-format -msgid "could not get content: %(msg)r" +msgid "" +"recursive redirection encountered:\n" +" %(urls)s" msgstr "" -#: ../linkcheck/checker/urlbase.py:651 +#: ../linkcheck/checker/httpurl.py:426 #, python-format -msgid "Anchor `%(name)s' not found." +msgid "" +"Redirection to URL `%(newurl)s' with different scheme found; the original URL " +"was `%(url)s'." msgstr "" -#: ../linkcheck/checker/urlbase.py:652 +#: ../linkcheck/checker/httpurl.py:438 +msgid "HTTP 301 (moved permanent) encountered: you should update this link." +msgstr "" + +#: ../linkcheck/checker/httpurl.py:467 #, python-format -msgid "Available anchors: %(anchors)s." +msgid "Sent Cookie: %(cookie)s." msgstr "" -#: ../linkcheck/checker/urlbase.py:752 +#: ../linkcheck/checker/httpurl.py:473 #, python-format -msgid "Found %(match)r at line %(line)d in link contents." +msgid "Could not store cookies from headers: %(error)s." msgstr "" -#: ../linkcheck/checker/urlbase.py:768 -msgid "Content size is zero." +#: ../linkcheck/checker/httpurl.py:482 +#, python-format +msgid "Last modified %(date)s." msgstr "" -#: ../linkcheck/checker/urlbase.py:774 +#: ../linkcheck/checker/httpurl.py:631 #, python-format -msgid "Content size %(dlsize)s is larger than %(maxbytes)s." +msgid "Unsupported HTTP url scheme `%(scheme)s'" msgstr "" -#: ../linkcheck/checker/urlbase.py:779 +#: ../linkcheck/checker/httpurl.py:676 #, python-format -msgid "" -"Download size (%(dlsize)d Byte) does not equal content size (%(size)d Byte)." +msgid "Decompress error %(err)s" msgstr "" -#: ../linkcheck/checker/urlbase.py:789 -#: ../linkcheck/configuration/__init__.py:348 -msgid "" -"warning: tidy module is not available; download from http://utidylib.berlios." -"de/" +#: ../linkcheck/checker/httpurl.py:692 +#, python-format +msgid "Unsupported content encoding `%(encoding)s'." msgstr "" -#: ../linkcheck/checker/urlbase.py:802 ../linkcheck/checker/urlbase.py:871 -msgid "valid HTML syntax" +#: ../linkcheck/checker/nntpurl.py:45 +msgid "No NNTP server was specified, skipping this URL." msgstr "" -#: ../linkcheck/checker/urlbase.py:808 +#: ../linkcheck/checker/nntpurl.py:55 #, python-format -msgid "warning: tidy HTML parsing caused error: %(msg)s " +msgid "Article number %(num)s found." msgstr "" -#: ../linkcheck/checker/urlbase.py:818 -#: ../linkcheck/configuration/__init__.py:356 -msgid "" -"warning: cssutils module is not available; download from http://cthedot.de/" -"cssutils/" +#: ../linkcheck/checker/nntpurl.py:62 +#, python-format +msgid "News group %(name)s found." msgstr "" -#: ../linkcheck/checker/urlbase.py:834 ../linkcheck/checker/urlbase.py:907 -msgid "valid CSS syntax" +#: ../linkcheck/checker/nntpurl.py:65 +msgid "No newsgroup specified in NNTP URL." msgstr "" -#: ../linkcheck/checker/urlbase.py:840 +#: ../linkcheck/checker/nntpurl.py:89 #, python-format -msgid "warning: cssutils parsing caused error: %(msg)s" +msgid "NNTP server too busy; tried more than %d times." msgstr "" -#: ../linkcheck/checker/urlbase.py:849 -#, python-format -msgid "%(w3type)s validation error at line %(line)s col %(column)s: %(msg)s" +#: ../linkcheck/__init__.py:129 +msgid "CRITICAL" +msgstr "" + +#: ../linkcheck/__init__.py:130 +msgid "ERROR" +msgstr "" + +#: ../linkcheck/__init__.py:131 +msgid "WARN" +msgstr "" + +#: ../linkcheck/__init__.py:132 +msgid "WARNING" +msgstr "" + +#: ../linkcheck/__init__.py:133 +msgid "INFO" +msgstr "" + +#: ../linkcheck/__init__.py:134 +msgid "DEBUG" +msgstr "" + +#: ../linkcheck/__init__.py:135 +msgid "NOTSET" +msgstr "" + +#: ../linkcheck/__init__.py:146 +msgid "Running as root user; dropping privileges by changing user to nobody." +msgstr "" + +#: ../linkcheck/gui/linkchecker_ui_debug.py:22 +msgid "LinkChecker debug log" +msgstr "" + +#: ../linkcheck/gui/linkchecker_ui_main.py:26 +msgid "LinkChecker" +msgstr "" + +#: ../linkcheck/gui/linkchecker_ui_main.py:39 +msgid "URL:" +msgstr "" + +#: ../linkcheck/gui/linkchecker_ui_main.py:56 +msgid "Start checking the given URL." +msgstr "" + +#: ../linkcheck/gui/linkchecker_ui_main.py:71 +msgid "Active:" +msgstr "" + +#: ../linkcheck/gui/linkchecker_ui_main.py:76 +#: ../linkcheck/gui/linkchecker_ui_main.py:85 +#: ../linkcheck/gui/linkchecker_ui_main.py:94 +msgid "0" msgstr "" -#: ../linkcheck/checker/urlbase.py:880 -#, python-format -msgid "warning: HTML W3C validation caused error: %(msg)s " +#: ../linkcheck/gui/linkchecker_ui_main.py:80 +msgid "Queued:" msgstr "" -#: ../linkcheck/checker/urlbase.py:915 -#, python-format -msgid "warning: CSS W3C validation caused error: %(msg)s " +#: ../linkcheck/gui/linkchecker_ui_main.py:89 +msgid "Checked:" msgstr "" -#: ../linkcheck/checker/httpsurl.py:35 -#, python-format -msgid "%s URL ignored." +#: ../linkcheck/gui/linkchecker_ui_main.py:98 +msgid "Info:" msgstr "" -#: ../linkcheck/checker/ftpurl.py:110 -#, python-format -msgid "Remote host has closed connection: %(msg)s" +#: ../linkcheck/gui/linkchecker_ui_main.py:108 +msgid "-" msgstr "" -#: ../linkcheck/checker/ftpurl.py:117 -msgid "Got no answer from FTP server" +#: ../linkcheck/gui/linkchecker_ui_main.py:142 +msgid "URL properties" msgstr "" -#: ../linkcheck/checker/ftpurl.py:160 -msgid "Missing trailing directory slash in ftp url." +#: ../linkcheck/gui/linkchecker_ui_main.py:353 +msgid "Check results" msgstr "" -#: ../linkcheck/checker/ftpurl.py:235 -msgid "FTP file size too large" +#: ../linkcheck/gui/linkchecker_ui_main.py:363 +msgid "Valid URLs" msgstr "" -#: ../linkcheck/checker/nntpurl.py:45 -msgid "No NNTP server was specified, skipping this URL." +#: ../linkcheck/gui/linkchecker_ui_main.py:387 +msgid "Warnings" msgstr "" -#: ../linkcheck/checker/nntpurl.py:55 -#, python-format -msgid "Article number %(num)s found." +#: ../linkcheck/gui/linkchecker_ui_main.py:411 +msgid "Invalid URLs" msgstr "" -#: ../linkcheck/checker/nntpurl.py:62 -#, python-format -msgid "News group %(name)s found." +#: ../linkcheck/gui/linkchecker_ui_main.py:436 +msgid "Content type statistics" msgstr "" -#: ../linkcheck/checker/nntpurl.py:65 -msgid "No newsgroup specified in NNTP URL." +#: ../linkcheck/gui/linkchecker_ui_main.py:446 +msgid "Image" msgstr "" -#: ../linkcheck/checker/nntpurl.py:89 -#, python-format -msgid "NNTP server too busy; tried more than %d times." +#: ../linkcheck/gui/linkchecker_ui_main.py:470 +msgid "Text" msgstr "" -#: ../linkcheck/checker/const.py:104 -msgid "The effective URL is different from the original." +#: ../linkcheck/gui/linkchecker_ui_main.py:494 +msgid "Application" msgstr "" -#: ../linkcheck/checker/const.py:106 -msgid "Could not get the content of the URL." +#: ../linkcheck/gui/linkchecker_ui_main.py:518 +msgid "Audio" msgstr "" -#: ../linkcheck/checker/const.py:107 -msgid "URL anchor was not found." +#: ../linkcheck/gui/linkchecker_ui_main.py:542 +msgid "Video" msgstr "" -#: ../linkcheck/checker/const.py:109 -msgid "The warning regular expression was found in the URL contents." +#: ../linkcheck/gui/linkchecker_ui_main.py:580 +msgid "Other" msgstr "" -#: ../linkcheck/checker/const.py:110 -msgid "The URL content size is too large." +#: ../linkcheck/gui/linkchecker_ui_main.py:604 +msgid "Mail" msgstr "" -#: ../linkcheck/checker/const.py:111 -msgid "The URL content size is zero." +#: ../linkcheck/gui/linkchecker_ui_main.py:615 +msgid "URL statistics" msgstr "" -#: ../linkcheck/checker/const.py:112 -msgid "The URL content size and download size are unequal." +#: ../linkcheck/gui/linkchecker_ui_main.py:625 +msgid "Min. length" msgstr "" -#: ../linkcheck/checker/const.py:113 -msgid "The URL contains leading or trailing whitespace." +#: ../linkcheck/gui/linkchecker_ui_main.py:649 +msgid "Avg. length" msgstr "" -#: ../linkcheck/checker/const.py:114 -msgid "The file: URL is missing a trailing slash." +#: ../linkcheck/gui/linkchecker_ui_main.py:673 +msgid "Max. length" msgstr "" -#: ../linkcheck/checker/const.py:116 -msgid "The file: path is not the same as the system specific path." +#: ../linkcheck/gui/linkchecker_ui_main.py:697 +msgid "Domains" msgstr "" -#: ../linkcheck/checker/const.py:117 -msgid "The ftp: URL is missing a trailing slash." +#: ../linkcheck/gui/linkchecker_ui_main.py:723 +msgid "&Edit" msgstr "" -#: ../linkcheck/checker/const.py:118 -msgid "The http: URL checking has been denied." +#: ../linkcheck/gui/linkchecker_ui_main.py:726 +#: ../linkcheck/gui/linkchecker_ui_editor.py:34 +msgid "&File" msgstr "" -#: ../linkcheck/checker/const.py:119 -msgid "The URL has moved permanently." +#: ../linkcheck/gui/linkchecker_ui_main.py:729 +#: ../linkcheck/gui/linkchecker_ui_main.py:746 +msgid "&Help" msgstr "" -#: ../linkcheck/checker/const.py:121 -msgid "The URL has been redirected to an URL of a different type." +#: ../linkcheck/gui/linkchecker_ui_main.py:739 +msgid "A&bout" msgstr "" -#: ../linkcheck/checker/const.py:122 -msgid "The URL had no content." +#: ../linkcheck/gui/linkchecker_ui_main.py:740 +msgid "About" msgstr "" -#: ../linkcheck/checker/const.py:124 -msgid "An error occurred while storing a cookie." +#: ../linkcheck/gui/linkchecker_ui_main.py:747 +msgid "Help" msgstr "" -#: ../linkcheck/checker/const.py:126 -msgid "An error occurred while decompressing the URL content." +#: ../linkcheck/gui/linkchecker_ui_main.py:753 +msgid "View online" msgstr "" -#: ../linkcheck/checker/const.py:128 -msgid "The URL content is encoded with an unknown encoding." +#: ../linkcheck/gui/linkchecker_ui_main.py:754 +msgid "View URL online" msgstr "" -#: ../linkcheck/checker/const.py:130 -msgid "Unsupported HTTP authentication method." +#: ../linkcheck/gui/linkchecker_ui_main.py:760 +msgid "&Options" msgstr "" -#: ../linkcheck/checker/const.py:131 -msgid "The URL has been ignored." +#: ../linkcheck/gui/linkchecker_ui_main.py:761 +#: /usr/lib/python2.7/optparse.py:1626 +msgid "Options" msgstr "" -#: ../linkcheck/checker/const.py:132 -msgid "The mail MX host could not be found." +#: ../linkcheck/gui/linkchecker_ui_main.py:767 +msgid "Copy to clipboard" msgstr "" -#: ../linkcheck/checker/const.py:134 -msgid "The mailto: address could not be verified." +#: ../linkcheck/gui/linkchecker_ui_main.py:768 +msgid "Copy URL to clipboard" msgstr "" -#: ../linkcheck/checker/const.py:136 -msgid "No connection to a MX host could be established." +#: ../linkcheck/gui/linkchecker_ui_main.py:769 +msgid "Ctrl+C" msgstr "" -#: ../linkcheck/checker/const.py:137 -msgid "No NNTP server was found." +#: ../linkcheck/gui/linkchecker_ui_main.py:773 +msgid "View parent online" msgstr "" -#: ../linkcheck/checker/const.py:138 -msgid "The NNTP newsgroup could not be found." +#: ../linkcheck/gui/linkchecker_ui_main.py:774 +msgid "View parent URL online" msgstr "" -#: ../linkcheck/checker/const.py:139 -msgid "The IP is obfuscated." +#: ../linkcheck/gui/linkchecker_ui_main.py:778 +msgid "View parent source" msgstr "" -#: ../linkcheck/checker/mailtourl.py:87 -#, python-format -msgid "No mail addresses found in `%(url)s'." +#: ../linkcheck/gui/linkchecker_ui_main.py:779 +msgid "View parent URL source" msgstr "" -#: ../linkcheck/checker/mailtourl.py:126 -#, python-format -msgid "Error parsing CGI values: %s" +#: ../linkcheck/gui/linkchecker_ui_main.py:782 +msgid "Show debug" msgstr "" -#: ../linkcheck/checker/mailtourl.py:149 -#, python-format -msgid "" -"Mail address `%(addr)s' too long. Allowed 256 chars, was %(length)d chars." +#: ../linkcheck/gui/linkchecker_ui_main.py:785 +msgid "View properties" msgstr "" -#: ../linkcheck/checker/mailtourl.py:153 -#, python-format -msgid "Missing `@' in mail address `%(addr)s'." +#: ../linkcheck/gui/linkchecker_ui_main.py:786 +msgid "View URL properties" msgstr "" -#: ../linkcheck/checker/mailtourl.py:159 -#, python-format -msgid "Missing local part of mail address `%(addr)s'." +#: ../linkcheck/gui/linkchecker_ui_main.py:792 +msgid "&Save results..." msgstr "" -#: ../linkcheck/checker/mailtourl.py:163 -#, python-format -msgid "Missing domain part of mail address `%(addr)s'." +#: ../linkcheck/gui/linkchecker_ui_main.py:793 +#: ../linkcheck/gui/linkchecker_ui_editor.py:50 +msgid "Ctrl+S" msgstr "" -#: ../linkcheck/checker/mailtourl.py:167 -#, python-format -msgid "" -"Local part of mail address `%(addr)s' too long. Allowed 64 chars, was " -"%(length)d chars." +#: ../linkcheck/gui/linkchecker_ui_main.py:799 +msgid "&Quit" msgstr "" -#: ../linkcheck/checker/mailtourl.py:171 -#, python-format -msgid "" -"Domain part of mail address `%(addr)s' too long. Allowed 255 chars, was " -"%(length)d chars." +#: ../linkcheck/gui/linkchecker_ui_main.py:800 +msgid "Ctrl+Q" msgstr "" -#: ../linkcheck/checker/mailtourl.py:180 -#, python-format -msgid "Unquoted double quote or backslash in mail address `%(addr)s'." +#: ../linkcheck/gui/linkchecker_ui_main.py:803 +msgid "Check for updates" msgstr "" -#: ../linkcheck/checker/mailtourl.py:185 -#, python-format -msgid "Local part of mail address `%(addr)s' may not start with a dot." +#: ../linkcheck/gui/linkchecker_ui_main.py:806 +msgid "Donate" msgstr "" -#: ../linkcheck/checker/mailtourl.py:189 -#, python-format -msgid "Local part of mail address `%(addr)s' may not end with a dot." +#: ../linkcheck/gui/editor.py:104 +msgid "Save file?" msgstr "" -#: ../linkcheck/checker/mailtourl.py:193 -#, python-format -msgid "Local part of mail address `%(addr)s' may not contain two dots." +#: ../linkcheck/gui/editor.py:105 +msgid "The document has been modified." msgstr "" -#: ../linkcheck/checker/mailtourl.py:198 -#, python-format -msgid "" -"Local part of mail address `%(addr)s' contains unquoted character `%(char)s." +#: ../linkcheck/gui/editor.py:106 +msgid "Do you want to save your changes?" msgstr "" -#: ../linkcheck/checker/mailtourl.py:210 -#, python-format -msgid "Domain part of mail address `%(addr)s' has invalid IP." +#: ../linkcheck/gui/editor.py:115 +msgid "Save File As" msgstr "" -#: ../linkcheck/checker/mailtourl.py:216 -#, python-format -msgid "Invalid domain part of mail address `%(addr)s'." +#: ../linkcheck/gui/editor.py:158 +msgid "readonly" msgstr "" -#: ../linkcheck/checker/mailtourl.py:220 +#: ../linkcheck/gui/updater.py:40 #, python-format -msgid "Invalid top level domain part of mail address `%(addr)s'." +msgid "%(app)s update information" msgstr "" -#: ../linkcheck/checker/mailtourl.py:258 -#, python-format -msgid "No MX mail host for %(domain)s found." +#: ../linkcheck/gui/updater.py:50 +msgid "Checking for updates..." msgstr "" -#: ../linkcheck/checker/mailtourl.py:266 +#: ../linkcheck/gui/updater.py:58 #, python-format -msgid "No host for %(domain)s found." +msgid "Congratulations: the latest version %(app)s is installed." msgstr "" -#: ../linkcheck/checker/mailtourl.py:280 +#: ../linkcheck/gui/updater.py:65 #, python-format -msgid "Got invalid DNS answer %(answer)s for %(domain)s." +msgid "" +"Detected local or development version %(currentversion)s. Available version " +"of %(app)s is %(version)s." msgstr "" -#: ../linkcheck/checker/mailtourl.py:324 +#: ../linkcheck/gui/updater.py:69 #, python-format -msgid "Verified address %(mail)s: %(info)s." +msgid "" +"A new version %(version)s of %(app)s is available for download." msgstr "" -#: ../linkcheck/checker/mailtourl.py:328 -#, python-format -msgid "Unverified but presumably valid address %(mail)s: %(info)s." +#: ../linkcheck/gui/updater.py:77 +msgid "update thread has been terminated" msgstr "" -#: ../linkcheck/checker/mailtourl.py:331 +#: ../linkcheck/gui/updater.py:79 #, python-format -msgid "Unverified address: %(info)s." +msgid "An error occured while checking for an update of %(app)s: %(error)s." msgstr "" -#: ../linkcheck/checker/mailtourl.py:335 +#: ../linkcheck/gui/lineedit.py:175 #, python-format -msgid "MX mail host %(host)s did not accept connections: %(error)s." +msgid "Insert %(browser)s bookmark file" msgstr "" -#: ../linkcheck/checker/mailtourl.py:341 -msgid "Could not connect, but syntax is correct" +#: ../linkcheck/gui/options.py:104 +#: ../linkcheck/gui/linkchecker_ui_options.py:123 +msgid "Edit" msgstr "" -#: ../linkcheck/checker/mailtourl.py:344 -#, python-format -msgid "Found MX mail host %(host)s" +#: ../linkcheck/gui/options.py:106 +msgid "Read" msgstr "" - -#: ../linkcheck/checker/httpurl.py:136 -msgid "Access denied by robots.txt, skipping content checks." + +#: ../linkcheck/gui/options.py:109 +msgid "File not found" msgstr "" -#: ../linkcheck/checker/httpurl.py:143 -msgid "Amazon servers block HTTP HEAD requests." +#: ../linkcheck/gui/urlmodel.py:22 +msgid "Parent" msgstr "" -#: ../linkcheck/checker/httpurl.py:145 -msgid "Using GET method for Amazon server." +#: ../linkcheck/gui/urlsave.py:21 +msgid "HTML output (*.html)" msgstr "" -#: ../linkcheck/checker/httpurl.py:152 -msgid "unknown" +#: ../linkcheck/gui/urlsave.py:22 +msgid "Text output (*.txt)" msgstr "" -#: ../linkcheck/checker/httpurl.py:154 -#, python-format -msgid "" -"Server `%(name)s' did not support HEAD request; a GET request was used " -"instead." +#: ../linkcheck/gui/urlsave.py:23 +msgid "XML output (*.xml)" msgstr "" -#: ../linkcheck/checker/httpurl.py:205 -#, python-format -msgid "Enforced proxy `%(name)s'." +#: ../linkcheck/gui/urlsave.py:24 +msgid "CSV output (*.csv)" msgstr "" -#: ../linkcheck/checker/httpurl.py:210 -#, python-format -msgid "Enforced proxy `%(name)s' ignored, aborting." +#: ../linkcheck/gui/urlsave.py:57 +msgid "Save check results" msgstr "" -#: ../linkcheck/checker/httpurl.py:241 -#, python-format -msgid "more than %d redirections, aborting" +#: ../linkcheck/gui/linkchecker_ui_editor.py:27 +msgid "LinkChecker source view" msgstr "" -#: ../linkcheck/checker/httpurl.py:251 -#, python-format -msgid "" -"Unsupported HTTP authentication `%(auth)s', only `Basic' authentication is " -"supported." +#: ../linkcheck/gui/linkchecker_ui_editor.py:49 +msgid "&Save" msgstr "" -#: ../linkcheck/checker/httpurl.py:315 -#, python-format -msgid "Redirected to `%(url)s'." +#: ../linkcheck/gui/__init__.py:145 ../linkcheck/gui/__init__.py:456 +msgid "Ready." msgstr "" -#: ../linkcheck/checker/httpurl.py:355 -#, python-format -msgid "Redirection to url `%(newurl)s' is not allowed." +#: ../linkcheck/gui/__init__.py:172 +msgid "Check finished." msgstr "" -#: ../linkcheck/checker/httpurl.py:378 -msgid "The redirected URL is outside of the domain filter, checked only syntax." +#: ../linkcheck/gui/__init__.py:272 +msgid "Start" msgstr "" -#: ../linkcheck/checker/httpurl.py:391 -msgid "Access to redirected URL denied by robots.txt, checked only syntax." +#: ../linkcheck/gui/__init__.py:297 +msgid "Stop" msgstr "" -#: ../linkcheck/checker/httpurl.py:409 +#: ../linkcheck/gui/__init__.py:345 #, python-format -msgid "" -"recursive redirection encountered:\n" -" %(urls)s" +msgid "About %(appname)s" msgstr "" -#: ../linkcheck/checker/httpurl.py:426 +#: ../linkcheck/gui/__init__.py:346 #, python-format msgid "" -"Redirection to URL `%(newurl)s' with different scheme found; the original URL " -"was `%(url)s'." +"
\n" +"

%(app)s

\n" +"

Released on %(releasedate)s\n" +"

Python: %(pyver)s
\n" +"%(modules)s\n" +"

%(copyright)s\n" +"
%(appname)s is licensed under the\n" +"GPL\n" +"Version 2 or later.\n" +"

If you like %(appname)s, consider one of several ways to\n" +"donate. Thanks!\n" +"

" msgstr "" -#: ../linkcheck/checker/httpurl.py:438 -msgid "HTTP 301 (moved permanent) encountered: you should update this link." +#: ../linkcheck/gui/__init__.py:391 +msgid "Closing pending connections..." msgstr "" -#: ../linkcheck/checker/httpurl.py:467 -#, python-format -msgid "Sent Cookie: %(cookie)s." +#: ../linkcheck/gui/__init__.py:425 +msgid "Error, empty URL" msgstr "" -#: ../linkcheck/checker/httpurl.py:473 +#: ../linkcheck/gui/__init__.py:427 #, python-format -msgid "Could not store cookies from headers: %(error)s." +msgid "Checking '%s'." msgstr "" -#: ../linkcheck/checker/httpurl.py:482 +#: ../linkcheck/gui/__init__.py:433 #, python-format -msgid "Last modified %(date)s." +msgid "Error, invalid URL `%s'." msgstr "" -#: ../linkcheck/checker/httpurl.py:631 +#: ../linkcheck/gui/__init__.py:453 #, python-format -msgid "Unsupported HTTP url scheme `%(scheme)s'" -msgstr "" +msgid "%d URL selected." +msgid_plural "%d URLs selected" +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/checker/httpurl.py:676 -#, python-format -msgid "Decompress error %(err)s" +#: ../linkcheck/gui/__init__.py:533 +msgid "LinkChecker internal error" msgstr "" -#: ../linkcheck/checker/httpurl.py:692 -#, python-format -msgid "Unsupported content encoding `%(encoding)s'." +#: ../linkcheck/gui/linkchecker_ui_options.py:22 +msgid "Dialog" msgstr "" -#: ../linkcheck/__init__.py:129 -msgid "CRITICAL" +#: ../linkcheck/gui/linkchecker_ui_options.py:26 ../linkchecker:439 +msgid "Checking options" msgstr "" -#: ../linkcheck/__init__.py:130 -msgid "ERROR" +#: ../linkcheck/gui/linkchecker_ui_options.py:36 +#: ../linkcheck/gui/linkchecker_ui_options.py:47 +msgid "" +"Check recursively all links up to given depth. A negative depth will enable " +"infinite recursion." msgstr "" -#: ../linkcheck/__init__.py:131 -msgid "WARN" +#: ../linkcheck/gui/linkchecker_ui_options.py:37 +msgid "Recursive depth" msgstr "" -#: ../linkcheck/__init__.py:132 -msgid "WARNING" +#: ../linkcheck/gui/linkchecker_ui_options.py:54 +#: ../linkcheck/gui/linkchecker_ui_options.py:60 +msgid "Log all checked URLs once. Default is to log only errors and warnings." msgstr "" -#: ../linkcheck/__init__.py:133 -msgid "INFO" +#: ../linkcheck/gui/linkchecker_ui_options.py:55 +msgid "Verbose output" msgstr "" -#: ../linkcheck/__init__.py:134 -msgid "DEBUG" +#: ../linkcheck/gui/linkchecker_ui_options.py:65 +msgid "Debug" msgstr "" -#: ../linkcheck/__init__.py:135 -msgid "NOTSET" +#: ../linkcheck/gui/linkchecker_ui_options.py:76 +msgid "Warn when one of these strings are found (one per line):" msgstr "" -#: ../linkcheck/__init__.py:146 -msgid "Running as root user; dropping privileges by changing user to nobody." +#: ../linkcheck/gui/linkchecker_ui_options.py:84 +msgid "Ignore URLs matching one of these patterns (one per line):" msgstr "" -#: ../linkcheck/configuration/confparse.py:57 -#, python-format -msgid "Error parsing configuration: %s" +#: ../linkcheck/gui/linkchecker_ui_options.py:93 +msgid "Configuration file" msgstr "" -#: ../linkcheck/configuration/confparse.py:116 -#, python-format -msgid "invalid negative value for timeout: %d\n" +#: ../linkcheck/gui/linkchecker_ui_options.py:98 +msgid "" +"The configuration file holds advanced options and can be edited with an " +"integrated text editor." msgstr "" -#: ../linkcheck/configuration/confparse.py:168 -#, python-format -msgid "missing auth part in entry %(val)r" +#: ../linkcheck/gui/linkchecker_ui_options.py:110 +msgid "Overrides system wide configuration file settings." msgstr "" -#: ../linkcheck/configuration/confparse.py:174 -#, python-format -msgid "invalid login URL `%s'. Only HTTP and HTTPS URLs are supported." +#: ../linkcheck/gui/linkchecker_ui_options.py:113 +msgid "/home/user/.linkchecker/linkcheckerrc" msgstr "" -#: ../linkcheck/configuration/__init__.py:290 -msgid "warning: missing user or URL pattern in authentication data." +#: ../linkcheck/gui/linkchecker_ui_options.py:135 +msgid "Close" msgstr "" -#: ../linkcheck/configuration/__init__.py:340 -msgid "warning: activating text logger output." +#: ../linkcheck/lc_cgi.py:90 +#, python-format +msgid "URL has unparsable domain name: %s" msgstr "" -#: ../linkcheck/configuration/__init__.py:366 -msgid "warning: Clamav could not be initialized" +#: ../linkcheck/lc_cgi.py:113 +msgid "unsupported language" msgstr "" -#: ../linkcheck/configuration/__init__.py:372 -msgid "warning: activating sendcookies because storecookies is active." +#: ../linkcheck/lc_cgi.py:118 +msgid "empty url was given" msgstr "" -#: ../linkcheck/configuration/__init__.py:382 -msgid "warning: no CGI password fieldname given for login URL." +#: ../linkcheck/lc_cgi.py:120 +msgid "disallowed url was given" msgstr "" -#: ../linkcheck/configuration/__init__.py:386 -msgid "warning: no CGI user fieldname given for login URL." +#: ../linkcheck/lc_cgi.py:122 +msgid "no url was given" msgstr "" -#: ../linkcheck/configuration/__init__.py:390 -msgid "warning: no user/password authentication data found for login URL." +#: ../linkcheck/lc_cgi.py:127 +msgid "invalid recursion level" msgstr "" -#: ../linkcheck/configuration/__init__.py:393 -msgid "warning: login URL is not a HTTP URL." +#: ../linkcheck/lc_cgi.py:132 +#, python-format +msgid "invalid %s option syntax" msgstr "" -#: ../linkcheck/configuration/__init__.py:397 -msgid "warning: login URL is incomplete." +#: ../linkcheck/lc_cgi.py:154 +#, python-format +msgid "" +"\n" +"\n" +"LinkChecker Online Error\n" +"\n" +"
\n" +"Error: %s
\n" +"The LinkChecker Online script has encountered an error. Please ensure\n" +"that your provided URL link begins with http:// and\n" +"contains only these characters: A-Za-z0-9./_~-

\n" +"Errors are logged.\n" +"
\n" +"\n" +"" msgstr "" -#: ../linkcheck/configuration/__init__.py:401 +#: ../linkcheck/strformat.py:230 #, python-format -msgid "warning: disabling login URL %(url)s." +msgid "%(prefix)s%(duration).02f seconds" msgstr "" -#: ../linkcheck/clamav.py:56 -msgid "clamd is not ready for stream scanning" -msgstr "" +#: ../linkcheck/strformat.py:233 +#, python-format +msgid "%d second" +msgid_plural "%d seconds" +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/clamav.py:126 -msgid "ScannerDaemonOutputFormat must be disabled" -msgstr "" +#: ../linkcheck/strformat.py:234 +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/clamav.py:128 -msgid "only one of TCPSocket and LocalSocket must be enabled" -msgstr "" +#: ../linkcheck/strformat.py:235 +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" -#: ../linkcheck/clamav.py:157 -msgid "one of TCPSocket or LocalSocket must be enabled" -msgstr "" +#: ../linkcheck/strformat.py:236 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#: ../linkcheck/strformat.py:237 +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" #: ../linkchecker:53 msgid "USAGE\tlinkchecker [options] [file-or-url]...\n" @@ -1775,11 +1763,11 @@ msgid "Syntax error in %(arg)r: %(msg)s" msgstr "" -#: ../linkchecker:322 +#: ../linkchecker:323 msgid "General options" msgstr "" -#: ../linkchecker:326 +#: ../linkchecker:327 msgid "" "Use FILENAME as configuration file. Per default LinkChecker first\n" "searches /etc/linkchecker/linkcheckerrc and then ~/.linkchecker/" @@ -1787,43 +1775,39 @@ "(under Windows \\linkcheckerrc)." msgstr "" -#: ../linkchecker:332 ../linkchecker:340 ../linkchecker:346 -msgid "This option is deprecated and does nothing." -msgstr "" - -#: ../linkchecker:336 +#: ../linkchecker:333 msgid "" "Generate no more than the given number of threads. Default number\n" "of threads is 10. To disable threading specify a non-positive number." msgstr "" -#: ../linkchecker:342 +#: ../linkchecker:336 msgid "Print version and exit." msgstr "" -#: ../linkchecker:349 +#: ../linkchecker:339 msgid "Read list of white-space separated URLs to check from stdin." msgstr "" -#: ../linkchecker:353 +#: ../linkchecker:343 msgid "Output options" msgstr "" -#: ../linkchecker:356 +#: ../linkchecker:346 msgid "Log all URLs. Default is to log only errors and warnings." msgstr "" -#: ../linkchecker:358 +#: ../linkchecker:348 msgid "" "Log all URLs, including duplicates.\n" "Default is to log duplicate URLs only once." msgstr "" -#: ../linkchecker:361 +#: ../linkchecker:351 msgid "Don't log warnings. Default is to log warnings." msgstr "" -#: ../linkchecker:365 +#: ../linkchecker:355 msgid "" "Define a regular expression which prints a warning if it matches\n" "any content of the checked link. This applies only to valid pages,\n" @@ -1837,39 +1821,39 @@ "for example \"(This page has moved|Oracle Application error)\"." msgstr "" -#: ../linkchecker:378 +#: ../linkchecker:368 msgid "" "Print a warning if content size info is available and exceeds the\n" "given number of bytes." msgstr "" -#: ../linkchecker:382 +#: ../linkchecker:372 msgid "Check syntax of HTML URLs with local library (HTML tidy)." msgstr "" -#: ../linkchecker:385 +#: ../linkchecker:375 msgid "Check syntax of HTML URLs with W3C online validator." msgstr "" -#: ../linkchecker:388 +#: ../linkchecker:378 msgid "Check syntax of CSS URLs with local library (cssutils)." msgstr "" -#: ../linkchecker:391 +#: ../linkchecker:381 msgid "Check syntax of CSS URLs with W3C online validator." msgstr "" -#: ../linkchecker:394 +#: ../linkchecker:384 msgid "Scan content of URLs with ClamAV virus scanner." msgstr "" -#: ../linkchecker:397 +#: ../linkchecker:387 msgid "" "Quiet operation, an alias for '-o none'.\n" "This is only useful with -F." msgstr "" -#: ../linkchecker:402 +#: ../linkchecker:392 #, python-format msgid "" "Specify output as %(loggertypes)s. Default output type is text.\n" @@ -1879,7 +1863,7 @@ "html." msgstr "" -#: ../linkchecker:411 +#: ../linkchecker:401 #, python-format msgid "" "Output to a file linkchecker-out.TYPE, $HOME/.linkchecker/blacklist for\n" @@ -1896,11 +1880,11 @@ "suppress all console output with the option '-o none'." msgstr "" -#: ../linkchecker:425 +#: ../linkchecker:415 msgid "Do not print check status messages." msgstr "" -#: ../linkchecker:428 +#: ../linkchecker:418 #, python-format msgid "" "Print debugging output for the given logger.\n" @@ -1912,44 +1896,40 @@ "For accurate results, threading will be disabled during debug runs." msgstr "" -#: ../linkchecker:437 +#: ../linkchecker:427 msgid "Print tracing information." msgstr "" -#: ../linkchecker:440 +#: ../linkchecker:430 #, python-format msgid "" "Write profiling data into a file named %s in the\n" "current working directory. See also --viewprof." msgstr "" -#: ../linkchecker:444 +#: ../linkchecker:434 msgid "Print out previously generated profiling data. See also --profile." msgstr "" -#: ../linkchecker:449 -msgid "Checking options" -msgstr "" - -#: ../linkchecker:453 +#: ../linkchecker:443 msgid "" "Check recursively all links up to given depth. A negative depth\n" "will enable infinite recursion. Default depth is infinite." msgstr "" -#: ../linkchecker:458 +#: ../linkchecker:448 msgid "" "Check but do not recurse into URLs matching the given regular\n" "expression. This option can be given multiple times." msgstr "" -#: ../linkchecker:463 +#: ../linkchecker:453 msgid "" "Only check syntax of URLs matching the given regular expression.\n" " This option can be given multiple times." msgstr "" -#: ../linkchecker:467 +#: ../linkchecker:457 msgid "" "Accept and send HTTP cookies according to RFC 2109. Only cookies\n" "which are sent back to the originating server are accepted.\n" @@ -1957,207 +1937,207 @@ "information." msgstr "" -#: ../linkchecker:474 +#: ../linkchecker:464 msgid "" "Read a file with initial cookie data. The cookie data format is\n" "explained below." msgstr "" -#: ../linkchecker:478 +#: ../linkchecker:468 msgid "" "Check HTTP anchor references. Default is not to check anchors.\n" "This option enables logging of the warning 'url-anchor-not-found'." msgstr "" -#: ../linkchecker:483 +#: ../linkchecker:473 msgid "" "Try the given username for HTTP and FTP authorization.\n" "For FTP the default username is 'anonymous'. For HTTP there is\n" "no default username. See also -p." msgstr "" -#: ../linkchecker:489 +#: ../linkchecker:479 msgid "" "Read a password from console and use it for HTTP and FTP authorization.\n" "For FTP the default password is 'anonymous@'. For HTTP there is\n" "no default password. See also -u." msgstr "" -#: ../linkchecker:495 +#: ../linkchecker:485 #, python-format msgid "" "Set the timeout for connection attempts in seconds. The default\n" "timeout is %d seconds." msgstr "" -#: ../linkchecker:500 +#: ../linkchecker:490 msgid "" "Pause the given number of seconds between two subsequent connection\n" "requests to the same host. Default is no pause between requests." msgstr "" -#: ../linkchecker:505 +#: ../linkchecker:495 msgid "" "Specify an NNTP server for 'news:...' links. Default is the\n" "environment variable NNTP_SERVER. If no host is given,\n" "only the syntax of the link is checked." msgstr "" -#: ../linkchecker:511 +#: ../linkchecker:501 msgid "" "Specify the User-Agent string to send to the HTTP server, for example\n" "\"Mozilla/4.0\". The default is \"LinkChecker/X.Y\" where X.Y is the current\n" "version of LinkChecker." msgstr "" -#: ../linkchecker:549 +#: ../linkchecker:539 #, python-format msgid "URL has unparsable domain name: %(domain)s" msgstr "" -#: ../linkchecker:574 +#: ../linkchecker:564 #, python-format msgid "Invalid debug level %(level)r" msgstr "" -#: ../linkchecker:587 +#: ../linkchecker:577 #, python-format msgid "Unreadable config file: %r" msgstr "" -#: ../linkchecker:595 +#: ../linkchecker:585 msgid "Running with python -O disables debugging." msgstr "" -#: ../linkchecker:617 ../linkchecker:648 +#: ../linkchecker:607 ../linkchecker:638 #, python-format msgid "Unknown logger type %(type)r in %(output)r for option %(option)s" msgstr "" -#: ../linkchecker:621 ../linkchecker:654 +#: ../linkchecker:611 ../linkchecker:644 #, python-format msgid "Unknown encoding %(encoding)r in %(output)r for option %(option)s" msgstr "" -#: ../linkchecker:666 +#: ../linkchecker:656 #, python-format msgid "Enter LinkChecker HTTP/FTP password for user %(user)s:" msgstr "" -#: ../linkchecker:669 +#: ../linkchecker:659 msgid "Enter LinkChecker HTTP/FTP password:" msgstr "" -#: ../linkchecker:676 ../linkchecker:694 +#: ../linkchecker:666 ../linkchecker:684 #, python-format msgid "Illegal argument %(arg)r for option %(option)s" msgstr "" -#: ../linkchecker:733 +#: ../linkchecker:723 #, python-format msgid "Enter LinkChecker password for user %(user)s at %(strpattern)s:" msgstr "" -#: ../linkchecker:750 +#: ../linkchecker:740 msgid "" "Using DOT or GML loggers without --complete output gives an incomplete " "sitemap graph." msgstr "" -#: ../linkchecker:763 +#: ../linkchecker:753 #, python-format msgid "Could not parse cookie file: %s" msgstr "" -#: ../linkchecker:777 +#: ../linkchecker:767 msgid "no files or URLs given" msgstr "" -#: ../linkchecker:782 +#: ../linkchecker:772 #, python-format msgid "" "Overwrite profiling file %(file)r?\n" "Press Ctrl-C to cancel, RETURN to continue." msgstr "" -#: ../linkchecker:788 +#: ../linkchecker:778 msgid "Canceled." msgstr "" -#: ../linkchecker:792 +#: ../linkchecker:782 msgid "" "The `profile' Python module is not installed, therefore the --profile option " "is disabled." msgstr "" -#: /usr/lib/python2.6/optparse.py:140 +#: /usr/lib/python2.7/optparse.py:140 #, python-format msgid "no such option: %s" msgstr "" -#: /usr/lib/python2.6/optparse.py:151 +#: /usr/lib/python2.7/optparse.py:151 #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" -#: /usr/lib/python2.6/optparse.py:374 +#: /usr/lib/python2.7/optparse.py:374 #, python-format msgid "Usage: %s\n" msgstr "" -#: /usr/lib/python2.6/optparse.py:393 +#: /usr/lib/python2.7/optparse.py:393 msgid "Usage" msgstr "" -#: /usr/lib/python2.6/optparse.py:418 +#: /usr/lib/python2.7/optparse.py:418 msgid "integer" msgstr "" -#: /usr/lib/python2.6/optparse.py:419 +#: /usr/lib/python2.7/optparse.py:419 msgid "long integer" msgstr "" -#: /usr/lib/python2.6/optparse.py:420 +#: /usr/lib/python2.7/optparse.py:420 msgid "floating-point" msgstr "" -#: /usr/lib/python2.6/optparse.py:421 +#: /usr/lib/python2.7/optparse.py:421 msgid "complex" msgstr "" -#: /usr/lib/python2.6/optparse.py:429 +#: /usr/lib/python2.7/optparse.py:429 #, python-format msgid "option %s: invalid %s value: %r" msgstr "" -#: /usr/lib/python2.6/optparse.py:437 +#: /usr/lib/python2.7/optparse.py:437 #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" -#: /usr/lib/python2.6/optparse.py:1245 +#: /usr/lib/python2.7/optparse.py:1250 msgid "show this help message and exit" msgstr "" -#: /usr/lib/python2.6/optparse.py:1250 +#: /usr/lib/python2.7/optparse.py:1255 msgid "show program's version number and exit" msgstr "" -#: /usr/lib/python2.6/optparse.py:1273 +#: /usr/lib/python2.7/optparse.py:1278 msgid "%prog [options]" msgstr "" -#: /usr/lib/python2.6/optparse.py:1493 /usr/lib/python2.6/optparse.py:1532 +#: /usr/lib/python2.7/optparse.py:1498 /usr/lib/python2.7/optparse.py:1537 #, python-format msgid "%s option requires an argument" msgstr "" -#: /usr/lib/python2.6/optparse.py:1495 /usr/lib/python2.6/optparse.py:1534 +#: /usr/lib/python2.7/optparse.py:1500 /usr/lib/python2.7/optparse.py:1539 #, python-format msgid "%s option requires %d arguments" msgstr "" -#: /usr/lib/python2.6/optparse.py:1504 +#: /usr/lib/python2.7/optparse.py:1509 #, python-format msgid "%s option does not take a value" msgstr "" diff -Nru linkchecker-7.2/po/Makefile linkchecker-7.4/po/Makefile --- linkchecker-7.2/po/Makefile 2011-04-04 17:26:12.000000000 +0000 +++ linkchecker-7.4/po/Makefile 2011-12-20 19:15:00.000000000 +0000 @@ -2,7 +2,7 @@ MSGFMT := msgfmt MSGMERGE := msgmerge POSOURCES = $(shell find ../linkcheck -name \*.py) \ - ../linkchecker ../linkchecker-gui /usr/lib/python2.6/optparse.py + ../linkchecker ../linkchecker-gui /usr/lib/python2.7/optparse.py LDIR = ../share/locale PACKAGE = linkchecker TEMPLATE = $(PACKAGE).pot diff -Nru linkchecker-7.2/readme.txt linkchecker-7.4/readme.txt --- linkchecker-7.2/readme.txt 2011-01-09 11:44:10.000000000 +0000 +++ linkchecker-7.4/readme.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -Install documentation is at doc/install.txt -Usage documentation is at doc/html/index.txt or execute -linkchecker --help diff -Nru linkchecker-7.2/README.txt linkchecker-7.4/README.txt --- linkchecker-7.2/README.txt 1970-01-01 00:00:00.000000000 +0000 +++ linkchecker-7.4/README.txt 2011-11-05 12:57:30.000000000 +0000 @@ -0,0 +1,3 @@ +Install documentation is at doc/install.txt +Usage documentation is at doc/html/index.txt or execute +linkchecker --help diff -Nru linkchecker-7.2/setup.py linkchecker-7.4/setup.py --- linkchecker-7.2/setup.py 2011-10-20 08:05:46.000000000 +0000 +++ linkchecker-7.4/setup.py 2012-01-06 07:33:06.000000000 +0000 @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: iso-8859-1 -*- -# Copyright (C) 2000-2011 Bastian Kleineidam +# Copyright (C) 2000-2012 Bastian Kleineidam # # 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 @@ -31,8 +31,8 @@ import sys if not (hasattr(sys, 'version_info') or - sys.version_info < (2, 6, 0, 'final', 0)): - raise SystemExit("This program requires Python 2.6 or later.") + sys.version_info < (2, 7, 0, 'final', 0)): + raise SystemExit("This program requires Python 2.7 or later.") import os import re import subprocess @@ -67,7 +67,7 @@ pass from distutils.core import Distribution -AppVersion = "7.2" +AppVersion = "7.4" AppName = "LinkChecker" # basic includes for py2exe and py2app @@ -522,7 +522,7 @@ data_files = [ ('share/linkchecker', - ['config/linkcheckerrc', 'config/logging.conf', + ['config/linkcheckerrc', 'doc/html/lccollection.qhc', 'doc/html/lcdoc.qch']), ('share/linkchecker/examples', ['cgi-bin/lconline/leer.html.en', diff -Nru linkchecker-7.2/tests/cache/test_addrinfo.py linkchecker-7.4/tests/cache/test_addrinfo.py --- linkchecker-7.2/tests/cache/test_addrinfo.py 1970-01-01 00:00:00.000000000 +0000 +++ linkchecker-7.4/tests/cache/test_addrinfo.py 2011-12-08 22:29:27.000000000 +0000 @@ -0,0 +1,39 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2011 Bastian Kleineidam +# +# 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) any later version. +# +# 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +""" +Test address info caching. +""" +import unittest +import socket +from linkcheck import LinkCheckerError +from linkcheck.cache.addrinfo import getaddrinfo + +class TestAddrinfoCache (unittest.TestCase): + """Test address info caching.""" + + def test_addrinfo_cache1 (self): + # pure ascii hostname with >63 chars + host = u"a"*64 + port = 80 + # must not raise UnicodeEncodeError + self.assertRaises(socket.error, getaddrinfo, host, port) + + def test_addrinfo_cache2 (self): + # non-ascii hostname with >63 chars + host = u"ä"*64 + port = 80 + self.assertRaises(LinkCheckerError, getaddrinfo, host, port) diff -Nru linkchecker-7.2/tests/checker/data/archive.html linkchecker-7.4/tests/checker/data/archive.html --- linkchecker-7.2/tests/checker/data/archive.html 1970-01-01 00:00:00.000000000 +0000 +++ linkchecker-7.4/tests/checker/data/archive.html 2011-12-30 11:33:49.000000000 +0000 @@ -0,0 +1,2 @@ + + diff -Nru linkchecker-7.2/tests/checker/data/archive.html.result linkchecker-7.4/tests/checker/data/archive.html.result --- linkchecker-7.2/tests/checker/data/archive.html.result 1970-01-01 00:00:00.000000000 +0000 +++ linkchecker-7.4/tests/checker/data/archive.html.result 2011-12-30 11:36:02.000000000 +0000 @@ -0,0 +1,16 @@ +url file://%(curdir)s/%(datadir)s/archive.html +cache key file://%(curdir)s/%(datadir)s/archive.html +real url file://%(curdir)s/%(datadir)s/archive.html +name %(datadir)s/archive.html +valid + +url file.html +cache key file://%(curdir)s/%(datadir)s/file.html +real url file://%(curdir)s/%(datadir)s/file.html +valid + +url http://www.example.com +cache key http://www.example.com +real url http://www.iana.org/domains/example/ +info Redirected to `http://www.iana.org/domains/example/'. +valid diff -Nru linkchecker-7.2/tests/checker/data/html5.html linkchecker-7.4/tests/checker/data/html5.html --- linkchecker-7.2/tests/checker/data/html5.html 1970-01-01 00:00:00.000000000 +0000 +++ linkchecker-7.4/tests/checker/data/html5.html 2011-12-30 11:26:20.000000000 +0000 @@ -0,0 +1,7 @@ + +