diff --git a/Makefile b/Makefile
index edfb5bbe..d33cbc82 100644
--- a/Makefile
+++ b/Makefile
@@ -2,8 +2,8 @@
# call make.
VERSION=$(shell python setup.py --version)
HOST=treasure.calvinsplayground.de
-PROXY=
-#PROXY=-P$(HOST):5050
+#PROXY=
+PROXY=-P$(HOST):5050
#HOST=fsinfo.cs.uni-sb.de
#PROXY=-Pwww-proxy.uni-sb.de:3128
PACKAGE = linkchecker
@@ -44,7 +44,7 @@ dist:
fakeroot debian/rules binary
files:
- ./$(PACKAGE) -ocolored -Ftext -Fhtml -Fgml -Fsql -Fcsv -R -t0 -v $(PROXY) -i$(HOST) http://$(HOST)/~calvin/
+ ./$(PACKAGE) -ocolored -Ftext -Fhtml -Fgml -Fsql -Fcsv -R -t0 -v -D $(PROXY) -i$(HOST) http://$(HOST)/~calvin/
homepage:
scp debian/changelog shell1.sourceforge.net:/home/groups/linkchecker/htdocs/changes.txt
@@ -62,14 +62,14 @@ po:
--join-existing --keyword --keyword=_ \
--output-dir=locale/de/LC_MESSAGES/ --sort-output $(SOURCES)
# french translation
- #xgettext --default-domain=linkcheck \
- #--join-existing --keyword --keyword=_ \
- #--output-dir=locale/fr/LC_MESSAGES/ --sort-output $(SOURCES)
+ xgettext --default-domain=linkcheck \
+ --join-existing --keyword --keyword=_ \
+ --output-dir=locale/fr/LC_MESSAGES/ --sort-output $(SOURCES)
mo:
# german translation
msgfmt -o locale/de/LC_MESSAGES/linkcheck.mo \
locale/de/LC_MESSAGES/linkcheck.po
# french translation
- #msgfmt -o locale/fr/LC_MESSAGES/linkcheck.mo \
- #locale/fr/LC_MESSAGES/linkcheck.po
+ msgfmt -o locale/fr/LC_MESSAGES/linkcheck.mo \
+ locale/fr/LC_MESSAGES/linkcheck.po
diff --git a/TODO b/TODO
index 9413b0b8..91274ff8 100644
--- a/TODO
+++ b/TODO
@@ -10,6 +10,8 @@ o I want to be able to supply a "break" command even when multiple
The thread implementation of Python is somewhat sparse and does not allow
suspending/stopping of threads. What I am doing is to call sys.exit(1).
+o other translations
+
o Parse GML output and make a site map graphic (PNG format)
Use an existing layout algorithm.
diff --git a/debian/control b/debian/control
index b40b845a..a19d9268 100644
--- a/debian/control
+++ b/debian/control
@@ -13,11 +13,13 @@ Description: a link checker written in Python
Features:
o recursive checking
o multithreaded
- o output can be colored or normal text, HTML, SQL or a GML sitemap graph
- o HTTP/1.1 and 1.0, HTTPS, FTP, mailto:, Gopher, Telnet and
- local file links are supported
+ o output can be colored or normal text, HTML, SQL, CSV or a GML sitemap
+ graph
+ o HTTP/1.1, HTTPS, FTP, mailto:, news:, Gopher, Telnet and local file links
+ are supported
Javascript links are currently ignored
- o restrict link checking to your local domain
+ o restrict link checking with regular expression filters for URLs
o HTTP proxy support
o give username/password for HTTP and FTP authorization
o robots.txt exclusion protocol support
+ o internationalization support (currently english and german)
diff --git a/debian/dirs b/debian/dirs
index 14179382..3a9f7bd7 100644
--- a/debian/dirs
+++ b/debian/dirs
@@ -3,4 +3,3 @@ usr/lib/python1.5/site-packages/linkcheck
usr/bin
etc
usr/share/doc/linkchecker
-usr/share/locale/de/LC_MESSAGES
diff --git a/linkcheck/Config.py b/linkcheck/Config.py
index b6d0ef77..d6dc68fa 100644
--- a/linkcheck/Config.py
+++ b/linkcheck/Config.py
@@ -78,7 +78,6 @@ class Configuration(UserDict.UserDict):
def __init__(self):
"""Initialize the default options"""
UserDict.UserDict.__init__(self)
- self.data["log"] = Loggers["text"]()
self.data["verbose"] = 0
self.data["warnings"] = 0
self.data["anchors"] = 0
@@ -130,10 +129,12 @@ class Configuration(UserDict.UserDict):
}
self.data['csv'] = {
"filename": "linkchecker-out.csv",
+ 'separator': ';',
}
self.data['blacklist'] = {
"filename": "~/.blacklist",
}
+ self.data["log"] = self.newLogger('text')
self.data["quiet"] = 0
self.data["warningregex"] = None
self.data["nntpserver"] = os.environ.get("NNTP_SERVER",None)
@@ -236,7 +237,7 @@ class Configuration(UserDict.UserDict):
def robotsTxtCache_set_NoThreads(self, key, val):
self.robotsTxtCache[key] = val
- def newLogger(self, name, fileout):
+ def newLogger(self, name, fileout=0):
if fileout:
self.data['fileoutput'].append(apply(Loggers[name], (fileout,),
self.data[name]))
diff --git a/linkcheck/Logging.py b/linkcheck/Logging.py
index 55449503..524aac49 100644
--- a/linkcheck/Logging.py
+++ b/linkcheck/Logging.py
@@ -77,7 +77,10 @@ class StandardLogger:
def __init__(self, fileout=None, **args):
self.errors=0
self.warnings=0
- self.fd = fileout and args['filename'] or sys.stdout
+ if fileout:
+ self.fd = open(args['filename'], "w")
+ else:
+ self.fd = sys.stdout
def init(self):
@@ -154,11 +157,21 @@ class StandardLogger:
class HtmlLogger(StandardLogger):
"""Logger with HTML output"""
+ def __init__(self, fileout=None, **args):
+ apply(StandardLogger.__init__, (self, fileout), args)
+ self.colorbackground = args['colorbackground']
+ self.colorurl = args['colorurl']
+ self.colorborder = args['colorborder']
+ self.colorlink = args['colorlink']
+ self.tablewarning = args['tablewarning']
+ self.tableerror = args['tableerror']
+ self.tableok = args['tableok']
+
def init(self):
self.starttime = time.time()
self.fd.write("
"+Config.App+""+
- ""+
+ ""+
""+MyFont+Config.AppName+""+
"
"+
"
"+Config.Freeware+"
"+
@@ -169,12 +182,12 @@ class HtmlLogger(StandardLogger):
def newUrl(self, urlData):
self.fd.write("| "+
- MyFont+"URL | "+MyFont+
- StringUtil.htmlify(urlData.urlName))
+ " cellpadding=\"3\" bgcolor="+self.colorbackground+
+ "> | | "+
+ MyFont+"URL | "+
+ MyFont+StringUtil.htmlify(urlData.urlName))
if urlData.cached:
self.fd.write(_(" (cached)\n"))
self.fd.write(""+RowEnd)
@@ -207,16 +220,18 @@ class HtmlLogger(StandardLogger):
""+RowEnd)
if urlData.warningString:
self.warnings = self.warnings+1
- self.fd.write(" | "+TableWarning+MyFont+_("Warning")+
- ""+TableWarning+MyFont+
+ self.fd.write(" "+self.tablewarning+MyFont+_("Warning")+
+ ""+self.tablewarning+MyFont+
urlData.warningString+""+RowEnd)
if urlData.valid:
- self.fd.write(" "+TableOK+MyFont+_("Result")+""+
- TableOK+MyFont+urlData.validString+""+RowEnd)
+ self.fd.write(" "+self.tableok+MyFont+_("Result")+
+ ""+self.tableok+MyFont+
+ urlData.validString+""+RowEnd)
else:
self.errors = self.errors+1
- self.fd.write(" "+TableError+MyFont+_("Result")+""+
- TableError+MyFont+urlData.errorString+""+RowEnd)
+ self.fd.write(" "+self.tableerror+MyFont+_("Result")+
+ ""+self.tableerror+MyFont+
+ urlData.errorString+""+RowEnd)
self.fd.write("
|
")
self.fd.flush()
@@ -252,7 +267,17 @@ class ColoredLogger(StandardLogger):
"""ANSI colorized output"""
def __init__(self, fileout=None, **args):
- StandardLogger.__init__(self, fileout, args)
+ apply(StandardLogger.__init__, (self, fileout), args)
+ self.colorparent = args['colorparent']
+ self.colorurl = args['colorurl']
+ self.colorreal = args['colorreal']
+ self.colorbase = args['colorbase']
+ self.colorvalid = args['colorvalid']
+ self.colorinvalid = args['colorinvalid']
+ self.colorinfo = args['colorinfo']
+ self.colorwarning = args['colorwarning']
+ self.colordltime = args['colordltime']
+ self.colorreset = args['colorreset']
self.currentPage = None
self.prefix = 0
@@ -262,7 +287,8 @@ class ColoredLogger(StandardLogger):
if self.prefix:
self.fd.write("o\n")
self.fd.write("\n"+_("Parent URL")+Spaces["Parent URL"]+
- COL_PARENT+urlData.parentName+COL_RESET+"\n")
+ self.colorparent+urlData.parentName+
+ self.colorreset+"\n")
self.currentPage = urlData.parentName
self.prefix = 1
else:
@@ -275,8 +301,8 @@ class ColoredLogger(StandardLogger):
self.fd.write("|\n+- ")
else:
self.fd.write("\n")
- self.fd.write(_("URL")+Spaces["URL"]+COL_URL+urlData.urlName+
- COL_RESET)
+ self.fd.write(_("URL")+Spaces["URL"]+self.colorurl+urlData.urlName+
+ self.colorreset)
if urlData.line: self.fd.write(_(", line ")+`urlData.line`+"")
if urlData.cached:
self.fd.write(_(" (cached)\n"))
@@ -286,24 +312,25 @@ class ColoredLogger(StandardLogger):
if urlData.baseRef:
if self.prefix:
self.fd.write("| ")
- self.fd.write(_("Base")+Spaces["Base"]+COL_BASE+urlData.baseRef+
- COL_RESET+"\n")
+ self.fd.write(_("Base")+Spaces["Base"]+self.colorbase+
+ urlData.baseRef+self.colorreset+"\n")
if urlData.url:
if self.prefix:
self.fd.write("| ")
- self.fd.write(_("Real URL")+Spaces["Real URL"]+COL_REAL+
- urlData.url+COL_RESET+"\n")
+ self.fd.write(_("Real URL")+Spaces["Real URL"]+self.colorreal+
+ urlData.url+self.colorreset+"\n")
if urlData.downloadtime:
if self.prefix:
self.fd.write("| ")
- self.fd.write(_("D/L Time")+Spaces["D/L Time"]+COL_DLTIME+
- (_("%.3f seconds") % urlData.downloadtime)+COL_RESET+"\n")
+ self.fd.write(_("D/L Time")+Spaces["D/L Time"]+self.colordltime+
+ (_("%.3f seconds") % urlData.downloadtime)+self.colorreset+"\n")
if urlData.checktime:
if self.prefix:
self.fd.write("| ")
- self.fd.write(_("Check Time")+Spaces["Check Time"]+COL_DLTIME+
- (_("%.3f seconds") % urlData.checktime)+COL_RESET+"\n")
+ self.fd.write(_("Check Time")+Spaces["Check Time"]+
+ self.colordltime+
+ (_("%.3f seconds") % urlData.checktime)+self.colorreset+"\n")
if urlData.infoString:
if self.prefix:
@@ -314,23 +341,25 @@ class ColoredLogger(StandardLogger):
self.fd.write(_("Info")+Spaces["Info"]+
StringUtil.indentWith(StringUtil.blocktext(
urlData.infoString, 65), " "+Spaces["Info"]))
- self.fd.write(COL_RESET+"\n")
+ self.fd.write(self.colorreset+"\n")
if urlData.warningString:
self.warnings = self.warnings+1
if self.prefix:
self.fd.write("| ")
- self.fd.write(_("Warning")+Spaces["Warning"]+COL_WARNING+
- urlData.warningString+COL_RESET+"\n")
+ self.fd.write(_("Warning")+Spaces["Warning"]+self.colorwarning+
+ urlData.warningString+self.colorreset+"\n")
if self.prefix:
self.fd.write("| ")
self.fd.write(_("Result")+Spaces["Result"])
if urlData.valid:
- self.fd.write(COL_VALID+urlData.validString+COL_RESET+"\n")
+ self.fd.write(self.colorvalid+urlData.validString+
+ self.colorreset+"\n")
else:
self.errors = self.errors+1
- self.fd.write(COL_INVALID+urlData.errorString+COL_RESET+"\n")
+ self.fd.write(self.colorinvalid+urlData.errorString+
+ self.colorreset+"\n")
self.fd.flush()
@@ -345,12 +374,12 @@ class GMLLogger(StandardLogger):
your sitemap graph.
"""
def __init__(self, fileout=None, **args):
- StandardLogger.__init__(self, fileout, args)
+ apply(StandardLogger.__init__, (self, fileout), args)
self.nodes = []
def init(self):
self.starttime = time.time()
- self.fd.write(_("# created by %s at %s\n" % (Config.AppName,
+ self.fd.write(_("# created by %s at %s\n") % (Config.AppName,
_strtime(self.starttime)))
self.fd.write(_("# Get the newest version at %s\n") % Config.Url)
self.fd.write(_("# Write comments and bugs to %s\n\n") % Config.Email)
@@ -403,13 +432,13 @@ class GMLLogger(StandardLogger):
class SQLLogger(StandardLogger):
""" SQL output for PostgreSQL, not tested"""
def __init__(self, fileout=None, **args):
- StandardLogger.__init__(self, fileout, args)
+ apply(StandardLogger.__init__, (self, fileout), args)
self.dbname = args['dbname']
- self.commandsep = args['commandsep']
+ self.separator = args['separator']
def init(self):
self.starttime = time.time()
- self.fd.write(_("-- created by %s at %s\n" % (Config.AppName,
+ self.fd.write(_("-- created by %s at %s\n") % (Config.AppName,
_strtime(self.starttime)))
self.fd.write(_("-- Get the newest version at %s\n") % Config.Url)
self.fd.write(_("-- Write comments and bugs to %s\n\n") % Config.Email)
@@ -435,7 +464,7 @@ class SQLLogger(StandardLogger):
urlData.checktime,
urlData.downloadtime,
urlData.cached,
- self.commandsep))
+ self.separator))
self.fd.flush()
def endOfOutput(self):
@@ -477,7 +506,7 @@ class CSVLogger(StandardLogger):
separated by a semicolon.
"""
def __init__(self, fileout=None, **args):
- StandardLogger.__init__(self, fileout, args)
+ apply(StandardLogger.__init__, (self, fileout), args)
self.separator = args['separator']
def init(self):
diff --git a/linkchecker b/linkchecker
index 98dbb748..43b1ecdc 100755
--- a/linkchecker
+++ b/linkchecker
@@ -82,7 +82,7 @@ Usage = _("USAGE\tlinkchecker [options] file_or_url...\n"
" You can use this to check for pages that contain some form of\n"
" error message, for example 'This page has moved' or\n"
" 'Oracle Application Server error'.\n"
-" This option implies -w.\n") % linkcheck.Config.LoggerKeys)
+" This option implies -w.\n") % linkcheck.Config.LoggerKeys
Notes = _("NOTES\n"
"o LinkChecker assumes an http:// resp. ftp:// link when a commandline URL\n"
@@ -166,7 +166,7 @@ try:
if opt=="-f" or opt=="--config":
configfiles.append(arg)
config.read(configfiles)
-except:
+except IOError:
type, value = sys.exc_info()[:2]
printUsage(value)
@@ -200,15 +200,14 @@ for opt,arg in options:
elif opt=="-o" or opt=="--output":
if linkcheck.Config.Loggers.has_key(arg):
- config["log"] = linkcheck.Config.Loggers[arg]()
+ config.newLogger(arg)
else:
printUsage((_("Illegal argument '%s' for option ") % arg) +\
"'-o, --output'")
elif opt=="-F" or opt=="--file-output":
if linkcheck.Config.Loggers.has_key(arg) and arg != "blacklist":
- config["fileoutput"].append(linkcheck.Config.Loggers[arg](
- open(config["fileoutputnames"][arg], "w")))
+ config.newLogger(arg, 1)
else:
printUsage((_("Illegal argument '%s' for option ") % arg) +\
"'-F, --file-output'")
diff --git a/locale/de/LC_MESSAGES/linkcheck.po b/locale/de/LC_MESSAGES/linkcheck.po
index 4c448c5c..4b8433f4 100644
--- a/locale/de/LC_MESSAGES/linkcheck.po
+++ b/locale/de/LC_MESSAGES/linkcheck.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-06-03 14:05+0200\n"
+"POT-Creation-Date: 2000-06-03 14:59+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -14,75 +14,124 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
+#: linkcheck/Logging.py:134 linkcheck/Logging.py:226
+msgid ""
+"\n"
+"Thats it. "
+msgstr ""
+"\n"
+"Das wars. "
+
msgid " (%.3f seconds)"
msgstr " (%.3f Sekunden)"
+#: linkcheck/Logging.py:95 linkcheck/Logging.py:179 linkcheck/Logging.py:282
msgid " (cached)\n"
msgstr " (aus dem Cache)\n"
+#: linkcheck/Logging.py:143 linkcheck/Logging.py:234
msgid " errors"
msgstr " Fehler"
msgid " found."
msgstr " gefunden"
+#: linkcheck/Logging.py:144 linkcheck/Logging.py:235
msgid " found.\n"
msgstr " gefunden.\n"
+#: linkcheck/Logging.py:139 linkcheck/Logging.py:230
msgid " warnings, "
msgstr " Warnungen, "
+#: linkcheck/Logging.py:489
msgid "# Format of the entries:\n"
msgstr "# Format der Einträge:\n"
+#: linkcheck/Logging.py:355 linkcheck/Logging.py:487
+#, c-format
msgid "# Get the newest version at %s\n"
msgstr "# Die neueste Version gibt es unter %s\n"
+#: linkcheck/Logging.py:396 linkcheck/Logging.py:527
+#, c-format
msgid "# Stopped checking at %s (%.3f seconds)\n"
msgstr "# Beende Prüfen am %s (%.3f Sekunden)\n"
-msgid "# Write comments and bugs to %s\n\n"
-msgstr "# Kommentare und Fehler mailen Sie bitte an %s\n\n"
+#: linkcheck/Logging.py:356 linkcheck/Logging.py:488
+#, c-format
+msgid ""
+"# Write comments and bugs to %s\n"
+"\n"
+msgstr ""
+"# Kommentare und Fehler mailen Sie bitte an %s\n"
+"\n"
+#: linkcheck/Logging.py:353 linkcheck/Logging.py:485
+#, c-format
msgid "# created by %s at %s\n"
msgstr "# erstellt von %s am %s\n"
+#: linkcheck/Logging.py:197 linkcheck/Logging.py:202 linkcheck/Logging.py:301
+#: linkcheck/Logging.py:306
+#, c-format
msgid "%.3f seconds"
msgstr "%.3f Sekunden"
+#: linkcheck/Logging.py:108 linkcheck/Logging.py:111
+#, c-format
msgid "%.3f seconds\n"
msgstr "%.3f Sekunden\n"
+#: linkcheck/Logging.py:100 linkcheck/Logging.py:280
msgid ", line "
msgstr ", Zeile "
+#: linkcheck/Logging.py:414
+#, c-format
msgid "-- Get the newest version at %s\n"
msgstr "-- Die neueste Version gibt es unter %s\n"
+#: linkcheck/Logging.py:443
+#, c-format
msgid "-- Stopped checking at %s (%.3f seconds)\n"
msgstr "-- Beende Prüfen am %s (%.3f Sekunden)\n"
-msgid "-- Write comments and bugs to %s\n\n"
-msgstr "-- Kommentare und Fehler mailen Sie bitte an %s\n\n"
+#: linkcheck/Logging.py:415
+#, c-format
+msgid ""
+"-- Write comments and bugs to %s\n"
+"\n"
+msgstr ""
+"-- Kommentare und Fehler mailen Sie bitte an %s\n"
+"\n"
+#: linkcheck/Logging.py:412
+#, c-format
msgid "-- created by %s at %s\n"
msgstr "-- erstellt von %s am %s\n"
+#: linkcheck/Logging.py:141 linkcheck/Logging.py:232
msgid "1 error"
msgstr "1 Fehler"
+#: linkcheck/Logging.py:137 linkcheck/Logging.py:228
msgid "1 warning, "
msgstr "1 Warnung, "
+#: linkcheck/HttpUrlData.py:75
msgid "Access denied by robots.txt, checked only syntax"
msgstr "Zugriff verweigert durch robots.txt; prüfe lediglich Syntax"
+#: linkcheck/Logging.py:103 linkcheck/Logging.py:189 linkcheck/Logging.py:289
msgid "Base"
msgstr "Basis"
+#: linkcheck/Logging.py:110 linkcheck/Logging.py:200 linkcheck/Logging.py:305
msgid "Check Time"
msgstr "Prüfzeit"
+#: linkcheck/Logging.py:107 linkcheck/Logging.py:196 linkcheck/Logging.py:300
msgid "D/L Time"
msgstr "D/L Zeit"
@@ -106,52 +155,74 @@ msgstr ""
" linkchecker www.myhomepage.de\n"
" linkchecker -r0 ftp.linux.org\n"
+#: linkcheck/HttpUrlData.py:115
+#, c-format
msgid "Effective URL %s"
msgstr "Effektive URL %s"
+#: linkcheck/UrlData.py:50 linkcheck/UrlData.py:68
msgid "Error"
msgstr "Fehler"
+#: linkchecker:125
+#, c-format
msgid "Error: %s\n"
msgstr "Fehler: %s\n"
+#: linkchecker:126
msgid "Execute 'linkchecker -h' for help\n"
msgstr "Führen Sie 'linkchecker -h' aus um Hilfe zu erhalten\n"
+#: linkcheck/Logging.py:86 linkcheck/Logging.py:242
+#, c-format
msgid "Get the newest version at %s\n"
-msgstr "Die neueste Version gibt es unter"
+msgstr "Die neueste Version gibt es unter %s\n"
+#: linkcheck/FtpUrlData.py:34
msgid "Got no answer from FTP server"
msgstr "Keine Antwort vom FTP Server"
+#: linkcheck/NntpUrlData.py:41
+#, c-format
msgid "Group %s has %s articles, range %s to %s"
msgstr "Gruppe %s hat %s Artikel, von %s bis %s"
+#: linkcheck/HttpUrlData.py:119
msgid "HTTP 301 (moved permanent) encountered: you should update this link"
msgstr ""
"HTTP 301 (moved permanent) gefunden: Sie sollten diesen Link aktualisieren"
+#: linkcheck/HttpsUrlData.py:44
msgid "HTTPS url ignored"
msgstr "HTTPS url ignoriert"
+#: linkcheck/NntpUrlData.py:31
msgid "Illegal NNTP link syntax"
msgstr "Illegale NNTP link Syntax"
+#: linkchecker:205 linkchecker:213 linkchecker:244
+#, c-format
msgid "Illegal argument '%s' for option "
msgstr "Ungültiges Argument '%s' für Option "
+#: linkcheck/TelnetUrlData.py:32
msgid "Illegal telnet link syntax"
msgstr "Illegale telnet link Syntax"
+#: linkcheck/Logging.py:113 linkcheck/Logging.py:205 linkcheck/Logging.py:310
+#: linkcheck/Logging.py:314
msgid "Info"
msgstr "Info"
+#: linkcheck/JavascriptUrlData.py:25
msgid "Javascript url ignored"
msgstr "Javascript url ignoriert"
+#: linkcheck/HttpUrlData.py:73
msgid "Missing '/' at end of URL"
msgstr "Fehlendes '/' am Ende der URL"
+#: linkchecker:87
msgid ""
"NOTES\n"
"o LinkChecker assumes an http:// resp. ftp:// link when a commandline URL\n"
@@ -175,7 +246,8 @@ msgstr ""
"o Falls sich Ihr System automatisch mit dem Internet verbindet\n"
" (z.B. mit diald), wird es dies tun wenn Sie Links prüfen, die nicht\n"
" auf Ihren lokalen Rechner verweisen\n"
-" Benutzen Sie die Optionen -s und -i um dies zu verhindern (siehe BEISPIELE)\n"
+" Benutzen Sie die Optionen -s und -i um dies zu verhindern (siehe "
+"BEISPIELE)\n"
"o Javascript Links werden zur Zeit ignoriert\n"
"o Wenn Ihr System keine Threads unterstützt verwendet LinkChecker die\n"
" Option -t0\n"
@@ -185,39 +257,55 @@ msgstr ""
"o Beim Prüfen von 'news:' Links muß der angegebene NNTP Rechner nicht\n"
" unbedingt derselbe wie der des Benutzers sein!\n"
+#: linkcheck/NntpUrlData.py:37
msgid "No NNTP server specified, checked only syntax"
msgstr "Kein NNTP Server angegeben; prüfe lediglich Syntax"
+#: linkcheck/MailtoUrlData.py:66
msgid "No adresses found"
msgstr "Keine Adressen gefunden"
+#: linkcheck/MailtoUrlData.py:91
+#, c-format
msgid "None of the mail hosts for %s accepts an SMTP connection: %s"
msgstr "Keiner der Mail Hosts für %s akzeptiert eine SMTP Verbindung: %s"
+#: linkcheck/Logging.py:99 linkcheck/Logging.py:183 linkcheck/Logging.py:264
msgid "Parent URL"
msgstr "Vater URL"
+#: linkcheck/Logging.py:105 linkcheck/Logging.py:192 linkcheck/Logging.py:295
msgid "Real URL"
msgstr "Tats. URL"
+#: linkcheck/Logging.py:124 linkcheck/Logging.py:214 linkcheck/Logging.py:218
+#: linkcheck/Logging.py:328
msgid "Result"
msgstr "Ergebnis"
+#: linkcheck/Logging.py:88 linkcheck/Logging.py:165
+#, c-format
msgid "Start checking at %s\n"
msgstr "Beginne Prüfen am %s\n"
+#: linkcheck/Logging.py:146 linkcheck/Logging.py:237
+#, c-format
msgid "Stopped checking at %s (%.3f seconds)\n"
msgstr "Beende Prüfen am %s (%.3f Sekunden)\n"
msgid "Thats it. "
msgstr "Das wars. "
+#: linkcheck/Logging.py:93 linkcheck/Logging.py:278
msgid "URL"
msgstr "URL"
+#: linkcheck/UrlData.py:125
msgid "URL is null or empty"
msgstr "URL ist Null oder leer"
+#: linkchecker:16
+#, c-format
msgid ""
"USAGE\tlinkchecker [options] file_or_url...\n"
"\n"
@@ -358,43 +446,66 @@ msgstr ""
"-W regex, --warning-regex=regex\n"
" Definieren Sie einen regulären Ausdruck, der eine Warnung ausdruckt\n"
" falls er den Inhalt eines geprüften Verweises matcht.\n"
-" This applies of course only to pages which are valid, so we can\n"
-" get their content.\n"
-" You can use this to check for pages that contain some form of\n"
-" error message, for example 'This page has moved' or\n"
-" 'Oracle Application Server error'.\n"
-" This option implies -w.\n"
+" Dies gilt natürlich nur für gültige Seiten deren Inhalt wir\n"
+" bekommen können.\n"
+" Sie können dies verwenden, um Seiten mit Fehlermeldungen wie z.B.\n"
+" 'Diese Seite ist umgezogen' oder 'Oracle Server Fehler'.\n"
+" Diese Option nimmt -w an.\n"
+#: linkcheck/UrlData.py:51 linkcheck/UrlData.py:72
msgid "Valid"
msgstr "Gültig"
+#: linkcheck/Logging.py:119 linkcheck/Logging.py:210 linkcheck/Logging.py:323
msgid "Warning"
msgstr "Warnung"
-
+#: linkcheck/Logging.py:244
+#, c-format
msgid "Write comments and bugs to %s\n"
msgstr "Kommentare und Fehler mailen Sie bitte an %s\n"
+#: linkcheck/Logging.py:87
+#, c-format
+msgid ""
+"Write comments and bugs to %s\n"
+"\n"
+msgstr ""
+"Kommentare und Fehler schreiben Sie bitte an %s\n"
+"\n"
+
+#: linkcheck/MailtoUrlData.py:107
msgid "could not split the mail adress"
msgstr "konnte Mail Adresse nicht splitten"
+#: linkcheck/HostCheckingUrlData.py:44
msgid "found"
msgstr "gefunden"
+#: linkcheck/MailtoUrlData.py:96
+#, c-format
msgid "found mail host %s"
msgstr "Mail host %s gefunden"
+#: linkcheck/UrlData.py:148
msgid "outside of domain filter, checked only syntax"
msgstr "außerhalb des Domain Filters; prüfe lediglich Syntax"
+#: linkcheck/RobotsTxt.py:94
+#, c-format
msgid "robots.txt:%d: allow without user agents"
msgstr "robots.txt:%d: allow ohne user agents"
+#: linkcheck/RobotsTxt.py:85
+#, c-format
msgid "robots.txt:%d: disallow without user agents"
msgstr "robots.txt:%d: disallow ohne user agents"
+#: linkcheck/RobotsTxt.py:77
+#, c-format
msgid "robots.txt:%d: user-agent in the middle of rules"
msgstr "robots.txt:%d: user-agent zwischen Regeln"
+#: linkchecker:289
msgid "warning: no files or urls given"
msgstr "Warnung: keine Dateien oder URLs angegeben"
diff --git a/locale/fr/LC_MESSAGES/.cvsignore b/locale/fr/LC_MESSAGES/.cvsignore
new file mode 100644
index 00000000..cd1f2c94
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/.cvsignore
@@ -0,0 +1 @@
+*.mo
diff --git a/locale/fr/LC_MESSAGES/linkcheck.po b/locale/fr/LC_MESSAGES/linkcheck.po
new file mode 100644
index 00000000..a1ada16f
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/linkcheck.po
@@ -0,0 +1,395 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2000-06-03 14:59+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
+
+#: linkcheck/Logging.py:134 linkcheck/Logging.py:226
+msgid ""
+"\n"
+"Thats it. "
+msgstr ""
+
+#: linkcheck/Logging.py:95 linkcheck/Logging.py:179 linkcheck/Logging.py:282
+msgid " (cached)\n"
+msgstr ""
+
+#: linkcheck/Logging.py:143 linkcheck/Logging.py:234
+msgid " errors"
+msgstr " erreurs"
+
+#: linkcheck/Logging.py:144 linkcheck/Logging.py:235
+msgid " found.\n"
+msgstr ""
+
+#: linkcheck/Logging.py:139 linkcheck/Logging.py:230
+msgid " avertissements, "
+msgstr ""
+
+#: linkcheck/Logging.py:489
+msgid "# Format of the entries:\n"
+msgstr ""
+
+#: linkcheck/Logging.py:355 linkcheck/Logging.py:487
+#, c-format
+msgid "# Get the newest version at %s\n"
+msgstr ""
+
+#: linkcheck/Logging.py:396 linkcheck/Logging.py:527
+#, c-format
+msgid "# Stopped checking at %s (%.3f seconds)\n"
+msgstr ""
+
+#: linkcheck/Logging.py:356 linkcheck/Logging.py:488
+#, c-format
+msgid ""
+"# Write comments and bugs to %s\n"
+"\n"
+msgstr ""
+
+#: linkcheck/Logging.py:353 linkcheck/Logging.py:485
+#, c-format
+msgid "# created by %s at %s\n"
+msgstr ""
+
+#: linkcheck/Logging.py:197 linkcheck/Logging.py:202 linkcheck/Logging.py:301
+#: linkcheck/Logging.py:306
+#, c-format
+msgid "%.3f seconds"
+msgstr ""
+
+#: linkcheck/Logging.py:108 linkcheck/Logging.py:111
+#, c-format
+msgid "%.3f seconds\n"
+msgstr ""
+
+#: linkcheck/Logging.py:100 linkcheck/Logging.py:280
+msgid ", line "
+msgstr ""
+
+#: linkcheck/Logging.py:414
+#, c-format
+msgid "-- Get the newest version at %s\n"
+msgstr ""
+
+#: linkcheck/Logging.py:443
+#, c-format
+msgid "-- Stopped checking at %s (%.3f seconds)\n"
+msgstr ""
+
+#: linkcheck/Logging.py:415
+#, c-format
+msgid ""
+"-- Write comments and bugs to %s\n"
+"\n"
+msgstr ""
+
+#: linkcheck/Logging.py:412
+#, c-format
+msgid "-- created by %s at %s\n"
+msgstr ""
+
+#: linkcheck/Logging.py:141 linkcheck/Logging.py:232
+msgid "1 error"
+msgstr ""
+
+#: linkcheck/Logging.py:137 linkcheck/Logging.py:228
+msgid "1 warning, "
+msgstr ""
+
+#: linkcheck/HttpUrlData.py:75
+msgid "Access denied by robots.txt, checked only syntax"
+msgstr ""
+
+#: linkcheck/Logging.py:103 linkcheck/Logging.py:189 linkcheck/Logging.py:289
+msgid "Base"
+msgstr ""
+
+#: linkcheck/Logging.py:110 linkcheck/Logging.py:200 linkcheck/Logging.py:305
+msgid "Check Time"
+msgstr ""
+
+#: linkcheck/Logging.py:107 linkcheck/Logging.py:196 linkcheck/Logging.py:300
+msgid "D/L Time"
+msgstr ""
+
+#: linkchecker:102
+msgid ""
+"EXAMPLES\n"
+"o linkchecker -v -o html -r2 -s -i treasure.calvinsplayground.de \\\n"
+" http://treasure.calvinsplayground.de/~calvin/ > sample.html\n"
+"o Local files and syntactic sugar on the command line:\n"
+" linkchecker c:\\temp\\test.html\n"
+" linkchecker ../bla.html\n"
+" linkchecker www.myhomepage.de\n"
+" linkchecker -r0 ftp.linux.org\n"
+msgstr ""
+
+#: linkcheck/HttpUrlData.py:115
+#, c-format
+msgid "Effective URL %s"
+msgstr ""
+
+#: linkcheck/UrlData.py:50 linkcheck/UrlData.py:68
+msgid "Error"
+msgstr ""
+
+#: linkchecker:125
+#, c-format
+msgid "Error: %s\n"
+msgstr ""
+
+#: linkchecker:126
+msgid "Execute 'linkchecker -h' for help\n"
+msgstr ""
+
+#: linkcheck/Logging.py:86 linkcheck/Logging.py:242
+#, c-format
+msgid "Get the newest version at %s\n"
+msgstr ""
+
+#: linkcheck/FtpUrlData.py:34
+msgid "Got no answer from FTP server"
+msgstr ""
+
+#: linkcheck/NntpUrlData.py:41
+#, c-format
+msgid "Group %s has %s articles, range %s to %s"
+msgstr ""
+
+#: linkcheck/HttpUrlData.py:119
+msgid "HTTP 301 (moved permanent) encountered: you should update this link"
+msgstr ""
+
+#: linkcheck/HttpsUrlData.py:44
+msgid "HTTPS url ignored"
+msgstr ""
+
+#: linkcheck/NntpUrlData.py:31
+msgid "Illegal NNTP link syntax"
+msgstr ""
+
+#: linkchecker:205 linkchecker:213 linkchecker:244
+#, c-format
+msgid "Illegal argument '%s' for option "
+msgstr ""
+
+#: linkcheck/TelnetUrlData.py:32
+msgid "Illegal telnet link syntax"
+msgstr ""
+
+#: linkcheck/Logging.py:113 linkcheck/Logging.py:205 linkcheck/Logging.py:310
+#: linkcheck/Logging.py:314
+msgid "Info"
+msgstr ""
+
+#: linkcheck/JavascriptUrlData.py:25
+msgid "Javascript url ignored"
+msgstr ""
+
+#: linkcheck/HttpUrlData.py:73
+msgid "Missing '/' at end of URL"
+msgstr ""
+
+#: linkchecker:87
+msgid ""
+"NOTES\n"
+"o LinkChecker assumes an http:// resp. ftp:// link when a commandline URL\n"
+" starts with 'www.' resp. 'ftp.'\n"
+" You can also give local files as arguments\n"
+"o If you have your system configured to automatically establish a\n"
+" connection to the internet (e.g. with diald), it will connect when\n"
+" checking links not pointing to your local host\n"
+" Use the -s and -i options to prevent this (see EXAMPLES)\n"
+"o Javascript links are currently ignored\n"
+"o If your platform does not support threading, LinkChecker uses -t0\n"
+"o You can supply multiple user/password pairs in a configuration file\n"
+"o Cookies are not accepted by LinkChecker\n"
+"o When checking 'news:' links the given NNTP host doesn't need to be the\n"
+" same as the host of the user browsing your pages!\n"
+msgstr ""
+
+#: linkcheck/NntpUrlData.py:37
+msgid "No NNTP server specified, checked only syntax"
+msgstr ""
+
+#: linkcheck/MailtoUrlData.py:66
+msgid "No adresses found"
+msgstr ""
+
+#: linkcheck/MailtoUrlData.py:91
+#, c-format
+msgid "None of the mail hosts for %s accepts an SMTP connection: %s"
+msgstr ""
+
+#: linkcheck/Logging.py:99 linkcheck/Logging.py:183 linkcheck/Logging.py:264
+msgid "Parent URL"
+msgstr ""
+
+#: linkcheck/Logging.py:105 linkcheck/Logging.py:192 linkcheck/Logging.py:295
+msgid "Real URL"
+msgstr ""
+
+#: linkcheck/Logging.py:124 linkcheck/Logging.py:214 linkcheck/Logging.py:218
+#: linkcheck/Logging.py:328
+msgid "Result"
+msgstr ""
+
+#: linkcheck/Logging.py:88 linkcheck/Logging.py:165
+#, c-format
+msgid "Start checking at %s\n"
+msgstr ""
+
+#: linkcheck/Logging.py:146 linkcheck/Logging.py:237
+#, c-format
+msgid "Stopped checking at %s (%.3f seconds)\n"
+msgstr ""
+
+#: linkcheck/Logging.py:93 linkcheck/Logging.py:278
+msgid "URL"
+msgstr ""
+
+#: linkcheck/UrlData.py:125
+msgid "URL is null or empty"
+msgstr ""
+
+#: linkchecker:16
+#, c-format
+msgid ""
+"USAGE\tlinkchecker [options] file_or_url...\n"
+"\n"
+"OPTIONS\n"
+"-a, --anchors\n"
+" Check anchor references. Default is don't check anchors.\n"
+"-D, --debug\n"
+" Print additional debugging information.\n"
+"-e regex, --extern=regex\n"
+" Assume urls that match the given expression as extern.\n"
+" Only intern HTTP links are checked recursively.\n"
+"-f file, --config=file\n"
+" Use file as configuration file. LinkChecker first searches\n"
+" ~/.linkcheckerrc and then /etc/linkcheckerrc\n"
+" (under Windows \\linkcheckerrc).\n"
+"-F name, --file-output=name\n"
+" Same as output, but write to a file linkchecker-out..\n"
+" If the file already exists, it is overwritten. You can specify\n"
+" this option more than once. There is no file output for the\n"
+" blacklist logger. Default is no file output.\n"
+"-i regex, --intern=regex\n"
+" Assume urls that match the given expression as intern.\n"
+"-h, --help\n"
+" Help me! Print usage information for this program.\n"
+"-l, --allowdeny\n"
+" Swap checking order to intern/extern. Default checking order\n"
+" is extern/intern.\n"
+"-N, --nntp-server\n"
+" Specify an NNTP server for 'news:...' links. Default is the\n"
+" environment variable NNTP_SERVER. If no host is given,\n"
+" only the syntax of the link is checked.\n"
+"-o name, --output=name\n"
+" Specify output as %s.\n"
+" Default is text.\n"
+"-p pwd, --password=pwd\n"
+" Try given password for HTML and FTP authorization.\n"
+" Default is 'guest@'. See -u.\n"
+"-P host[:port], --proxy=host[:port]\n"
+" Use specified proxy for HTTP requests.\n"
+" Standard port is 8080. Default is to use no proxy.\n"
+"-q, --quiet\n"
+" Quiet operation. This is only useful with -F.\n"
+"-r depth, --recursion-level=depth\n"
+" Check recursively all links up to given depth (depth >= 0).\n"
+" Default depth is 1.\n"
+"-R, --robots-txt\n"
+" Obey the robots exclusion standard.\n"
+"-s, --strict\n"
+" Check only syntax of extern links, do not try to connect to them.\n"
+"-t num, --threads=num\n"
+" Generate no more than num threads. Default number of threads is 5.\n"
+" To disable threading specify a non-positive number.\n"
+"-u name, --user=name\n"
+" Try given username for HTML and FTP authorization.\n"
+" Default is 'anonymous'. See -p.\n"
+"-V, --version\n"
+" Print version and exit.\n"
+"-v, --verbose\n"
+" Log all checked URLs (implies -w). Default is to log only invalid\n"
+" URLs.\n"
+"-w, --warnings\n"
+" Log warnings.\n"
+"-W regex, --warning-regex=regex\n"
+" Define a regular expression which prints a warning if it matches\n"
+" any content of the checked link.\n"
+" This applies of course only to pages which are valid, so we can\n"
+" get their content.\n"
+" You can use this to check for pages that contain some form of\n"
+" error message, for example 'This page has moved' or\n"
+" 'Oracle Application Server error'.\n"
+" This option implies -w.\n"
+msgstr ""
+
+#: linkcheck/UrlData.py:51 linkcheck/UrlData.py:72
+msgid "Valid"
+msgstr ""
+
+#: linkcheck/Logging.py:119 linkcheck/Logging.py:210 linkcheck/Logging.py:323
+msgid "Warning"
+msgstr ""
+
+#: linkcheck/Logging.py:244
+#, c-format
+msgid "Write comments and bugs to %s\n"
+msgstr ""
+
+#: linkcheck/Logging.py:87
+#, c-format
+msgid ""
+"Write comments and bugs to %s\n"
+"\n"
+msgstr ""
+
+#: linkcheck/MailtoUrlData.py:107
+msgid "could not split the mail adress"
+msgstr ""
+
+#: linkcheck/HostCheckingUrlData.py:44
+msgid "found"
+msgstr ""
+
+#: linkcheck/MailtoUrlData.py:96
+#, c-format
+msgid "found mail host %s"
+msgstr ""
+
+#: linkcheck/UrlData.py:148
+msgid "outside of domain filter, checked only syntax"
+msgstr ""
+
+#: linkcheck/RobotsTxt.py:94
+#, c-format
+msgid "robots.txt:%d: allow without user agents"
+msgstr ""
+
+#: linkcheck/RobotsTxt.py:85
+#, c-format
+msgid "robots.txt:%d: disallow without user agents"
+msgstr ""
+
+#: linkcheck/RobotsTxt.py:77
+#, c-format
+msgid "robots.txt:%d: user-agent in the middle of rules"
+msgstr ""
+
+#: linkchecker:289
+msgid "warning: no files or urls given"
+msgstr ""
diff --git a/setup.py b/setup.py
index 1e9fe37d..7fb62c4d 100755
--- a/setup.py
+++ b/setup.py
@@ -100,5 +100,8 @@ o internationalization support
data_files = [('locale/de/LC_MESSAGES',
['locale/de/LC_MESSAGES/linkcheck.mo',
'locale/de/LC_MESSAGES/linkcheck.po']),
- ],
+ ('locale/fr/LC_MESSAGES',
+ ['locale/fr/LC_MESSAGES/linkcheck.mo',
+ 'locale/fr/LC_MESSAGES/linkcheck.po']),
+ ],
)