Allow memory dumps to be written.

This commit is contained in:
Bastian Kleineidam 2012-06-10 13:18:35 +02:00
parent 837ab22d01
commit 2dee223555
17 changed files with 796 additions and 563 deletions

View file

@ -153,6 +153,13 @@
# Pause the given number of seconds between two subsequent connection
# requests to the same host.
#pause=0
# When checking finishes, write a memory dump to a temporary file.
# The memory dump is written both when checking finishes normally
# and when checking gets canceled.
# The memory dump only works if the python-meliae package is installed.
# Otherwise a warning is printed to install it.
#debugmemory=0
##################### filtering options ##########################
[filtering]

View file

@ -8,6 +8,7 @@ Fixes:
Features:
- installation: Support RPM building with cx_Freeze.
- installation: Added .desktop files for POSIX systems.
- checking: Allow writing of a memory dump file.
7.8 "Gangster Exchange" (released 12.5.2012)

422
doc/de.po

File diff suppressed because it is too large Load diff

View file

@ -109,6 +109,17 @@ Pausiere die angegebene Anzahl von Sekunden zwischen zwei aufeinander
folgenden Verbindungen zum demselben Rechner.
.br
Kommandozeilenoption: \fB\-\-pause\fP
.TP
\fBdebugmemory=\fP[\fB0\fP|\fB1\fP]
Schreibe einen Speicherabzug in eine temporäre Datei wenn die Prüfung
endet. Der Speicherabzug wird sowohl beim normalen Beenden der Prüfung als
auch wenn die Prüfung abgebrochen wird geschrieben.
.br
Der Speicherabzug funktioniert nur falls das Paket python\-meliae installiert
ist. Andernfalls wird eine Warnung angezeigt mit dem Hinweis dieses Paket zu
installieren.
.br
Kommandozeilenoption: keine
.SS [filtering]
.TP
\fBignore=\fP\fIREGEX\fP (MULTILINE)

View file

@ -103,6 +103,16 @@ Pause the given number of seconds between two subsequent connection
requests to the same host.
.br
Command line option: \fB\-\-pause\fP
.TP
\fBdebugmemory=\fP[\fB0\fP|\fB1\fP]
When checking finishes, write a memory dump to a temporary file.
The memory dump is written both when checking finishes normally
and when checking gets canceled.
.br
The memory dump only works if the python-meliae package is installed.
Otherwise a warning is printed to install it.
.br
Command line option: none
.SS \fB[filtering]\fP
.TP
\fBignore=\fP\fIREGEX\fP (MULTILINE)

File diff suppressed because it is too large Load diff

View file

@ -258,7 +258,6 @@ class HttpUrl (internpaturl.InternPatternUrl, proxysupport.ProxySupport):
if (self.headers and self.method == "HEAD" and
self.method_get_allowed):
# test for HEAD support
mime = self.get_content_type()
poweredby = self.getheader('X-Powered-By', u'')
server = self.getheader('Server', u'')
if (poweredby.startswith('Zope') or server.startswith('Zope')

View file

@ -192,6 +192,7 @@ class Configuration (dict):
self["scanvirus"] = False
self["clamavconf"] = clamav.canonical_clamav_conf()
self["useragent"] = UserAgent
self["debugmemory"] = False
from ..logger import Loggers
self.loggers = dict(**Loggers)

View file

@ -147,6 +147,7 @@ class LCConfigParser (ConfigParser.RawConfigParser, object):
self.read_boolean_option(section, "checkcss")
self.read_boolean_option(section, "scanvirus")
self.read_boolean_option(section, "clamavconf")
self.read_boolean_option(section, "debugmemory")
if self.has_option(section, "cookies"):
self.config["sendcookies"] = self.config["storecookies"] = \
self.getboolean(section, "cookies")

View file

@ -182,6 +182,8 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow):
def set_idle ():
"""Set application status to idle."""
self.status = Status.idle
if self.config["debugmemory"]:
self.dump_memory()
self.set_statusmsg(_("Check finished."))
self.controlButton.clicked.disconnect(self.checker.cancel)
self.checker.finished.connect(set_idle)
@ -253,6 +255,7 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow):
self.config["threads"] = 1
else:
self.config.reset_loglevel()
self.config["debugmemory"] = data["debugmemory"]
if data["warninglines"]:
lines = data["warninglines"].splitlines()
ro = re.compile(warninglines2regex(lines))
@ -427,6 +430,17 @@ Version 2 or later.
else:
raise ValueError("Invalid application status %r" % self.status)
def dump_memory (self):
"""Dump memory to temporary file and inform user with a modal
dialog where the file is."""
from .. import memoryutil
self.set_statusmsg(_(u"Dumping memory statistics..."))
filename = memoryutil.write_memory_dump()
title = _(u"LinkChecker memory dump written")
message = _(u"The memory dump has been written to `%(filename)s'.")
attrs = dict(filename=filename)
QtGui.QMessageBox.information(self, title, message % attrs)
def get_url (self):
"""Return URL to check from the urlinput widget."""
url = strformat.stripurl(unicode(self.urlinput.text()))

View file

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'ui/options.ui'
#
# Created: Thu Mar 15 21:43:48 2012
# Created: Sun Jun 10 11:51:42 2012
# by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!
@ -60,6 +60,14 @@ class Ui_Options(object):
self.debug.setText(_fromUtf8(""))
self.debug.setObjectName(_fromUtf8("debug"))
self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.debug)
self.label_7 = QtGui.QLabel(self.widget)
self.label_7.setToolTip(_fromUtf8(""))
self.label_7.setObjectName(_fromUtf8("label_7"))
self.formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.label_7)
self.debugmemory = QtGui.QCheckBox(self.widget)
self.debugmemory.setText(_fromUtf8(""))
self.debugmemory.setObjectName(_fromUtf8("debugmemory"))
self.formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.debugmemory)
self.verticalLayout.addWidget(self.widget)
spacerItem = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem)
@ -135,6 +143,7 @@ class Ui_Options(object):
self.label_2.setText(_("Verbose output"))
self.verbose.setToolTip(_("Log all checked URLs once. Default is to log only errors and warnings."))
self.label_4.setText(_("Debug"))
self.label_7.setText(_("Debug memory usage"))
self.label_5.setText(_("Warn when one of these strings are found (one per line):"))
self.label_6.setText(_("Ignore URLs matching one of these patterns (one per line):"))
self.groupBox.setTitle(_("Configuration file"))

View file

@ -19,7 +19,7 @@ import os
from PyQt4 import QtGui
from .linkchecker_ui_options import Ui_Options
from .editor import EditorWindow
from ..fileutil import is_writable
from ..fileutil import is_writable, has_module
from .. import configuration
@ -46,6 +46,11 @@ class LinkCheckerOptions (QtGui.QDialog, Ui_Options):
self.recursionlevel.setValue(-1)
self.verbose.setChecked(False)
self.debug.setChecked(False)
self.debugmemory.setChecked(False)
if not has_module("meliae"):
self.debugmemory.setEnabled(False)
from ..memoryutil import MemoryDebugMsg
self.debugmemory.setTooltip(MemoryDebugMsg)
self.warninglines.setPlainText(u"")
self.ignorelines.setPlainText(u"")
@ -64,6 +69,7 @@ class LinkCheckerOptions (QtGui.QDialog, Ui_Options):
"""Return option data as dictionary."""
return dict(
debug=self.debug.isChecked(),
debugmemory=self.debugmemory.isChecked(),
verbose=self.verbose.isChecked(),
recursionlevel=self.recursionlevel.value(),
warninglines=unicode(self.warninglines.toPlainText()),
@ -74,6 +80,8 @@ class LinkCheckerOptions (QtGui.QDialog, Ui_Options):
"""Set GUI options from given data."""
if data.get("debug") is not None:
self.debug.setChecked(data["debug"])
if data.get("debugmemory") is not None:
self.debugmemory.setChecked(data["debugmemory"])
if data.get("verbose") is not None:
self.verbose.setChecked(data["verbose"])
if data.get("recursionlevel") is not None:

View file

@ -104,6 +104,23 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="toolTip">
<string extracomment="When checking finishes, write a memory dump to a temporary file. The memory dump is written both when checking finishes normally and when checking gets canceled."/>
</property>
<property name="text">
<string>Debug memory usage</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="debugmemory">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>

53
linkcheck/memoryutil.py Normal file
View file

@ -0,0 +1,53 @@
# -*- coding: iso-8859-1 -*-
# Copyright (C) 2012 Bastian Kleineidam
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
"""
Memory utilities.
"""
import sys
from . import strformat
from .fileutil import get_temp_file
# Message to display when meliae package is not installed
MemoryDebugMsg = strformat.format_feature_warning(module=u'meliae',
feature=u'memory debugging',
url=u'https://launchpad.net/meliae')
def write_memory_dump():
"""Dump memory to a temporary filename with the meliae package.
@return: JSON filename where memory dump has been written to
@rtype: string
"""
from meliae import scanner
fo, filename = get_temp_file(mode='wb', suffix='.json', prefix='lcdump_')
try:
scanner.dump_all_objects(fo)
finally:
fo.close()
return filename
def print_memory_dump(filename, out=sys.stdout):
"""Print a memory dump to given output stream.
@param filename: memory dump file
@ptype filename: string
@param out: output stream, default: stdout
@ptype out: open file object
"""
from meliae import loader
om = loader.load(filename)
print >>out, om.summarize()

View file

@ -44,6 +44,7 @@ from linkcheck.director import console, check_urls, get_aggregate
has_optcomplete = linkcheck.fileutil.has_module("optcomplete")
has_profile = linkcheck.fileutil.has_module("profile")
has_pstats = linkcheck.fileutil.has_module("pstats")
has_meliae = linkcheck.fileutil.has_module("meliae")
# default profiling filename
_profile = "linkchecker.prof"
@ -790,6 +791,15 @@ if do_profile:
profile.run("check_urls(aggregate)", _profile)
else:
check_urls(aggregate)
if config["debugmemory"]:
import linkcheck.memoryutil
if has_meliae:
log.info(LOG_CMDLINE, _(u"Dumping memory statistics..."))
filename = linkcheck.memoryutil.write_memory_dump()
message = _(u"The memory dump has been written to `%(filename)s'.")
log.info(LOG_CMDLINE, message % dict(filename=filename))
else:
log.warn(LOG_CMDLINE, memoryutil.MemoryDebugMsg)
stats = config['logger'].stats
# on internal errors, exit with status 2

193
po/de.po
View file

@ -5,8 +5,8 @@ msgid ""
msgstr ""
"Project-Id-Version: $Id$\n"
"Report-Msgid-Bugs-To: calvin@users.sourceforge.net\n"
"POT-Creation-Date: 2012-04-22 21:50+0200\n"
"PO-Revision-Date: 2012-04-22 21:52+0100\n"
"POT-Creation-Date: 2012-06-10 12:22+0200\n"
"PO-Revision-Date: 2012-06-10 12:24+0100\n"
"Last-Translator: Bastian Kleineidam <calvin@users.sourceforge.net>\n"
"Language-Team: de <de@li.org>\n"
"Language: \n"
@ -102,38 +102,34 @@ msgstr "Python %(version)s auf %(platform)s"
msgid "Local time:"
msgstr "Uhrzeit:"
#: ../linkcheck/director/__init__.py:37
msgid "Could not import twill for login URL visit"
msgstr "Konnte twill nicht importieren, um die Login URL zu besuchen."
#: ../linkcheck/director/__init__.py:44
#: ../linkcheck/director/__init__.py:48
#, python-format
msgid "Error visiting login URL %(url)s."
msgstr "Fehler beim Besuchen der Login URL %(url)s."
#: ../linkcheck/director/__init__.py:49
#: ../linkcheck/director/__init__.py:53
#, python-format
msgid "Error posting form at login URL %(url)s."
msgstr "Fehler beim Abschicken des Formulars bei Login URL %(url)s."
#: ../linkcheck/director/__init__.py:126
#: ../linkcheck/director/__init__.py:130
#, python-format
msgid "Error using login URL: %(msg)s."
msgstr "Fehler bei Login URL: %(msg)s."
#: ../linkcheck/director/__init__.py:142
#: ../linkcheck/director/__init__.py:146
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:175
#: ../linkcheck/director/__init__.py:179
msgid "user interrupt; waiting for active threads to finish"
msgstr "Benutzerabbruch; warte auf Beendigung von aktiven Verbindungen"
#: ../linkcheck/director/__init__.py:177
#: ../linkcheck/director/__init__.py:181
msgid "another interrupt will exit immediately"
msgstr "ein weiter Abbruch beendet dieses Programm sofort"
#: ../linkcheck/director/__init__.py:193
#: ../linkcheck/director/__init__.py:197
msgid "user abort; force shutdown"
msgstr "Benutzerabbruch; erzwinge Programmende"
@ -151,72 +147,72 @@ msgstr "konnte Rechnernamen %(host)r nicht parsen: %(msg)s"
msgid "Error parsing configuration: %s"
msgstr "Fehler beim Parsen der Konfiguration: %s"
#: ../linkcheck/configuration/confparse.py:116
#: ../linkcheck/configuration/confparse.py:119
#, python-format
msgid "invalid negative value for timeout: %d\n"
msgstr "ungültiger negativer Wert für timeout: %d\n"
#: ../linkcheck/configuration/confparse.py:138
#: ../linkcheck/configuration/confparse.py:140
#, python-format
msgid "invalid negative value for pause: %d\n"
msgstr "ungültiger negativer Wert für pause: %d\n"
#: ../linkcheck/configuration/confparse.py:171
#: ../linkcheck/configuration/confparse.py:170
#, python-format
msgid "missing auth part in entry %(val)r"
msgstr "fehlende Authentifizierung in entry %(val)r"
#: ../linkcheck/configuration/confparse.py:177
#: ../linkcheck/configuration/confparse.py:176
#, 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:286
#: ../linkcheck/configuration/__init__.py:288
msgid "missing user or URL pattern in authentication data."
msgstr "Fehlender Benutzer oder regulärer URL Ausdruck in Authentifizierungsdaten."
#: ../linkcheck/configuration/__init__.py:332
#: ../linkcheck/configuration/__init__.py:334
msgid "activating text logger output."
msgstr "aktiviere Loggerausgabe text."
#: ../linkcheck/configuration/__init__.py:342
#: ../linkcheck/configuration/__init__.py:344
msgid "Clamav could not be initialized"
msgstr "Clamav konnte nicht initialisiert werden"
#: ../linkcheck/configuration/__init__.py:348
#: ../linkcheck/configuration/__init__.py:350
msgid "activating sendcookies."
msgstr "aktiviere Option sendcookies."
#: ../linkcheck/configuration/__init__.py:351
#: ../linkcheck/configuration/__init__.py:353
msgid "activating storecookies."
msgstr "aktiviere Option storecookies."
#: ../linkcheck/configuration/__init__.py:360
#: ../linkcheck/configuration/__init__.py:362
msgid "no CGI password fieldname given for login URL."
msgstr " kein CGI Passwort Feldname für Login URL angegeben."
#: ../linkcheck/configuration/__init__.py:364
#: ../linkcheck/configuration/__init__.py:366
msgid "no CGI user fieldname given for login URL."
msgstr "kein CGI Benutzer Feldname für Login URL angegeben."
#: ../linkcheck/configuration/__init__.py:368
#: ../linkcheck/configuration/__init__.py:370
msgid "no user/password authentication data found for login URL."
msgstr "keine Benutzer/Passwort-Authentifizierung für Login URL gefunden."
#: ../linkcheck/configuration/__init__.py:371
#: ../linkcheck/configuration/__init__.py:373
msgid "login URL is not a HTTP URL."
msgstr "Login URL ist keine HTTP URL."
#: ../linkcheck/configuration/__init__.py:375
#: ../linkcheck/configuration/__init__.py:377
msgid "login URL is incomplete."
msgstr "Login URL ist unvollständig."
#: ../linkcheck/configuration/__init__.py:379
#: ../linkcheck/configuration/__init__.py:381
#, python-format
msgid "disabling login URL %(url)s."
msgstr "deaktiviere Login URL %(url)s."
#: ../linkcheck/configuration/__init__.py:419
#: ../linkcheck/configuration/__init__.py:421
#, 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"
@ -788,7 +784,7 @@ msgstr "Verfügbare Anker: %(anchors)s."
#: ../linkcheck/checker/urlbase.py:711
#: ../linkcheck/checker/fileurl.py:190
#: ../linkcheck/checker/httpurl.py:683
#: ../linkcheck/checker/httpurl.py:666
msgid "File size too large"
msgstr "Dateigröße ist zu groß"
@ -917,45 +913,45 @@ msgstr "unbekannt"
msgid "Server `%(name)s' did not support HEAD request; a GET request was used instead."
msgstr "Server `%(name)s' unterstützte keine HEAD Anfrage; eine GET Anfrage wurde stattdessen verwendet."
#: ../linkcheck/checker/httpurl.py:209
#: ../linkcheck/checker/httpurl.py:205
#, python-format
msgid "Enforced proxy `%(name)s'."
msgstr "Erzwungener Proxy `%(name)s'."
#: ../linkcheck/checker/httpurl.py:214
#: ../linkcheck/checker/httpurl.py:210
#, python-format
msgid "Enforced proxy `%(name)s' ignored, aborting."
msgstr "Erzwungener Proxy `%(name)s' wurde ignoriert, breche ab."
#: ../linkcheck/checker/httpurl.py:245
#: ../linkcheck/checker/httpurl.py:237
#, python-format
msgid "more than %d redirections, aborting"
msgstr "mehr als %d Weiterleitungen, breche ab"
#: ../linkcheck/checker/httpurl.py:255
#: ../linkcheck/checker/httpurl.py:247
#, python-format
msgid "Unsupported HTTP authentication `%(auth)s', only `Basic' authentication is supported."
msgstr "Nicht unterstützte HTTP Authentifizierungsmethode `%(auth)s', nur `Basic' Authentifizierung ist unterstützt."
#: ../linkcheck/checker/httpurl.py:325
#: ../linkcheck/checker/httpurl.py:308
#, python-format
msgid "Redirected to `%(url)s'."
msgstr "Zu `%(url)s' umgeleitet."
#: ../linkcheck/checker/httpurl.py:367
#: ../linkcheck/checker/httpurl.py:350
#, python-format
msgid "Redirection to url `%(newurl)s' is not allowed."
msgstr "Umleitung zu `%(newurl)s' ist nicht erlaubt."
#: ../linkcheck/checker/httpurl.py:388
#: ../linkcheck/checker/httpurl.py:371
msgid "The redirected URL is outside of the domain filter, checked only syntax."
msgstr "Die Weiterleitungs-URL ist außerhalb des Domain Filters; prüfe lediglich Syntax."
#: ../linkcheck/checker/httpurl.py:401
#: ../linkcheck/checker/httpurl.py:384
msgid "Access to redirected URL denied by robots.txt, checked only syntax."
msgstr "Zugriff zur Weiterleitungs-URL verweigert durch robots.txt; prüfe lediglich Syntax."
#: ../linkcheck/checker/httpurl.py:419
#: ../linkcheck/checker/httpurl.py:402
#, python-format
msgid ""
"recursive redirection encountered:\n"
@ -964,41 +960,41 @@ msgstr ""
"Rekursive Weiterleitung entdeckt:\n"
" %(urls)s"
#: ../linkcheck/checker/httpurl.py:436
#: ../linkcheck/checker/httpurl.py:419
#, python-format
msgid "Redirection to URL `%(newurl)s' with different scheme found; the original URL was `%(url)s'."
msgstr "Weiterleitung zu URL `%(newurl)s' mit anderem Schema gefunden; die Original-URL war `%(url)s'."
#: ../linkcheck/checker/httpurl.py:448
#: ../linkcheck/checker/httpurl.py:431
msgid "HTTP 301 (moved permanent) encountered: you should update this link."
msgstr "HTTP 301 (moved permanent) gefunden: sie sollten diesen Link aktualisieren."
#: ../linkcheck/checker/httpurl.py:493
#: ../linkcheck/checker/httpurl.py:476
#, python-format
msgid "Last modified %(date)s."
msgstr "Letzte Änderung %(date)s."
#: ../linkcheck/checker/httpurl.py:591
#: ../linkcheck/checker/httpurl.py:574
#, python-format
msgid "Sent Cookie: %(cookie)s."
msgstr "Gesendetes Cookie: %(cookie)s."
#: ../linkcheck/checker/httpurl.py:597
#: ../linkcheck/checker/httpurl.py:580
#, python-format
msgid "Could not store cookies from headers: %(error)s."
msgstr "Konnte Cookies nicht aus Kopfdaten speichern: %(error)s."
#: ../linkcheck/checker/httpurl.py:657
#: ../linkcheck/checker/httpurl.py:640
#, python-format
msgid "Unsupported HTTP url scheme `%(scheme)s'"
msgstr "Nicht unterstütztes HTTP URL Schema `%(scheme)s'"
#: ../linkcheck/checker/httpurl.py:703
#: ../linkcheck/checker/httpurl.py:686
#, python-format
msgid "Decompress error %(err)s"
msgstr "Entkomprimierungsfehler %(err)s"
#: ../linkcheck/checker/httpurl.py:719
#: ../linkcheck/checker/httpurl.py:702
#, python-format
msgid "Unsupported content encoding `%(encoding)s'."
msgstr "Content-Encoding `%(encoding)s' wird nicht unterstützt."
@ -1211,7 +1207,7 @@ msgid "&Options"
msgstr "&Optionen"
#: ../linkcheck/gui/linkchecker_ui_main.py:813
#: ../linkcheck/gui/linkchecker_ui_options.py:129
#: ../linkcheck/gui/linkchecker_ui_options.py:137
#: /usr/lib/python2.7/optparse.py:1626
msgid "Options"
msgstr "Optionen"
@ -1355,16 +1351,16 @@ msgstr "Ein Fehler ist während der Update-Prüfung von %(app)s aufgetreten: %(e
msgid "Insert %(browser)s bookmark file"
msgstr "%(browser)s Favoritendatei einfügen"
#: ../linkcheck/gui/options.py:105
#: ../linkcheck/gui/linkchecker_ui_options.py:144
#: ../linkcheck/gui/options.py:113
#: ../linkcheck/gui/linkchecker_ui_options.py:153
msgid "Edit"
msgstr "Bearbeiten"
#: ../linkcheck/gui/options.py:107
#: ../linkcheck/gui/options.py:115
msgid "Read"
msgstr "Lesen"
#: ../linkcheck/gui/options.py:110
#: ../linkcheck/gui/options.py:118
msgid "File not found"
msgstr "Datei nicht gefunden"
@ -1401,28 +1397,28 @@ msgid "&Save"
msgstr "&Speichern"
#: ../linkcheck/gui/__init__.py:158
#: ../linkcheck/gui/__init__.py:483
#: ../linkcheck/gui/__init__.py:499
msgid "Ready."
msgstr "Bereit."
#: ../linkcheck/gui/__init__.py:185
#: ../linkcheck/gui/__init__.py:187
msgid "Check finished."
msgstr "Prüfung beendet."
#: ../linkcheck/gui/__init__.py:294
#: ../linkcheck/gui/__init__.py:297
msgid "Start"
msgstr "Start"
#: ../linkcheck/gui/__init__.py:319
#: ../linkcheck/gui/__init__.py:322
msgid "Stop"
msgstr "Anhalten"
#: ../linkcheck/gui/__init__.py:367
#: ../linkcheck/gui/__init__.py:370
#, python-format
msgid "About %(appname)s"
msgstr "Über %(appname)s"
#: ../linkcheck/gui/__init__.py:368
#: ../linkcheck/gui/__init__.py:371
#, python-format
msgid ""
"<qt><center>\n"
@ -1451,89 +1447,108 @@ msgstr ""
"<a href=\"%(donateurl)s\">Spende</a> in Betracht ziehen. Vielen Dank!\n"
"</qt>"
#: ../linkcheck/gui/__init__.py:418
#: ../linkcheck/gui/__init__.py:423
msgid "Closing pending connections..."
msgstr "Schließe aktuelle Verbindungen..."
#: ../linkcheck/gui/__init__.py:452
#: ../linkcheck/gui/__init__.py:439
#: ../linkchecker:795
msgid "Dumping memory statistics..."
msgstr "Generiere Speicherabzug..."
#: ../linkcheck/gui/__init__.py:441
msgid "LinkChecker memory dump written"
msgstr "LinkChecker Speicherabzug geschrieben"
#: ../linkcheck/gui/__init__.py:442
#: ../linkchecker:797
#, python-format
msgid "The memory dump has been written to `%(filename)s'."
msgstr "Der Speicherabzug wurde in Datei `%(filename)s' geschrieben."
#: ../linkcheck/gui/__init__.py:468
msgid "Error, empty URL"
msgstr "Fehler, leere URL"
#: ../linkcheck/gui/__init__.py:454
#: ../linkcheck/gui/__init__.py:470
#, python-format
msgid "Checking '%s'."
msgstr "Prüfe '%s'"
#: ../linkcheck/gui/__init__.py:460
#: ../linkcheck/gui/__init__.py:476
#, python-format
msgid "Error, invalid URL `%s'."
msgstr "Fehler, ungültige URL `%s'."
#: ../linkcheck/gui/__init__.py:480
#: ../linkcheck/gui/__init__.py:496
#, python-format
msgid "%d URL selected."
msgid_plural "%d URLs selected"
msgstr[0] "%4d Verknüpfung ausgewählt"
msgstr[1] "%4d Verknüpfungen ausgewählt"
#: ../linkcheck/gui/__init__.py:561
#: ../linkcheck/gui/__init__.py:577
msgid "LinkChecker internal error"
msgstr "LinkChecker interner Fehler"
#: ../linkcheck/gui/linkchecker_ui_options.py:130
#: ../linkcheck/gui/linkchecker_ui_options.py:138
#: ../linkchecker:440
msgid "Checking options"
msgstr "Prüf-Optionen"
#: ../linkcheck/gui/linkchecker_ui_options.py:131
#: ../linkcheck/gui/linkchecker_ui_options.py:133
#: ../linkcheck/gui/linkchecker_ui_options.py:139
#: ../linkcheck/gui/linkchecker_ui_options.py:141
msgid "Check recursively all links up to given depth. A negative depth will enable infinite recursion."
msgstr ""
"Prüfe rekursiv alle Verknüpfungen bis zu der angegebenen Tiefe. Eine\n"
"negative Tiefe erwirkt unendliche Rekursion."
#: ../linkcheck/gui/linkchecker_ui_options.py:132
#: ../linkcheck/gui/linkchecker_ui_options.py:140
msgid "Recursive depth"
msgstr "Rekursionstiefe"
#: ../linkcheck/gui/linkchecker_ui_options.py:134
#: ../linkcheck/gui/linkchecker_ui_options.py:136
#: ../linkcheck/gui/linkchecker_ui_options.py:142
#: ../linkcheck/gui/linkchecker_ui_options.py:144
msgid "Log all checked URLs once. Default is to log only errors and warnings."
msgstr "Gebe alle URLs aus. Standard ist es, nur fehlerhafte URLs und Warnungen auszugeben."
#: ../linkcheck/gui/linkchecker_ui_options.py:135
#: ../linkcheck/gui/linkchecker_ui_options.py:143
msgid "Verbose output"
msgstr "Ausführliche Ausgabe"
#: ../linkcheck/gui/linkchecker_ui_options.py:137
#: ../linkcheck/gui/linkchecker_ui_options.py:145
msgid "Debug"
msgstr "Debug"
#: ../linkcheck/gui/linkchecker_ui_options.py:138
#: ../linkcheck/gui/linkchecker_ui_options.py:146
msgid "Debug memory usage"
msgstr "Speicherverbrauch debuggen"
#: ../linkcheck/gui/linkchecker_ui_options.py:147
msgid "Warn when one of these strings are found (one per line):"
msgstr "Warne wenn einer dieser Zeichenketten gefunden wurde (eine pro Zeile):"
#: ../linkcheck/gui/linkchecker_ui_options.py:139
#: ../linkcheck/gui/linkchecker_ui_options.py:148
msgid "Ignore URLs matching one of these patterns (one per line):"
msgstr "Ignoriere URLs die auf einen dieser Ausdrücke passen (einer pro Zeile):"
#: ../linkcheck/gui/linkchecker_ui_options.py:140
#: ../linkcheck/gui/linkchecker_ui_options.py:149
msgid "Configuration file"
msgstr "Konfigurationsdatei"
#: ../linkcheck/gui/linkchecker_ui_options.py:141
#: ../linkcheck/gui/linkchecker_ui_options.py:150
msgid "The configuration file holds advanced options and can be edited with an integrated text editor."
msgstr "Die Konfigurationsdatei enthält fortgeschrittene Optionen und kann mit einem integrierten Texteditor bearbeitet werden."
#: ../linkcheck/gui/linkchecker_ui_options.py:142
#: ../linkcheck/gui/linkchecker_ui_options.py:151
msgid "Overrides system wide configuration file settings."
msgstr "Überschreibt systemweite Konfiguration."
#: ../linkcheck/gui/linkchecker_ui_options.py:143
#: ../linkcheck/gui/linkchecker_ui_options.py:152
msgid "/home/user/.linkchecker/linkcheckerrc"
msgstr "/home/user/.linkchecker/linkcheckerrc"
#: ../linkcheck/gui/linkchecker_ui_options.py:145
#: ../linkcheck/gui/linkchecker_ui_options.py:154
msgid "Close"
msgstr "Schließen"
@ -1642,46 +1657,51 @@ msgstr ""
"enth&auml;lt: <code>A-Za-z0-9./_~-</code><br><br>Fehler werden geloggt.\n"
"</blockquote></body></html>"
#: ../linkcheck/strformat.py:230
#: ../linkcheck/strformat.py:237
#, python-format
msgid "%(prefix)s%(duration).02f seconds"
msgstr "%(prefix)s%(duration).02f Sekunden"
#: ../linkcheck/strformat.py:233
#: ../linkcheck/strformat.py:240
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d Sekunde"
msgstr[1] "%d Sekunden"
#: ../linkcheck/strformat.py:234
#: ../linkcheck/strformat.py:241
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] "%d Minute"
msgstr[1] "%d Minuten"
#: ../linkcheck/strformat.py:235
#: ../linkcheck/strformat.py:242
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d Stunde"
msgstr[1] "%d Stunden"
#: ../linkcheck/strformat.py:236
#: ../linkcheck/strformat.py:243
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] "%d Tag"
msgstr[1] "%d Tage"
#: ../linkcheck/strformat.py:237
#: ../linkcheck/strformat.py:244
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] "%d Jahr"
msgstr[1] "%d Jahre"
#: ../linkcheck/strformat.py:313
#, python-format
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."
#: ../linkchecker:54
msgid "USAGE\tlinkchecker [options] [file-or-url]..."
msgstr "BENUTZUNG\tlinkchecker [Optionen] [datei-oder-url]..."
@ -2441,6 +2461,9 @@ msgstr "%s Option erfordert %d Argumente"
msgid "%s option does not take a value"
msgstr "%s Option nimmt kein Wert"
#~ msgid "Could not import twill for login URL visit"
#~ msgstr "Konnte twill nicht importieren, um die Login URL zu besuchen."
#~ msgid "invalid %s option syntax"
#~ msgstr "ungültige Option %s"

View file

@ -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-04-22 21:50+0200\n"
"POT-Creation-Date: 2012-06-10 12:22+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"
@ -89,40 +89,36 @@ msgstr ""
msgid "Local time:"
msgstr ""
#: ../linkcheck/director/__init__.py:37
msgid "Could not import twill for login URL visit"
msgstr ""
#: ../linkcheck/director/__init__.py:44
#: ../linkcheck/director/__init__.py:48
#, python-format
msgid "Error visiting login URL %(url)s."
msgstr ""
#: ../linkcheck/director/__init__.py:49
#: ../linkcheck/director/__init__.py:53
#, python-format
msgid "Error posting form at login URL %(url)s."
msgstr ""
#: ../linkcheck/director/__init__.py:126
#: ../linkcheck/director/__init__.py:130
#, python-format
msgid "Error using login URL: %(msg)s."
msgstr ""
#: ../linkcheck/director/__init__.py:142
#: ../linkcheck/director/__init__.py:146
msgid ""
"Could not start a new thread. Check that the current user is allowed to start "
"new threads."
msgstr ""
#: ../linkcheck/director/__init__.py:175
#: ../linkcheck/director/__init__.py:179
msgid "user interrupt; waiting for active threads to finish"
msgstr ""
#: ../linkcheck/director/__init__.py:177
#: ../linkcheck/director/__init__.py:181
msgid "another interrupt will exit immediately"
msgstr ""
#: ../linkcheck/director/__init__.py:193
#: ../linkcheck/director/__init__.py:197
msgid "user abort; force shutdown"
msgstr ""
@ -140,72 +136,72 @@ msgstr ""
msgid "Error parsing configuration: %s"
msgstr ""
#: ../linkcheck/configuration/confparse.py:116
#: ../linkcheck/configuration/confparse.py:119
#, python-format
msgid "invalid negative value for timeout: %d\n"
msgstr ""
#: ../linkcheck/configuration/confparse.py:138
#: ../linkcheck/configuration/confparse.py:140
#, python-format
msgid "invalid negative value for pause: %d\n"
msgstr ""
#: ../linkcheck/configuration/confparse.py:171
#: ../linkcheck/configuration/confparse.py:170
#, python-format
msgid "missing auth part in entry %(val)r"
msgstr ""
#: ../linkcheck/configuration/confparse.py:177
#: ../linkcheck/configuration/confparse.py:176
#, python-format
msgid "invalid login URL `%s'. Only HTTP and HTTPS URLs are supported."
msgstr ""
#: ../linkcheck/configuration/__init__.py:286
#: ../linkcheck/configuration/__init__.py:288
msgid "missing user or URL pattern in authentication data."
msgstr ""
#: ../linkcheck/configuration/__init__.py:332
#: ../linkcheck/configuration/__init__.py:334
msgid "activating text logger output."
msgstr ""
#: ../linkcheck/configuration/__init__.py:342
#: ../linkcheck/configuration/__init__.py:344
msgid "Clamav could not be initialized"
msgstr ""
#: ../linkcheck/configuration/__init__.py:348
#: ../linkcheck/configuration/__init__.py:350
msgid "activating sendcookies."
msgstr ""
#: ../linkcheck/configuration/__init__.py:351
#: ../linkcheck/configuration/__init__.py:353
msgid "activating storecookies."
msgstr ""
#: ../linkcheck/configuration/__init__.py:360
#: ../linkcheck/configuration/__init__.py:362
msgid "no CGI password fieldname given for login URL."
msgstr ""
#: ../linkcheck/configuration/__init__.py:364
#: ../linkcheck/configuration/__init__.py:366
msgid "no CGI user fieldname given for login URL."
msgstr ""
#: ../linkcheck/configuration/__init__.py:368
#: ../linkcheck/configuration/__init__.py:370
msgid "no user/password authentication data found for login URL."
msgstr ""
#: ../linkcheck/configuration/__init__.py:371
#: ../linkcheck/configuration/__init__.py:373
msgid "login URL is not a HTTP URL."
msgstr ""
#: ../linkcheck/configuration/__init__.py:375
#: ../linkcheck/configuration/__init__.py:377
msgid "login URL is incomplete."
msgstr ""
#: ../linkcheck/configuration/__init__.py:379
#: ../linkcheck/configuration/__init__.py:381
#, python-format
msgid "disabling login URL %(url)s."
msgstr ""
#: ../linkcheck/configuration/__init__.py:419
#: ../linkcheck/configuration/__init__.py:421
#, python-format
msgid "could not copy initial configuration file %(src)r to %(dst)r: %(errmsg)r"
msgstr ""
@ -757,7 +753,7 @@ msgid "Available anchors: %(anchors)s."
msgstr ""
#: ../linkcheck/checker/urlbase.py:711 ../linkcheck/checker/fileurl.py:190
#: ../linkcheck/checker/httpurl.py:683
#: ../linkcheck/checker/httpurl.py:666
msgid "File size too large"
msgstr ""
@ -889,90 +885,90 @@ msgid ""
"instead."
msgstr ""
#: ../linkcheck/checker/httpurl.py:209
#: ../linkcheck/checker/httpurl.py:205
#, python-format
msgid "Enforced proxy `%(name)s'."
msgstr ""
#: ../linkcheck/checker/httpurl.py:214
#: ../linkcheck/checker/httpurl.py:210
#, python-format
msgid "Enforced proxy `%(name)s' ignored, aborting."
msgstr ""
#: ../linkcheck/checker/httpurl.py:245
#: ../linkcheck/checker/httpurl.py:237
#, python-format
msgid "more than %d redirections, aborting"
msgstr ""
#: ../linkcheck/checker/httpurl.py:255
#: ../linkcheck/checker/httpurl.py:247
#, python-format
msgid ""
"Unsupported HTTP authentication `%(auth)s', only `Basic' authentication is "
"supported."
msgstr ""
#: ../linkcheck/checker/httpurl.py:325
#: ../linkcheck/checker/httpurl.py:308
#, python-format
msgid "Redirected to `%(url)s'."
msgstr ""
#: ../linkcheck/checker/httpurl.py:367
#: ../linkcheck/checker/httpurl.py:350
#, python-format
msgid "Redirection to url `%(newurl)s' is not allowed."
msgstr ""
#: ../linkcheck/checker/httpurl.py:388
#: ../linkcheck/checker/httpurl.py:371
msgid "The redirected URL is outside of the domain filter, checked only syntax."
msgstr ""
#: ../linkcheck/checker/httpurl.py:401
#: ../linkcheck/checker/httpurl.py:384
msgid "Access to redirected URL denied by robots.txt, checked only syntax."
msgstr ""
#: ../linkcheck/checker/httpurl.py:419
#: ../linkcheck/checker/httpurl.py:402
#, python-format
msgid ""
"recursive redirection encountered:\n"
" %(urls)s"
msgstr ""
#: ../linkcheck/checker/httpurl.py:436
#: ../linkcheck/checker/httpurl.py:419
#, python-format
msgid ""
"Redirection to URL `%(newurl)s' with different scheme found; the original URL "
"was `%(url)s'."
msgstr ""
#: ../linkcheck/checker/httpurl.py:448
#: ../linkcheck/checker/httpurl.py:431
msgid "HTTP 301 (moved permanent) encountered: you should update this link."
msgstr ""
#: ../linkcheck/checker/httpurl.py:493
#: ../linkcheck/checker/httpurl.py:476
#, python-format
msgid "Last modified %(date)s."
msgstr ""
#: ../linkcheck/checker/httpurl.py:591
#: ../linkcheck/checker/httpurl.py:574
#, python-format
msgid "Sent Cookie: %(cookie)s."
msgstr ""
#: ../linkcheck/checker/httpurl.py:597
#: ../linkcheck/checker/httpurl.py:580
#, python-format
msgid "Could not store cookies from headers: %(error)s."
msgstr ""
#: ../linkcheck/checker/httpurl.py:657
#: ../linkcheck/checker/httpurl.py:640
#, python-format
msgid "Unsupported HTTP url scheme `%(scheme)s'"
msgstr ""
#: ../linkcheck/checker/httpurl.py:703
#: ../linkcheck/checker/httpurl.py:686
#, python-format
msgid "Decompress error %(err)s"
msgstr ""
#: ../linkcheck/checker/httpurl.py:719
#: ../linkcheck/checker/httpurl.py:702
#, python-format
msgid "Unsupported content encoding `%(encoding)s'."
msgstr ""
@ -1185,7 +1181,7 @@ msgid "&Options"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_main.py:813
#: ../linkcheck/gui/linkchecker_ui_options.py:129
#: ../linkcheck/gui/linkchecker_ui_options.py:137
#: /usr/lib/python2.7/optparse.py:1626
msgid "Options"
msgstr ""
@ -1333,16 +1329,16 @@ msgstr ""
msgid "Insert %(browser)s bookmark file"
msgstr ""
#: ../linkcheck/gui/options.py:105
#: ../linkcheck/gui/linkchecker_ui_options.py:144
#: ../linkcheck/gui/options.py:113
#: ../linkcheck/gui/linkchecker_ui_options.py:153
msgid "Edit"
msgstr ""
#: ../linkcheck/gui/options.py:107
#: ../linkcheck/gui/options.py:115
msgid "Read"
msgstr ""
#: ../linkcheck/gui/options.py:110
#: ../linkcheck/gui/options.py:118
msgid "File not found"
msgstr ""
@ -1378,28 +1374,28 @@ msgstr ""
msgid "&Save"
msgstr ""
#: ../linkcheck/gui/__init__.py:158 ../linkcheck/gui/__init__.py:483
#: ../linkcheck/gui/__init__.py:158 ../linkcheck/gui/__init__.py:499
msgid "Ready."
msgstr ""
#: ../linkcheck/gui/__init__.py:185
#: ../linkcheck/gui/__init__.py:187
msgid "Check finished."
msgstr ""
#: ../linkcheck/gui/__init__.py:294
#: ../linkcheck/gui/__init__.py:297
msgid "Start"
msgstr ""
#: ../linkcheck/gui/__init__.py:319
#: ../linkcheck/gui/__init__.py:322
msgid "Stop"
msgstr ""
#: ../linkcheck/gui/__init__.py:367
#: ../linkcheck/gui/__init__.py:370
#, python-format
msgid "About %(appname)s"
msgstr ""
#: ../linkcheck/gui/__init__.py:368
#: ../linkcheck/gui/__init__.py:371
#, python-format
msgid ""
"<qt><center>\n"
@ -1416,90 +1412,107 @@ msgid ""
"</center></qt>"
msgstr ""
#: ../linkcheck/gui/__init__.py:418
#: ../linkcheck/gui/__init__.py:423
msgid "Closing pending connections..."
msgstr ""
#: ../linkcheck/gui/__init__.py:452
#: ../linkcheck/gui/__init__.py:439 ../linkchecker:795
msgid "Dumping memory statistics..."
msgstr ""
#: ../linkcheck/gui/__init__.py:441
msgid "LinkChecker memory dump written"
msgstr ""
#: ../linkcheck/gui/__init__.py:442 ../linkchecker:797
#, python-format
msgid "The memory dump has been written to `%(filename)s'."
msgstr ""
#: ../linkcheck/gui/__init__.py:468
msgid "Error, empty URL"
msgstr ""
#: ../linkcheck/gui/__init__.py:454
#: ../linkcheck/gui/__init__.py:470
#, python-format
msgid "Checking '%s'."
msgstr ""
#: ../linkcheck/gui/__init__.py:460
#: ../linkcheck/gui/__init__.py:476
#, python-format
msgid "Error, invalid URL `%s'."
msgstr ""
#: ../linkcheck/gui/__init__.py:480
#: ../linkcheck/gui/__init__.py:496
#, python-format
msgid "%d URL selected."
msgid_plural "%d URLs selected"
msgstr[0] ""
msgstr[1] ""
#: ../linkcheck/gui/__init__.py:561
#: ../linkcheck/gui/__init__.py:577
msgid "LinkChecker internal error"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:130 ../linkchecker:440
#: ../linkcheck/gui/linkchecker_ui_options.py:138 ../linkchecker:440
msgid "Checking options"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:131
#: ../linkcheck/gui/linkchecker_ui_options.py:133
#: ../linkcheck/gui/linkchecker_ui_options.py:139
#: ../linkcheck/gui/linkchecker_ui_options.py:141
msgid ""
"Check recursively all links up to given depth. A negative depth will enable "
"infinite recursion."
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:132
#: ../linkcheck/gui/linkchecker_ui_options.py:140
msgid "Recursive depth"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:134
#: ../linkcheck/gui/linkchecker_ui_options.py:136
#: ../linkcheck/gui/linkchecker_ui_options.py:142
#: ../linkcheck/gui/linkchecker_ui_options.py:144
msgid "Log all checked URLs once. Default is to log only errors and warnings."
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:135
#: ../linkcheck/gui/linkchecker_ui_options.py:143
msgid "Verbose output"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:137
#: ../linkcheck/gui/linkchecker_ui_options.py:145
msgid "Debug"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:138
#: ../linkcheck/gui/linkchecker_ui_options.py:146
msgid "Debug memory usage"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:147
msgid "Warn when one of these strings are found (one per line):"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:139
#: ../linkcheck/gui/linkchecker_ui_options.py:148
msgid "Ignore URLs matching one of these patterns (one per line):"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:140
#: ../linkcheck/gui/linkchecker_ui_options.py:149
msgid "Configuration file"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:141
#: ../linkcheck/gui/linkchecker_ui_options.py:150
msgid ""
"The configuration file holds advanced options and can be edited with an "
"integrated text editor."
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:142
#: ../linkcheck/gui/linkchecker_ui_options.py:151
msgid "Overrides system wide configuration file settings."
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:143
#: ../linkcheck/gui/linkchecker_ui_options.py:152
msgid "/home/user/.linkchecker/linkcheckerrc"
msgstr ""
#: ../linkcheck/gui/linkchecker_ui_options.py:145
#: ../linkcheck/gui/linkchecker_ui_options.py:154
msgid "Close"
msgstr ""
@ -1600,46 +1613,53 @@ msgid ""
"</html>"
msgstr ""
#: ../linkcheck/strformat.py:230
#: ../linkcheck/strformat.py:237
#, python-format
msgid "%(prefix)s%(duration).02f seconds"
msgstr ""
#: ../linkcheck/strformat.py:233
#: ../linkcheck/strformat.py:240
#, python-format
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
#: ../linkcheck/strformat.py:234
#: ../linkcheck/strformat.py:241
#, python-format
msgid "%d minute"
msgid_plural "%d minutes"
msgstr[0] ""
msgstr[1] ""
#: ../linkcheck/strformat.py:235
#: ../linkcheck/strformat.py:242
#, python-format
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
msgstr[1] ""
#: ../linkcheck/strformat.py:236
#: ../linkcheck/strformat.py:243
#, python-format
msgid "%d day"
msgid_plural "%d days"
msgstr[0] ""
msgstr[1] ""
#: ../linkcheck/strformat.py:237
#: ../linkcheck/strformat.py:244
#, python-format
msgid "%d year"
msgid_plural "%d years"
msgstr[0] ""
msgstr[1] ""
#: ../linkcheck/strformat.py:313
#, python-format
msgid ""
"Could not import %(module)s for %(feature)s. Install %(module)s from %(url)s "
"to use this feature."
msgstr ""
#: ../linkchecker:54
msgid "USAGE\tlinkchecker [options] [file-or-url]..."
msgstr ""