mirror of
https://github.com/Hopiu/linkchecker.git
synced 2026-03-16 22:10:26 +00:00
Print download and cache statistics.
This commit is contained in:
parent
dddd19be99
commit
6e1841cf1f
13 changed files with 344 additions and 194 deletions
|
|
@ -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.
|
||||
|
|
|
|||
69
linkcheck/cache/addrinfo.py
vendored
69
linkcheck/cache/addrinfo.py
vendored
|
|
@ -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
|
||||
|
|
|
|||
9
linkcheck/cache/robots_txt.py
vendored
9
linkcheck/cache/robots_txt.py
vendored
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
202
po/de.po
202
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 <calvin@users.sourceforge.net>\n"
|
||||
"Language-Team: de <de@li.org>\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"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) 2012 Bastian Kleineidam <calvin@users.sourceforge.net>
|
||||
# Copyright (C) YEAR Bastian Kleineidam <calvin@users.sourceforge.net>
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\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 ""
|
||||
|
|
|
|||
Loading…
Reference in a new issue