diff --git a/doc/changelog.txt b/doc/changelog.txt index fd9a79b6..bece744b 100644 --- a/doc/changelog.txt +++ b/doc/changelog.txt @@ -8,6 +8,7 @@ Changes: - doc: Mention 7-zip to extract the .tar.xz under Windows. Closes: SF bug #3564733 - checking: Send a HTTP Do-Not-Track header. +- logging: Print download and cache statistics in text output logger. Fixes: - logging: Close logger properly on I/O errors. diff --git a/linkcheck/cache/addrinfo.py b/linkcheck/cache/addrinfo.py index 3d354b19..d910da76 100644 --- a/linkcheck/cache/addrinfo.py +++ b/linkcheck/cache/addrinfo.py @@ -25,31 +25,54 @@ from ..containers import LFUCache from ..decorators import synchronized _lock = get_lock("addrinfo") -addrinfos = LFUCache(size=10000) + +class AddrInfo(object): + + def __init__(self): + self.addrinfos = LFUCache(size=100) + self.misses = self.hits = 0 + + def getaddrinfo(self, host, port): + """Determine address information for given host and port for + streaming sockets (SOCK_STREAM). + Already cached information is used.""" + key = u"%s:%s" % (unicode(host), unicode(port)) + if key in self.addrinfos: + self.hits += 1 + value = self.addrinfos[key] + else: + self.misses += 1 + # 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) + self.addrinfos[key] = value + if isinstance(value, Exception): + raise value + return value + +_addrinfo = AddrInfo() @synchronized(_lock) -def getaddrinfo (host, port): +def getaddrinfo(host, port): """Determine address information for given host and port for streaming sockets (SOCK_STREAM). Already cached information is used.""" - key = u"%s:%s" % (unicode(host), unicode(port)) - 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 - return value + return _addrinfo.getaddrinfo(host, port) + +@synchronized(_lock) +def getstats(): + """Get cache statistics. + @return: hits and misses + @rtype tuple(int, int) + """ + return _addrinfo.hits, _addrinfo.misses diff --git a/linkcheck/cache/robots_txt.py b/linkcheck/cache/robots_txt.py index cc2eb74c..09ed88c1 100644 --- a/linkcheck/cache/robots_txt.py +++ b/linkcheck/cache/robots_txt.py @@ -37,12 +37,17 @@ class RobotsTxt (object): """Initialize per-URL robots.txt cache.""" # mapping {URL -> parsed robots.txt} self.cache = LFUCache(size=100) + self.hits = self.misses = 0 @synchronized(_lock) def allows_url (self, roboturl, url, proxy, user, password, callback=None): """Ask robots.txt allowance.""" useragent = str(configuration.UserAgent) - if roboturl not in self.cache: + if roboturl in self.cache: + self.hits += 1 + rp = self.cache[roboturl] + else: + self.misses = 1 rp = robotparser2.RobotFileParser(proxy=proxy, user=user, password=password) rp.set_url(roboturl) @@ -53,6 +58,4 @@ class RobotsTxt (object): wait = rp.get_crawldelay(useragent) callback(host, wait) self.cache[roboturl] = rp - else: - rp = self.cache[roboturl] return rp.can_fetch(useragent, url) diff --git a/linkcheck/checker/ftpurl.py b/linkcheck/checker/ftpurl.py index 08a3c72f..9a32f621 100644 --- a/linkcheck/checker/ftpurl.py +++ b/linkcheck/checker/ftpurl.py @@ -220,6 +220,7 @@ class FtpUrl (internpaturl.InternPatternUrl, proxysupport.ProxySupport): buf = StringIO() def stor_data (s): """Helper method storing given data""" + self.aggregate.add_download_bytes(len(s)) # limit the download size if (buf.tell() + len(s)) > self.MaxFilesizeBytes: raise LinkCheckerError(_("FTP file size too large")) diff --git a/linkcheck/checker/httpurl.py b/linkcheck/checker/httpurl.py index 4c97af48..5a2a6dc8 100644 --- a/linkcheck/checker/httpurl.py +++ b/linkcheck/checker/httpurl.py @@ -695,6 +695,7 @@ class HttpUrl (internpaturl.InternPatternUrl, proxysupport.ProxySupport): read_content()""" data = response.read() self._size = len(data) + self.aggregate.add_download_bytes(self._size) encoding = headers.get_content_encoding(self.headers) if encoding in _supported_encodings: try: diff --git a/linkcheck/checker/urlbase.py b/linkcheck/checker/urlbase.py index fe3b0f9e..7b631f9c 100644 --- a/linkcheck/checker/urlbase.py +++ b/linkcheck/checker/urlbase.py @@ -292,6 +292,10 @@ class UrlBase (object): """ return False + def is_local(self): + """Return True for local (ie. file://) URLs.""" + return self.is_file() + def add_warning (self, s, tag=None): """ Add a warning string. @@ -729,6 +733,8 @@ class UrlBase (object): if self.size > self.MaxFilesizeBytes: raise LinkCheckerError(_("File size too large")) data = self.url_connection.read() + if not self.is_local(): + self.aggregate.add_download_bytes(len(data)) return data, len(data) def check_content (self): diff --git a/linkcheck/director/aggregator.py b/linkcheck/director/aggregator.py index adf15cb0..cdb5d615 100644 --- a/linkcheck/director/aggregator.py +++ b/linkcheck/director/aggregator.py @@ -21,12 +21,13 @@ import time import threading from .. import log, LOG_CHECK from ..decorators import synchronized -from ..cache import urlqueue +from ..cache import urlqueue, addrinfo from . import logger, status, checker, cleanup _w3_time_lock = threading.Lock() _threads_lock = threading.Lock() +_download_lock = threading.Lock() class Aggregate (object): """Store thread-safe data collections for checker threads.""" @@ -41,6 +42,7 @@ class Aggregate (object): self.logger = logger.Logger(config) self.threads = [] self.last_w3_call = 0 + self.downloaded_bytes = 0 @synchronized(_threads_lock) def start_threads (self): @@ -118,6 +120,7 @@ class Aggregate (object): for t in self.threads: t.stop() self.connections.clear() + self.gather_statistics() @synchronized(_threads_lock) def is_finished (self): @@ -131,3 +134,21 @@ class Aggregate (object): if time.time() - self.last_w3_call < 1: time.sleep(1) self.last_w3_call = time.time() + + @synchronized(_download_lock) + def add_download_bytes(self, bytes): + """Add gibven bytes to number of downloaded bytes. + @param bytes: number of bytes downloaded + @ptype bytes: int + """ + self.downloaded_bytes += bytes + + def gather_statistics(self): + """Gather download and cache statistics and send them to the + logger. + """ + robots_txt_stats = self.robots_txt.hits, self.robots_txt.misses + addrinfo_stats = addrinfo.getstats() + download_stats = self.downloaded_bytes + self.logger.add_statistics(robots_txt_stats, addrinfo_stats, + download_stats) diff --git a/linkcheck/director/logger.py b/linkcheck/director/logger.py index 95893184..1313a259 100644 --- a/linkcheck/director/logger.py +++ b/linkcheck/director/logger.py @@ -47,6 +47,11 @@ class Logger (object): for logger in self.loggers: logger.end_output() + def add_statistics(self, robots_txt_stats, addrinfo_stats, download_stats): + """Add statistics to logger.""" + for logger in self.loggers: + logger.add_statistics(robots_txt_stats, addrinfo_stats, download_stats) + def do_print (self, url_data): """Determine if URL entry should be logged or not.""" if self.complete: diff --git a/linkcheck/logger/__init__.py b/linkcheck/logger/__init__.py index 500386dc..3c6b9b61 100644 --- a/linkcheck/logger/__init__.py +++ b/linkcheck/logger/__init__.py @@ -82,12 +82,20 @@ class LogStatistics (object): self.warnings_printed = 0 # number of internal errors self.internal_errors = 0 + # the set of checked domains self.domains = set() + # link types self.link_types = ContentTypes.copy() + # URL length statistics self.max_url_length = 0 self.min_url_length = 0 self.avg_url_length = 0.0 self.avg_number = 0 + # download stats + self.downloaded_bytes = None + # cache stats + self.robots_txt_stats = None + self.addrinfo_stats = None def log_url (self, url_data, do_print): """Log URL statistics.""" @@ -422,6 +430,12 @@ class Logger (object): log.warn(LOG_CHECK, "internal error occurred") self.stats.log_internal_error() + def add_statistics(self, robots_txt_stats, addrinfo_stats, download_stats): + """Add cache and download statistics.""" + self.stats.robots_txt_stats = robots_txt_stats + self.stats.addrinfo_stats = addrinfo_stats + self.stats.downloaded_bytes = download_stats + # the standard URL logger implementations from .text import TextLogger diff --git a/linkcheck/logger/text.py b/linkcheck/logger/text.py index cbb3a3d6..b73c6a90 100644 --- a/linkcheck/logger/text.py +++ b/linkcheck/logger/text.py @@ -238,6 +238,12 @@ class TextLogger (Logger): """Write check statistic info.""" self.writeln() self.writeln(_("Statistics:")) + if self.stats.downloaded_bytes > 0: + self.writeln(_("Downloaded: %s") % strformat.strsize(self.stats.downloaded_bytes)) + hitsmisses = strformat.str_cache_stats(*self.stats.robots_txt_stats) + self.writeln(_("Robots.txt cache: %s") % hitsmisses) + hitsmisses = strformat.str_cache_stats(*self.stats.addrinfo_stats) + self.writeln(_("DNS cache: %s") % hitsmisses) if len(self.stats.domains) > 1: self.writeln(_("Number of domains: %d") % len(self.stats.domains)) if self.stats.number > 0: diff --git a/linkcheck/strformat.py b/linkcheck/strformat.py index a54d99ca..8c5a0ee6 100644 --- a/linkcheck/strformat.py +++ b/linkcheck/strformat.py @@ -317,3 +317,17 @@ def format_feature_warning (**kwargs): be installed for a certain URL. """ return _("Could not import %(module)s for %(feature)s. Install %(module)s from %(url)s to use this feature.") % kwargs + + +def str_cache_stats(hits, misses): + """Format hits and misses string for cache statistics. + @param hits: number of hits + @ptype hits: int + @param misses: number of cache misses + @ptype misses: int + @return: string with this and misses + @rtype: unicode + """ + strhits = _n("%d hit", "%d hits", hits) % hits + strmisses = _n("%d miss", "%d misses", misses) % misses + return u"%s, %s" % (strhits, strmisses) diff --git a/po/de.po b/po/de.po index 7b3fde96..1e43bd49 100644 --- a/po/de.po +++ b/po/de.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: $Id$\n" "Report-Msgid-Bugs-To: calvin@users.sourceforge.net\n" -"POT-Creation-Date: 2012-09-02 19:55+0200\n" -"PO-Revision-Date: 2012-09-02 19:56+0100\n" +"POT-Creation-Date: 2012-09-16 11:53+0200\n" +"PO-Revision-Date: 2012-09-16 11:55+0100\n" "Last-Translator: Bastian Kleineidam \n" "Language-Team: de \n" "Language: \n" @@ -15,7 +15,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../linkcheck/director/aggregator.py:71 +#: ../linkcheck/director/aggregator.py:73 msgid "These URLs are still active:" msgstr "Folgende URLs sind noch aktiv:" @@ -121,15 +121,15 @@ msgstr "Fehler bei Login URL: %(msg)s." 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/director/__init__.py:179 +#: ../linkcheck/director/__init__.py:178 msgid "user interrupt; waiting for active threads to finish" msgstr "Benutzerabbruch; warte auf Beendigung von aktiven Verbindungen" -#: ../linkcheck/director/__init__.py:181 +#: ../linkcheck/director/__init__.py:180 msgid "another interrupt will exit immediately" msgstr "ein weiter Abbruch beendet dieses Programm sofort" -#: ../linkcheck/director/__init__.py:197 +#: ../linkcheck/director/__init__.py:196 msgid "user abort; force shutdown" msgstr "Benutzerabbruch; erzwinge Programmende" @@ -137,7 +137,7 @@ msgstr "Benutzerabbruch; erzwinge Programmende" msgid "could not download update information" msgstr "konnte Update-Informationen nicht herunterladen" -#: ../linkcheck/cache/addrinfo.py:51 +#: ../linkcheck/cache/addrinfo.py:57 #, python-format msgid "could not parse host %(host)r: %(msg)s" msgstr "konnte Rechnernamen %(host)r nicht parsen: %(msg)s" @@ -152,62 +152,62 @@ msgstr "Fehler beim Parsen der Konfiguration: %s" msgid "invalid negative value for %s: %d\n" msgstr "ungültiger negativer Wert für %s: %d\n" -#: ../linkcheck/configuration/confparse.py:170 +#: ../linkcheck/configuration/confparse.py:171 #, python-format msgid "missing auth part in entry %(val)r" msgstr "fehlende Authentifizierung in entry %(val)r" -#: ../linkcheck/configuration/confparse.py:176 +#: ../linkcheck/configuration/confparse.py:177 #, 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/configuration/__init__.py:317 +#: ../linkcheck/configuration/__init__.py:318 msgid "missing user or URL pattern in authentication data." msgstr "Fehlender Benutzer oder regulärer URL Ausdruck in Authentifizierungsdaten." -#: ../linkcheck/configuration/__init__.py:363 +#: ../linkcheck/configuration/__init__.py:365 msgid "activating text logger output." msgstr "aktiviere Loggerausgabe text." -#: ../linkcheck/configuration/__init__.py:373 +#: ../linkcheck/configuration/__init__.py:384 msgid "Clamav could not be initialized" msgstr "Clamav konnte nicht initialisiert werden" -#: ../linkcheck/configuration/__init__.py:379 +#: ../linkcheck/configuration/__init__.py:390 msgid "activating sendcookies." msgstr "aktiviere Option sendcookies." -#: ../linkcheck/configuration/__init__.py:382 +#: ../linkcheck/configuration/__init__.py:393 msgid "activating storecookies." msgstr "aktiviere Option storecookies." -#: ../linkcheck/configuration/__init__.py:391 +#: ../linkcheck/configuration/__init__.py:402 msgid "no CGI password fieldname given for login URL." msgstr " kein CGI Passwort Feldname für Login URL angegeben." -#: ../linkcheck/configuration/__init__.py:395 +#: ../linkcheck/configuration/__init__.py:406 msgid "no CGI user fieldname given for login URL." msgstr "kein CGI Benutzer Feldname für Login URL angegeben." -#: ../linkcheck/configuration/__init__.py:399 +#: ../linkcheck/configuration/__init__.py:410 msgid "no user/password authentication data found for login URL." msgstr "keine Benutzer/Passwort-Authentifizierung für Login URL gefunden." -#: ../linkcheck/configuration/__init__.py:402 +#: ../linkcheck/configuration/__init__.py:413 msgid "login URL is not a HTTP URL." msgstr "Login URL ist keine HTTP URL." -#: ../linkcheck/configuration/__init__.py:406 +#: ../linkcheck/configuration/__init__.py:417 msgid "login URL is incomplete." msgstr "Login URL ist unvollständig." -#: ../linkcheck/configuration/__init__.py:410 +#: ../linkcheck/configuration/__init__.py:421 #, python-format msgid "disabling login URL %(url)s." msgstr "deaktiviere Login URL %(url)s." -#: ../linkcheck/configuration/__init__.py:450 +#: ../linkcheck/configuration/__init__.py:461 #, python-format msgid "could not copy initial configuration file %(src)r to %(dst)r: %(errmsg)r" msgstr "Konnte initiale Konfigurationsdatei %(src)r nicht nach %(dst)r kopieren: %(errmsg)r" @@ -266,25 +266,25 @@ msgid "Statistics" msgstr "Statistik" #: ../linkcheck/logger/html.py:249 -#: ../linkcheck/logger/text.py:242 +#: ../linkcheck/logger/text.py:248 #, python-format msgid "Number of domains: %d" msgstr "Anzahl von Domains: %d" #: ../linkcheck/logger/html.py:253 -#: ../linkcheck/logger/text.py:245 +#: ../linkcheck/logger/text.py:251 #, 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/logger/html.py:257 -#: ../linkcheck/logger/text.py:248 +#: ../linkcheck/logger/text.py:254 #, 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/html.py:262 -#: ../linkcheck/logger/text.py:253 +#: ../linkcheck/logger/text.py:259 msgid "No statistics available since no URLs were checked." msgstr "Keine Statistik verfügbar, da keine URLs geprüft wurden." @@ -339,7 +339,7 @@ msgstr[1] "Es gab %(num)d interne Fehler." #: ../linkcheck/logger/html.py:293 #: ../linkcheck/logger/text.py:233 -#: ../linkcheck/logger/__init__.py:358 +#: ../linkcheck/logger/__init__.py:386 #, python-format msgid "Stopped checking at %(time)s (%(duration)s)" msgstr "Beende Prüfen am %(time)s (%(duration)s)" @@ -360,19 +360,19 @@ msgid "Support this project at %s" msgstr "Unterstütze dieses Projekt unter %s" #: ../linkcheck/logger/text.py:81 -#: ../linkcheck/logger/__init__.py:346 +#: ../linkcheck/logger/__init__.py:374 #, python-format msgid "Get the newest version at %(url)s" msgstr "Die neueste Version gibt es unter %(url)s" #: ../linkcheck/logger/text.py:83 -#: ../linkcheck/logger/__init__.py:348 +#: ../linkcheck/logger/__init__.py:376 #, python-format msgid "Write comments and bugs to %(url)s" msgstr "Schreiben Sie Kommentare und Fehler an %(url)s" #: ../linkcheck/logger/text.py:85 -#: ../linkcheck/logger/__init__.py:350 +#: ../linkcheck/logger/__init__.py:378 #, python-format msgid "Support this project at %(url)s" msgstr "Unterstütze dieses Projekt unter %(url)s" @@ -381,6 +381,21 @@ msgstr "Unterstütze dieses Projekt unter %(url)s" msgid "Statistics:" msgstr "Statistik:" +#: ../linkcheck/logger/text.py:242 +#, python-format +msgid "Downloaded: %s" +msgstr "Heruntergeladen: %s" + +#: ../linkcheck/logger/text.py:244 +#, python-format +msgid "Robots.txt cache: %s" +msgstr "Robots.txt-Cache: %s" + +#: ../linkcheck/logger/text.py:246 +#, python-format +msgid "DNS cache: %s" +msgstr "DNS-Cache: %s" + #: ../linkcheck/logger/__init__.py:31 msgid "Real URL" msgstr "Tats. URL" @@ -450,12 +465,12 @@ msgstr "URL" msgid "Level" msgstr "Tiefe" -#: ../linkcheck/logger/__init__.py:253 +#: ../linkcheck/logger/__init__.py:272 #, 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!" -#: ../linkcheck/logger/__init__.py:343 +#: ../linkcheck/logger/__init__.py:371 #, python-format msgid "created by %(app)s at %(time)s" msgstr "erstellt von %(app)s am %(time)s" @@ -744,123 +759,123 @@ msgstr "URL besitzt einen nicht analysierbaren Rechnernamen: %(name)s" 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:381 +#: ../linkcheck/checker/urlbase.py:385 msgid "URL is missing" msgstr "URL fehlt" -#: ../linkcheck/checker/urlbase.py:384 +#: ../linkcheck/checker/urlbase.py:388 msgid "URL is empty" msgstr "URL ist leer" -#: ../linkcheck/checker/urlbase.py:391 +#: ../linkcheck/checker/urlbase.py:395 #, python-format msgid "Effective URL %(url)r." msgstr "Effektive URL %(url)r." -#: ../linkcheck/checker/urlbase.py:450 +#: ../linkcheck/checker/urlbase.py:454 #, python-format msgid "URL has invalid port %(port)r" msgstr "URL hat eine ungültige Portnummer %(port)r" -#: ../linkcheck/checker/urlbase.py:455 +#: ../linkcheck/checker/urlbase.py:459 msgid "URL has empty hostname" msgstr "URL hat leeren Rechnernamen" -#: ../linkcheck/checker/urlbase.py:466 +#: ../linkcheck/checker/urlbase.py:470 #, 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:493 +#: ../linkcheck/checker/urlbase.py:497 #, python-format msgid "URL is located in %(country)s." msgstr "URL befindet sich in %(country)s." -#: ../linkcheck/checker/urlbase.py:518 +#: ../linkcheck/checker/urlbase.py:522 msgid "Hostname not found" msgstr "Rechnername nicht gefunden" -#: ../linkcheck/checker/urlbase.py:521 +#: ../linkcheck/checker/urlbase.py:525 #, python-format msgid "Bad HTTP response %(line)r" msgstr "Ungültige HTTP Antwort %(line)r" -#: ../linkcheck/checker/urlbase.py:534 +#: ../linkcheck/checker/urlbase.py:538 #, python-format msgid "could not get content: %(msg)r" msgstr "konnte Inhalt nicht parsen: %(msg)r" -#: ../linkcheck/checker/urlbase.py:675 +#: ../linkcheck/checker/urlbase.py:679 #, python-format msgid "Anchor `%(name)s' not found." msgstr "Anker `%(name)s' nicht gefunden." -#: ../linkcheck/checker/urlbase.py:676 +#: ../linkcheck/checker/urlbase.py:680 #, python-format msgid "Available anchors: %(anchors)s." msgstr "Verfügbare Anker: %(anchors)s." -#: ../linkcheck/checker/urlbase.py:730 +#: ../linkcheck/checker/urlbase.py:734 #: ../linkcheck/checker/fileurl.py:193 -#: ../linkcheck/checker/httpurl.py:685 +#: ../linkcheck/checker/httpurl.py:686 msgid "File size too large" msgstr "Dateigröße ist zu groß" -#: ../linkcheck/checker/urlbase.py:772 +#: ../linkcheck/checker/urlbase.py:778 #, 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:788 +#: ../linkcheck/checker/urlbase.py:794 msgid "Content size is zero." msgstr "Größe des Inhalts ist Null." -#: ../linkcheck/checker/urlbase.py:794 +#: ../linkcheck/checker/urlbase.py:800 #, 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:799 +#: ../linkcheck/checker/urlbase.py:805 #, 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:820 -#: ../linkcheck/checker/urlbase.py:885 +#: ../linkcheck/checker/urlbase.py:826 +#: ../linkcheck/checker/urlbase.py:891 msgid "valid HTML syntax" msgstr "gültige HTML Syntax" -#: ../linkcheck/checker/urlbase.py:826 +#: ../linkcheck/checker/urlbase.py:832 #, python-format msgid "tidy HTML parsing caused error: %(msg)s " msgstr "tidy HTML Parser verursachte Fehler: %(msg)s" -#: ../linkcheck/checker/urlbase.py:848 -#: ../linkcheck/checker/urlbase.py:921 +#: ../linkcheck/checker/urlbase.py:854 +#: ../linkcheck/checker/urlbase.py:927 msgid "valid CSS syntax" msgstr "gültige CSS Syntax" -#: ../linkcheck/checker/urlbase.py:854 +#: ../linkcheck/checker/urlbase.py:860 #, python-format msgid "cssutils parsing caused error: %(msg)s" msgstr "cssutils Parser verursachte Fehler: %(msg)s" -#: ../linkcheck/checker/urlbase.py:863 +#: ../linkcheck/checker/urlbase.py:869 #, 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:894 +#: ../linkcheck/checker/urlbase.py:900 #, python-format msgid "HTML W3C validation caused error: %(msg)s " msgstr "HTML W3C Validierung verursachte Fehler: %(msg)s" -#: ../linkcheck/checker/urlbase.py:929 +#: ../linkcheck/checker/urlbase.py:935 #, python-format msgid "CSS W3C validation caused error: %(msg)s " msgstr "CSS W3C Validierung verursachte Fehler: %(msg)s" -#: ../linkcheck/checker/urlbase.py:982 +#: ../linkcheck/checker/urlbase.py:988 #, python-format msgid "%(num)d URL parsed." msgid_plural "%(num)d URLs parsed." @@ -932,7 +947,7 @@ msgstr "Keine Antwort vom FTP Server" msgid "Missing trailing directory slash in ftp url." msgstr "Fehlender / am Ende der FTP url." -#: ../linkcheck/checker/ftpurl.py:225 +#: ../linkcheck/checker/ftpurl.py:226 msgid "FTP file size too large" msgstr "FTP Dateigröße ist zu groß" @@ -1028,27 +1043,27 @@ msgstr "OK" msgid "Last modified %(date)s." msgstr "Letzte Änderung %(date)s." -#: ../linkcheck/checker/httpurl.py:590 +#: ../linkcheck/checker/httpurl.py:591 #, python-format msgid "Sent Cookie: %(cookie)s." msgstr "Gesendetes Cookie: %(cookie)s." -#: ../linkcheck/checker/httpurl.py:596 +#: ../linkcheck/checker/httpurl.py:597 #, python-format msgid "Could not store cookies from headers: %(error)s." msgstr "Konnte Cookies nicht aus Kopfdaten speichern: %(error)s." -#: ../linkcheck/checker/httpurl.py:659 +#: ../linkcheck/checker/httpurl.py:660 #, python-format msgid "Unsupported HTTP url scheme `%(scheme)s'" msgstr "Nicht unterstütztes HTTP URL Schema `%(scheme)s'" -#: ../linkcheck/checker/httpurl.py:705 +#: ../linkcheck/checker/httpurl.py:707 #, python-format msgid "Decompress error %(err)s" msgstr "Entkomprimierungsfehler %(err)s" -#: ../linkcheck/checker/httpurl.py:721 +#: ../linkcheck/checker/httpurl.py:723 #, python-format msgid "Unsupported content encoding `%(encoding)s'." msgstr "Content-Encoding `%(encoding)s' wird nicht unterstützt." @@ -1506,7 +1521,7 @@ msgid "Closing pending connections..." msgstr "Schließe aktuelle Verbindungen..." #: ../linkcheck/gui/__init__.py:429 -#: ../linkchecker:705 +#: ../linkchecker:698 msgid "Dumping memory statistics..." msgstr "Generiere Speicherabzug..." @@ -1770,6 +1785,20 @@ msgstr[1] "%d Jahre" msgid "Could not import %(module)s for %(feature)s. Install %(module)s from %(url)s to use this feature." msgstr "Konnte Modul %(module)s für %(feature)s nicht importieren. Installieren Sie %(module)s von %(url)s, um dieses Feature zu nutzen." +#: ../linkcheck/strformat.py:331 +#, python-format +msgid "%d hit" +msgid_plural "%d hits" +msgstr[0] "%d Teffer" +msgstr[1] "%d Treffer" + +#: ../linkcheck/strformat.py:332 +#, python-format +msgid "%d miss" +msgid_plural "%d misses" +msgstr[0] "%d Fehler" +msgstr[1] "%d Fehler" + #: ../linkchecker:57 msgid "USAGE\tlinkchecker [options] [file-or-url]..." msgstr "BENUTZUNG\tlinkchecker [Optionen] [datei-oder-url]..." @@ -2365,52 +2394,48 @@ msgstr "Nicht lesbare Konfigurationsdatei: %r" msgid "Running with python -O disables debugging." msgstr "Die Option python -O verhindert das Debuggen." -#: ../linkchecker:517 -#: ../linkchecker:548 +#: ../linkchecker:518 +#: ../linkchecker:550 #, 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:521 -#: ../linkchecker:554 +#: ../linkchecker:522 +#: ../linkchecker:556 #, 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:566 +#: ../linkchecker:568 #, 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:569 +#: ../linkchecker:571 msgid "Enter LinkChecker HTTP/FTP password:" msgstr "Gebe LinkChecker HTTP/FTP Passwort ein:" -#: ../linkchecker:576 -#: ../linkchecker:594 +#: ../linkchecker:578 +#: ../linkchecker:596 #, python-format msgid "Illegal argument %(arg)r for option %(option)s" msgstr "Ungültiges Argument %(arg)r für Option %(option)s" -#: ../linkchecker:633 +#: ../linkchecker:635 #, 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:650 -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:663 +#: ../linkchecker:656 #, python-format msgid "Could not parse cookie file: %s" msgstr "Konnte Cookie-Datei nicht parsen: %s" -#: ../linkchecker:677 +#: ../linkchecker:670 msgid "no files or URLs given" msgstr "keine Dateien oder URLs angegeben" -#: ../linkchecker:682 +#: ../linkchecker:675 #, python-format msgid "" "Overwrite profiling file %(file)r?\n" @@ -2419,15 +2444,15 @@ msgstr "" "Profildatei %(file)r überschreiben?\n" "Drücken Sie Strg-C zum Abbrechen, EINGABETASTE zum Fortfahren." -#: ../linkchecker:688 +#: ../linkchecker:681 msgid "Canceled." msgstr "Abgebrochen." -#: ../linkchecker:692 +#: ../linkchecker:685 msgid "The `cProfile' Python module is not installed, therefore the --profile option is disabled." msgstr "Das `cProfile' Python Modul ist nicht installiert, deshalb ist die --profile Option deaktiviert." -#: ../linkchecker:707 +#: ../linkchecker:700 #, python-format msgid "The memory dump has been written to `%(filename)s'." msgstr "Der Speicherabzug wurde in Datei `%(filename)s' geschrieben." @@ -2506,6 +2531,13 @@ msgstr "%s Option erfordert %d Argumente" msgid "%s option does not take a value" msgstr "%s Option nimmt kein Wert" +#~ 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." + #~ msgid "unauthorized access is missing WWW-Authenticate header" #~ msgstr "dem nicht authorisierten Zugriff fehlt der WWW-Authenticate Header" diff --git a/po/linkchecker.pot b/po/linkchecker.pot index a904c75b..d5690613 100644 --- a/po/linkchecker.pot +++ b/po/linkchecker.pot @@ -1,5 +1,5 @@ # SOME DESCRIPTIVE TITLE. -# Copyright (C) 2012 Bastian Kleineidam +# Copyright (C) YEAR Bastian Kleineidam # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: calvin@users.sourceforge.net\n" -"POT-Creation-Date: 2012-09-02 19:55+0200\n" +"POT-Creation-Date: 2012-09-16 11:53+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: ../linkcheck/director/aggregator.py:71 +#: ../linkcheck/director/aggregator.py:73 msgid "These URLs are still active:" msgstr "" @@ -110,15 +110,15 @@ msgid "" "new threads." msgstr "" -#: ../linkcheck/director/__init__.py:179 +#: ../linkcheck/director/__init__.py:178 msgid "user interrupt; waiting for active threads to finish" msgstr "" -#: ../linkcheck/director/__init__.py:181 +#: ../linkcheck/director/__init__.py:180 msgid "another interrupt will exit immediately" msgstr "" -#: ../linkcheck/director/__init__.py:197 +#: ../linkcheck/director/__init__.py:196 msgid "user abort; force shutdown" msgstr "" @@ -126,7 +126,7 @@ msgstr "" msgid "could not download update information" msgstr "" -#: ../linkcheck/cache/addrinfo.py:51 +#: ../linkcheck/cache/addrinfo.py:57 #, python-format msgid "could not parse host %(host)r: %(msg)s" msgstr "" @@ -141,62 +141,62 @@ msgstr "" msgid "invalid negative value for %s: %d\n" msgstr "" -#: ../linkcheck/configuration/confparse.py:170 +#: ../linkcheck/configuration/confparse.py:171 #, python-format msgid "missing auth part in entry %(val)r" msgstr "" -#: ../linkcheck/configuration/confparse.py:176 +#: ../linkcheck/configuration/confparse.py:177 #, python-format msgid "invalid login URL `%s'. Only HTTP and HTTPS URLs are supported." msgstr "" -#: ../linkcheck/configuration/__init__.py:317 +#: ../linkcheck/configuration/__init__.py:318 msgid "missing user or URL pattern in authentication data." msgstr "" -#: ../linkcheck/configuration/__init__.py:363 +#: ../linkcheck/configuration/__init__.py:365 msgid "activating text logger output." msgstr "" -#: ../linkcheck/configuration/__init__.py:373 +#: ../linkcheck/configuration/__init__.py:384 msgid "Clamav could not be initialized" msgstr "" -#: ../linkcheck/configuration/__init__.py:379 +#: ../linkcheck/configuration/__init__.py:390 msgid "activating sendcookies." msgstr "" -#: ../linkcheck/configuration/__init__.py:382 +#: ../linkcheck/configuration/__init__.py:393 msgid "activating storecookies." msgstr "" -#: ../linkcheck/configuration/__init__.py:391 +#: ../linkcheck/configuration/__init__.py:402 msgid "no CGI password fieldname given for login URL." msgstr "" -#: ../linkcheck/configuration/__init__.py:395 +#: ../linkcheck/configuration/__init__.py:406 msgid "no CGI user fieldname given for login URL." msgstr "" -#: ../linkcheck/configuration/__init__.py:399 +#: ../linkcheck/configuration/__init__.py:410 msgid "no user/password authentication data found for login URL." msgstr "" -#: ../linkcheck/configuration/__init__.py:402 +#: ../linkcheck/configuration/__init__.py:413 msgid "login URL is not a HTTP URL." msgstr "" -#: ../linkcheck/configuration/__init__.py:406 +#: ../linkcheck/configuration/__init__.py:417 msgid "login URL is incomplete." msgstr "" -#: ../linkcheck/configuration/__init__.py:410 +#: ../linkcheck/configuration/__init__.py:421 #, python-format msgid "disabling login URL %(url)s." msgstr "" -#: ../linkcheck/configuration/__init__.py:450 +#: ../linkcheck/configuration/__init__.py:461 #, python-format msgid "could not copy initial configuration file %(src)r to %(dst)r: %(errmsg)r" msgstr "" @@ -245,24 +245,24 @@ msgstr "" msgid "Statistics" msgstr "" -#: ../linkcheck/logger/html.py:249 ../linkcheck/logger/text.py:242 +#: ../linkcheck/logger/html.py:249 ../linkcheck/logger/text.py:248 #, python-format msgid "Number of domains: %d" msgstr "" -#: ../linkcheck/logger/html.py:253 ../linkcheck/logger/text.py:245 +#: ../linkcheck/logger/html.py:253 ../linkcheck/logger/text.py:251 #, 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/logger/html.py:257 ../linkcheck/logger/text.py:248 +#: ../linkcheck/logger/html.py:257 ../linkcheck/logger/text.py:254 #, python-format msgid "URL lengths: min=%(min)d, max=%(max)d, avg=%(avg)d." msgstr "" -#: ../linkcheck/logger/html.py:262 ../linkcheck/logger/text.py:253 +#: ../linkcheck/logger/html.py:262 ../linkcheck/logger/text.py:259 msgid "No statistics available since no URLs were checked." msgstr "" @@ -309,7 +309,7 @@ msgstr[0] "" msgstr[1] "" #: ../linkcheck/logger/html.py:293 ../linkcheck/logger/text.py:233 -#: ../linkcheck/logger/__init__.py:358 +#: ../linkcheck/logger/__init__.py:386 #, python-format msgid "Stopped checking at %(time)s (%(duration)s)" msgstr "" @@ -329,17 +329,17 @@ msgstr "" msgid "Support this project at %s" msgstr "" -#: ../linkcheck/logger/text.py:81 ../linkcheck/logger/__init__.py:346 +#: ../linkcheck/logger/text.py:81 ../linkcheck/logger/__init__.py:374 #, python-format msgid "Get the newest version at %(url)s" msgstr "" -#: ../linkcheck/logger/text.py:83 ../linkcheck/logger/__init__.py:348 +#: ../linkcheck/logger/text.py:83 ../linkcheck/logger/__init__.py:376 #, python-format msgid "Write comments and bugs to %(url)s" msgstr "" -#: ../linkcheck/logger/text.py:85 ../linkcheck/logger/__init__.py:350 +#: ../linkcheck/logger/text.py:85 ../linkcheck/logger/__init__.py:378 #, python-format msgid "Support this project at %(url)s" msgstr "" @@ -348,6 +348,21 @@ msgstr "" msgid "Statistics:" msgstr "" +#: ../linkcheck/logger/text.py:242 +#, python-format +msgid "Downloaded: %s" +msgstr "" + +#: ../linkcheck/logger/text.py:244 +#, python-format +msgid "Robots.txt cache: %s" +msgstr "" + +#: ../linkcheck/logger/text.py:246 +#, python-format +msgid "DNS cache: %s" +msgstr "" + #: ../linkcheck/logger/__init__.py:31 msgid "Real URL" msgstr "" @@ -414,12 +429,12 @@ msgstr "" msgid "Level" msgstr "" -#: ../linkcheck/logger/__init__.py:253 +#: ../linkcheck/logger/__init__.py:272 #, python-format msgid "Happy birthday for LinkChecker, I'm %d years old today!" msgstr "" -#: ../linkcheck/logger/__init__.py:343 +#: ../linkcheck/logger/__init__.py:371 #, python-format msgid "created by %(app)s at %(time)s" msgstr "" @@ -713,121 +728,121 @@ msgstr "" msgid "Leading or trailing whitespace in URL `%(url)s'." msgstr "" -#: ../linkcheck/checker/urlbase.py:381 +#: ../linkcheck/checker/urlbase.py:385 msgid "URL is missing" msgstr "" -#: ../linkcheck/checker/urlbase.py:384 +#: ../linkcheck/checker/urlbase.py:388 msgid "URL is empty" msgstr "" -#: ../linkcheck/checker/urlbase.py:391 +#: ../linkcheck/checker/urlbase.py:395 #, python-format msgid "Effective URL %(url)r." msgstr "" -#: ../linkcheck/checker/urlbase.py:450 +#: ../linkcheck/checker/urlbase.py:454 #, python-format msgid "URL has invalid port %(port)r" msgstr "" -#: ../linkcheck/checker/urlbase.py:455 +#: ../linkcheck/checker/urlbase.py:459 msgid "URL has empty hostname" msgstr "" -#: ../linkcheck/checker/urlbase.py:466 +#: ../linkcheck/checker/urlbase.py:470 #, python-format msgid "URL %(url)s has obfuscated IP address %(ip)s" msgstr "" -#: ../linkcheck/checker/urlbase.py:493 +#: ../linkcheck/checker/urlbase.py:497 #, python-format msgid "URL is located in %(country)s." msgstr "" -#: ../linkcheck/checker/urlbase.py:518 +#: ../linkcheck/checker/urlbase.py:522 msgid "Hostname not found" msgstr "" -#: ../linkcheck/checker/urlbase.py:521 +#: ../linkcheck/checker/urlbase.py:525 #, python-format msgid "Bad HTTP response %(line)r" msgstr "" -#: ../linkcheck/checker/urlbase.py:534 +#: ../linkcheck/checker/urlbase.py:538 #, python-format msgid "could not get content: %(msg)r" msgstr "" -#: ../linkcheck/checker/urlbase.py:675 +#: ../linkcheck/checker/urlbase.py:679 #, python-format msgid "Anchor `%(name)s' not found." msgstr "" -#: ../linkcheck/checker/urlbase.py:676 +#: ../linkcheck/checker/urlbase.py:680 #, python-format msgid "Available anchors: %(anchors)s." msgstr "" -#: ../linkcheck/checker/urlbase.py:730 ../linkcheck/checker/fileurl.py:193 -#: ../linkcheck/checker/httpurl.py:685 +#: ../linkcheck/checker/urlbase.py:734 ../linkcheck/checker/fileurl.py:193 +#: ../linkcheck/checker/httpurl.py:686 msgid "File size too large" msgstr "" -#: ../linkcheck/checker/urlbase.py:772 +#: ../linkcheck/checker/urlbase.py:778 #, python-format msgid "Found %(match)r at line %(line)d in link contents." msgstr "" -#: ../linkcheck/checker/urlbase.py:788 +#: ../linkcheck/checker/urlbase.py:794 msgid "Content size is zero." msgstr "" -#: ../linkcheck/checker/urlbase.py:794 +#: ../linkcheck/checker/urlbase.py:800 #, python-format msgid "Content size %(dlsize)s is larger than %(maxbytes)s." msgstr "" -#: ../linkcheck/checker/urlbase.py:799 +#: ../linkcheck/checker/urlbase.py:805 #, python-format msgid "" "Download size (%(dlsize)d Byte) does not equal content size (%(size)d Byte)." msgstr "" -#: ../linkcheck/checker/urlbase.py:820 ../linkcheck/checker/urlbase.py:885 +#: ../linkcheck/checker/urlbase.py:826 ../linkcheck/checker/urlbase.py:891 msgid "valid HTML syntax" msgstr "" -#: ../linkcheck/checker/urlbase.py:826 +#: ../linkcheck/checker/urlbase.py:832 #, python-format msgid "tidy HTML parsing caused error: %(msg)s " msgstr "" -#: ../linkcheck/checker/urlbase.py:848 ../linkcheck/checker/urlbase.py:921 +#: ../linkcheck/checker/urlbase.py:854 ../linkcheck/checker/urlbase.py:927 msgid "valid CSS syntax" msgstr "" -#: ../linkcheck/checker/urlbase.py:854 +#: ../linkcheck/checker/urlbase.py:860 #, python-format msgid "cssutils parsing caused error: %(msg)s" msgstr "" -#: ../linkcheck/checker/urlbase.py:863 +#: ../linkcheck/checker/urlbase.py:869 #, python-format msgid "%(w3type)s validation error at line %(line)s col %(column)s: %(msg)s" msgstr "" -#: ../linkcheck/checker/urlbase.py:894 +#: ../linkcheck/checker/urlbase.py:900 #, python-format msgid "HTML W3C validation caused error: %(msg)s " msgstr "" -#: ../linkcheck/checker/urlbase.py:929 +#: ../linkcheck/checker/urlbase.py:935 #, python-format msgid "CSS W3C validation caused error: %(msg)s " msgstr "" -#: ../linkcheck/checker/urlbase.py:982 +#: ../linkcheck/checker/urlbase.py:988 #, python-format msgid "%(num)d URL parsed." msgid_plural "%(num)d URLs parsed." @@ -899,7 +914,7 @@ msgstr "" msgid "Missing trailing directory slash in ftp url." msgstr "" -#: ../linkcheck/checker/ftpurl.py:225 +#: ../linkcheck/checker/ftpurl.py:226 msgid "FTP file size too large" msgstr "" @@ -998,27 +1013,27 @@ msgstr "" msgid "Last modified %(date)s." msgstr "" -#: ../linkcheck/checker/httpurl.py:590 +#: ../linkcheck/checker/httpurl.py:591 #, python-format msgid "Sent Cookie: %(cookie)s." msgstr "" -#: ../linkcheck/checker/httpurl.py:596 +#: ../linkcheck/checker/httpurl.py:597 #, python-format msgid "Could not store cookies from headers: %(error)s." msgstr "" -#: ../linkcheck/checker/httpurl.py:659 +#: ../linkcheck/checker/httpurl.py:660 #, python-format msgid "Unsupported HTTP url scheme `%(scheme)s'" msgstr "" -#: ../linkcheck/checker/httpurl.py:705 +#: ../linkcheck/checker/httpurl.py:707 #, python-format msgid "Decompress error %(err)s" msgstr "" -#: ../linkcheck/checker/httpurl.py:721 +#: ../linkcheck/checker/httpurl.py:723 #, python-format msgid "Unsupported content encoding `%(encoding)s'." msgstr "" @@ -1466,7 +1481,7 @@ msgstr "" msgid "Closing pending connections..." msgstr "" -#: ../linkcheck/gui/__init__.py:429 ../linkchecker:705 +#: ../linkcheck/gui/__init__.py:429 ../linkchecker:698 msgid "Dumping memory statistics..." msgstr "" @@ -1727,6 +1742,20 @@ msgid "" "to use this feature." msgstr "" +#: ../linkcheck/strformat.py:331 +#, python-format +msgid "%d hit" +msgid_plural "%d hits" +msgstr[0] "" +msgstr[1] "" + +#: ../linkcheck/strformat.py:332 +#, python-format +msgid "%d miss" +msgid_plural "%d misses" +msgstr[0] "" +msgstr[1] "" + #: ../linkchecker:57 msgid "USAGE\tlinkchecker [options] [file-or-url]..." msgstr "" @@ -2132,68 +2161,62 @@ msgstr "" msgid "Running with python -O disables debugging." msgstr "" -#: ../linkchecker:517 ../linkchecker:548 +#: ../linkchecker:518 ../linkchecker:550 #, python-format msgid "Unknown logger type %(type)r in %(output)r for option %(option)s" msgstr "" -#: ../linkchecker:521 ../linkchecker:554 +#: ../linkchecker:522 ../linkchecker:556 #, python-format msgid "Unknown encoding %(encoding)r in %(output)r for option %(option)s" msgstr "" -#: ../linkchecker:566 +#: ../linkchecker:568 #, python-format msgid "Enter LinkChecker HTTP/FTP password for user %(user)s:" msgstr "" -#: ../linkchecker:569 +#: ../linkchecker:571 msgid "Enter LinkChecker HTTP/FTP password:" msgstr "" -#: ../linkchecker:576 ../linkchecker:594 +#: ../linkchecker:578 ../linkchecker:596 #, python-format msgid "Illegal argument %(arg)r for option %(option)s" msgstr "" -#: ../linkchecker:633 +#: ../linkchecker:635 #, python-format msgid "Enter LinkChecker password for user %(user)s at %(strpattern)s:" msgstr "" -#: ../linkchecker:650 -msgid "" -"Using DOT or GML loggers without --complete output gives an incomplete " -"sitemap graph." -msgstr "" - -#: ../linkchecker:663 +#: ../linkchecker:656 #, python-format msgid "Could not parse cookie file: %s" msgstr "" -#: ../linkchecker:677 +#: ../linkchecker:670 msgid "no files or URLs given" msgstr "" -#: ../linkchecker:682 +#: ../linkchecker:675 #, python-format msgid "" "Overwrite profiling file %(file)r?\n" "Press Ctrl-C to cancel, RETURN to continue." msgstr "" -#: ../linkchecker:688 +#: ../linkchecker:681 msgid "Canceled." msgstr "" -#: ../linkchecker:692 +#: ../linkchecker:685 msgid "" "The `cProfile' Python module is not installed, therefore the --profile option " "is disabled." msgstr "" -#: ../linkchecker:707 +#: ../linkchecker:700 #, python-format msgid "The memory dump has been written to `%(filename)s'." msgstr ""