Extended the new FtpReply class to handle various directory listing styles and to ask for a username and password, if the FTP login fails with an error code of 530.

Mon, 17 Sep 2012 19:38:48 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 17 Sep 2012 19:38:48 +0200
changeset 2047
739aa1717df5
parent 2046
a4d88430034e
child 2048
da2d82f84924

Extended the new FtpReply class to handle various directory listing styles and to ask for a username and password, if the FTP login fails with an error code of 530.

APIs/Python3/eric5.api file | annotate | diff | comparison | revisions
APIs/Python3/eric5.bas file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Helpviewer.Network.FtpReply.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Utilities.FtpUtilities.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric5.Utilities.html file | annotate | diff | comparison | revisions
Helpviewer/Network/FtpReply.py file | annotate | diff | comparison | revisions
Utilities/FtpUtilities.py file | annotate | diff | comparison | revisions
eric5.e4p file | annotate | diff | comparison | revisions
i18n/eric5_cs.ts file | annotate | diff | comparison | revisions
i18n/eric5_de.ts file | annotate | diff | comparison | revisions
i18n/eric5_en.ts file | annotate | diff | comparison | revisions
i18n/eric5_es.ts file | annotate | diff | comparison | revisions
i18n/eric5_fr.ts file | annotate | diff | comparison | revisions
i18n/eric5_it.ts file | annotate | diff | comparison | revisions
i18n/eric5_ru.ts file | annotate | diff | comparison | revisions
i18n/eric5_tr.ts file | annotate | diff | comparison | revisions
i18n/eric5_zh_CN.GB2312.ts file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric5.api	Sun Sep 16 18:06:46 2012 +0200
+++ b/APIs/Python3/eric5.api	Mon Sep 17 19:38:48 2012 +0200
@@ -7407,6 +7407,12 @@
 eric5.Utilities.ClassBrowsers.rbclbr.readmodule_ex?4(module, path=[])
 eric5.Utilities.ClassBrowsers.readmodule?4(module, path=[], isPyFile=False)
 eric5.Utilities.CodingError?1(coding)
+eric5.Utilities.FtpUtilities.FtpDirLineParser.MacMode?7
+eric5.Utilities.FtpUtilities.FtpDirLineParser.MonthnamesNumbers?7
+eric5.Utilities.FtpUtilities.FtpDirLineParser.UnixMode?7
+eric5.Utilities.FtpUtilities.FtpDirLineParser.WindowsMode?7
+eric5.Utilities.FtpUtilities.FtpDirLineParser.parseLine?4(line)
+eric5.Utilities.FtpUtilities.FtpDirLineParser?1(parent=None)
 eric5.Utilities.ModuleParser.Attribute.addAssignment?4(lineno)
 eric5.Utilities.ModuleParser.Attribute?1(module, name, file, lineno, isSignal=False)
 eric5.Utilities.ModuleParser.Class.addAttribute?4(name, attr)
--- a/APIs/Python3/eric5.bas	Sun Sep 16 18:06:46 2012 +0200
+++ b/APIs/Python3/eric5.bas	Mon Sep 17 19:38:48 2012 +0200
@@ -224,6 +224,8 @@
 FontDialogWizard QObject
 FontDialogWizardDialog QDialog Ui_FontDialogWizardDialog
 FtpAccessHandler SchemeAccessHandler
+FtpDirLineParser QObject
+FtpDirLineParserError Exception
 FtpReply QNetworkReply
 FtpSyncHandler SyncHandler
 Function ClbrBaseClasses.Function VisibilityMixin
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Sun Sep 16 18:06:46 2012 +0200
+++ b/Documentation/Help/source.qhp	Mon Sep 17 19:38:48 2012 +0200
@@ -909,6 +909,7 @@
               <section title="eric5.Utilities.py3flakes.messages" ref="eric5.Utilities.py3flakes.messages.html" />
             </section>
             <section title="eric5.Utilities.AutoSaver" ref="eric5.Utilities.AutoSaver.html" />
+            <section title="eric5.Utilities.FtpUtilities" ref="eric5.Utilities.FtpUtilities.html" />
             <section title="eric5.Utilities.ModuleParser" ref="eric5.Utilities.ModuleParser.html" />
             <section title="eric5.Utilities.PasswordChecker" ref="eric5.Utilities.PasswordChecker.html" />
             <section title="eric5.Utilities.SingleApplication" ref="eric5.Utilities.SingleApplication.html" />
@@ -4499,12 +4500,24 @@
       <keyword name="FtpAccessHandler" id="FtpAccessHandler" ref="eric5.Helpviewer.Network.FtpAccessHandler.html#FtpAccessHandler" />
       <keyword name="FtpAccessHandler (Module)" id="FtpAccessHandler (Module)" ref="eric5.Helpviewer.Network.FtpAccessHandler.html" />
       <keyword name="FtpAccessHandler.createRequest" id="FtpAccessHandler.createRequest" ref="eric5.Helpviewer.Network.FtpAccessHandler.html#FtpAccessHandler.createRequest" />
+      <keyword name="FtpDirLineParser" id="FtpDirLineParser" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser" />
+      <keyword name="FtpDirLineParser (Constructor)" id="FtpDirLineParser (Constructor)" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser.__init__" />
+      <keyword name="FtpDirLineParser.__ignoreLine" id="FtpDirLineParser.__ignoreLine" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser.__ignoreLine" />
+      <keyword name="FtpDirLineParser.__parseUnixLine" id="FtpDirLineParser.__parseUnixLine" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser.__parseUnixLine" />
+      <keyword name="FtpDirLineParser.__parseUnixMode" id="FtpDirLineParser.__parseUnixMode" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser.__parseUnixMode" />
+      <keyword name="FtpDirLineParser.__parseUnixTime" id="FtpDirLineParser.__parseUnixTime" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser.__parseUnixTime" />
+      <keyword name="FtpDirLineParser.__parseWindowsLine" id="FtpDirLineParser.__parseWindowsLine" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser.__parseWindowsLine" />
+      <keyword name="FtpDirLineParser.__parseWindowsTime" id="FtpDirLineParser.__parseWindowsTime" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser.__parseWindowsTime" />
+      <keyword name="FtpDirLineParser.__splitUnixLine" id="FtpDirLineParser.__splitUnixLine" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser.__splitUnixLine" />
+      <keyword name="FtpDirLineParser.parseLine" id="FtpDirLineParser.parseLine" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParser.parseLine" />
+      <keyword name="FtpDirLineParserError" id="FtpDirLineParserError" ref="eric5.Utilities.FtpUtilities.html#FtpDirLineParserError" />
       <keyword name="FtpReply" id="FtpReply" ref="eric5.Helpviewer.Network.FtpReply.html#FtpReply" />
       <keyword name="FtpReply (Constructor)" id="FtpReply (Constructor)" ref="eric5.Helpviewer.Network.FtpReply.html#FtpReply.__init__" />
       <keyword name="FtpReply (Module)" id="FtpReply (Module)" ref="eric5.Helpviewer.Network.FtpReply.html" />
       <keyword name="FtpReply.__cssLinkClass" id="FtpReply.__cssLinkClass" ref="eric5.Helpviewer.Network.FtpReply.html#FtpReply.__cssLinkClass" />
       <keyword name="FtpReply.__dirCallback" id="FtpReply.__dirCallback" ref="eric5.Helpviewer.Network.FtpReply.html#FtpReply.__dirCallback" />
       <keyword name="FtpReply.__doFtpCommands" id="FtpReply.__doFtpCommands" ref="eric5.Helpviewer.Network.FtpReply.html#FtpReply.__doFtpCommands" />
+      <keyword name="FtpReply.__doFtpLogin" id="FtpReply.__doFtpLogin" ref="eric5.Helpviewer.Network.FtpReply.html#FtpReply.__doFtpLogin" />
       <keyword name="FtpReply.__retrCallback" id="FtpReply.__retrCallback" ref="eric5.Helpviewer.Network.FtpReply.html#FtpReply.__retrCallback" />
       <keyword name="FtpReply.__setContent" id="FtpReply.__setContent" ref="eric5.Helpviewer.Network.FtpReply.html#FtpReply.__setContent" />
       <keyword name="FtpReply.__setListContent" id="FtpReply.__setListContent" ref="eric5.Helpviewer.Network.FtpReply.html#FtpReply.__setListContent" />
@@ -4532,6 +4545,7 @@
       <keyword name="FtpSyncHandler.syncPasswords" id="FtpSyncHandler.syncPasswords" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.syncPasswords" />
       <keyword name="FtpSyncHandler.syncSpeedDial" id="FtpSyncHandler.syncSpeedDial" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.syncSpeedDial" />
       <keyword name="FtpSyncHandler.syncUserAgents" id="FtpSyncHandler.syncUserAgents" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.syncUserAgents" />
+      <keyword name="FtpUtilities (Module)" id="FtpUtilities (Module)" ref="eric5.Utilities.FtpUtilities.html" />
       <keyword name="Function" id="Function" ref="eric5.Utilities.ClassBrowsers.ClbrBaseClasses.html#Function" />
       <keyword name="Function" id="Function" ref="eric5.Utilities.ClassBrowsers.idlclbr.html#Function" />
       <keyword name="Function" id="Function" ref="eric5.Utilities.ClassBrowsers.pyclbr.html#Function" />
@@ -13078,6 +13092,7 @@
       <file>eric5.Utilities.ClassBrowsers.idlclbr.html</file>
       <file>eric5.Utilities.ClassBrowsers.pyclbr.html</file>
       <file>eric5.Utilities.ClassBrowsers.rbclbr.html</file>
+      <file>eric5.Utilities.FtpUtilities.html</file>
       <file>eric5.Utilities.ModuleParser.html</file>
       <file>eric5.Utilities.PasswordChecker.html</file>
       <file>eric5.Utilities.SingleApplication.html</file>
--- a/Documentation/Source/eric5.Helpviewer.Network.FtpReply.html	Sun Sep 16 18:06:46 2012 +0200
+++ b/Documentation/Source/eric5.Helpviewer.Network.FtpReply.html	Mon Sep 17 19:38:48 2012 +0200
@@ -70,6 +70,9 @@
 <td><a href="#FtpReply.__doFtpCommands">__doFtpCommands</a></td>
 <td>Private slot doing the sequence of FTP commands to get the requested result.</td>
 </tr><tr>
+<td><a href="#FtpReply.__doFtpLogin">__doFtpLogin</a></td>
+<td>Private method to do the FTP login with asking for a username and password, if the login fails with an error 530.</td>
+</tr><tr>
 <td><a href="#FtpReply.__retrCallback">__retrCallback</a></td>
 <td>Private slot handling the reception of data.</td>
 </tr><tr>
@@ -142,7 +145,27 @@
 <b>__doFtpCommands</b>(<i></i>)
 <p>
         Private slot doing the sequence of FTP commands to get the requested result.
-</p><a NAME="FtpReply.__retrCallback" ID="FtpReply.__retrCallback"></a>
+</p><a NAME="FtpReply.__doFtpLogin" ID="FtpReply.__doFtpLogin"></a>
+<h4>FtpReply.__doFtpLogin</h4>
+<b>__doFtpLogin</b>(<i>username, password</i>)
+<p>
+        Private method to do the FTP login with asking for a username and password,
+        if the login fails with an error 530.
+</p><dl>
+<dt><i>username</i></dt>
+<dd>
+user name to use for the login (string)
+</dd><dt><i>password</i></dt>
+<dd>
+password to use for the login (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+tuple of two flags indicating a successful login and
+            if the login should be retried (boolean, boolean)
+</dd>
+</dl><a NAME="FtpReply.__retrCallback" ID="FtpReply.__retrCallback"></a>
 <h4>FtpReply.__retrCallback</h4>
 <b>__retrCallback</b>(<i>data</i>)
 <p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric5.Utilities.FtpUtilities.html	Mon Sep 17 19:38:48 2012 +0200
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
+'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html><head>
+<title>eric5.Utilities.FtpUtilities</title>
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric5.Utilities.FtpUtilities</h1>
+<p>
+Module implementing some FTP related utilities.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#FtpDirLineParser">FtpDirLineParser</a></td>
+<td>Class to parse lines returned by a FTP LIST command.</td>
+</tr><tr>
+<td><a href="#FtpDirLineParserError">FtpDirLineParserError</a></td>
+<td>Exception class raised, if a parser issue was detected.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="FtpDirLineParser" ID="FtpDirLineParser"></a>
+<h2>FtpDirLineParser</h2>
+<p>
+    Class to parse lines returned by a FTP LIST command.
+</p>
+<h3>Derived from</h3>
+QObject
+<h3>Class Attributes</h3>
+<table>
+<tr><td>MacMode</td></tr><tr><td>MonthnamesNumbers</td></tr><tr><td>UnixMode</td></tr><tr><td>WindowsMode</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#FtpDirLineParser.__init__">FtpDirLineParser</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#FtpDirLineParser.__ignoreLine">__ignoreLine</a></td>
+<td>Private method to check, if the line should be ignored.</td>
+</tr><tr>
+<td><a href="#FtpDirLineParser.__parseUnixLine">__parseUnixLine</a></td>
+<td>Private method to parse a Unix style directory listing line.</td>
+</tr><tr>
+<td><a href="#FtpDirLineParser.__parseUnixMode">__parseUnixMode</a></td>
+<td>Private method to parse a Unix mode string modifying the given URL info object.</td>
+</tr><tr>
+<td><a href="#FtpDirLineParser.__parseUnixTime">__parseUnixTime</a></td>
+<td>Private method to parse a Unix date and time indication modifying the given URL info object.</td>
+</tr><tr>
+<td><a href="#FtpDirLineParser.__parseWindowsLine">__parseWindowsLine</a></td>
+<td>Private method to parse a Windows style directory listing line.</td>
+</tr><tr>
+<td><a href="#FtpDirLineParser.__parseWindowsTime">__parseWindowsTime</a></td>
+<td>Private method to parse a Windows date and time indication modifying the given URL info object.</td>
+</tr><tr>
+<td><a href="#FtpDirLineParser.__splitUnixLine">__splitUnixLine</a></td>
+<td>Split a line of a Unix like directory listing into meta data, number of links, user, group, size, month, day, year or time and name.</td>
+</tr><tr>
+<td><a href="#FtpDirLineParser.parseLine">parseLine</a></td>
+<td>Private method to parse a directory listing line.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="FtpDirLineParser.__init__" ID="FtpDirLineParser.__init__"></a>
+<h4>FtpDirLineParser (Constructor)</h4>
+<b>FtpDirLineParser</b>(<i>parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>parent</i></dt>
+<dd>
+reference to the parent object (QObject)
+</dd>
+</dl><a NAME="FtpDirLineParser.__ignoreLine" ID="FtpDirLineParser.__ignoreLine"></a>
+<h4>FtpDirLineParser.__ignoreLine</h4>
+<b>__ignoreLine</b>(<i>line</i>)
+<p>
+        Private method to check, if the line should be ignored.
+</p><dl>
+<dt><i>line</i></dt>
+<dd>
+to check (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating to ignore the line (boolean)
+</dd>
+</dl><a NAME="FtpDirLineParser.__parseUnixLine" ID="FtpDirLineParser.__parseUnixLine"></a>
+<h4>FtpDirLineParser.__parseUnixLine</h4>
+<b>__parseUnixLine</b>(<i>line</i>)
+<p>
+        Private method to parse a Unix style directory listing line.
+</p><dl>
+<dt><i>line</i></dt>
+<dd>
+directory line to be parsed (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+URL info object containing the valid data (QUrlInfo)
+</dd>
+</dl><dl>
+<dt>Raises <b>FtpDirLineParserError</b>:</dt>
+<dd>
+Raised if the line is not of a
+            recognized Unix format.
+</dd>
+</dl><a NAME="FtpDirLineParser.__parseUnixMode" ID="FtpDirLineParser.__parseUnixMode"></a>
+<h4>FtpDirLineParser.__parseUnixMode</h4>
+<b>__parseUnixMode</b>(<i>modeString, urlInfo</i>)
+<p>
+        Private method to parse a Unix mode string modifying the
+        given URL info object.
+</p><dl>
+<dt><i>modeString</i></dt>
+<dd>
+mode string to be parsed (string)
+</dd><dt><i>urlInfo</i></dt>
+<dd>
+reference to the URL info object (QUrlInfo)
+</dd>
+</dl><dl>
+<dt>Raises <b>FtpDirLineParserError</b>:</dt>
+<dd>
+Raised if the mode cannot be parsed.
+</dd>
+</dl><a NAME="FtpDirLineParser.__parseUnixTime" ID="FtpDirLineParser.__parseUnixTime"></a>
+<h4>FtpDirLineParser.__parseUnixTime</h4>
+<b>__parseUnixTime</b>(<i>monthAbbreviation, day, yearOrTime, urlInfo</i>)
+<p>
+        Private method to parse a Unix date and time indication modifying
+        the given URL info object.
+</p><p>
+
+</p><p>
+        Date time strings in Unix-style directory listings typically
+        have one of these formats:
+        <ul>
+          <li>"Nov 23 02:33" (month name, day of month, time)</li>
+          <li>"May 26  2005" (month name, day of month, year)</li>
+        </ul>
+</p><dl>
+<dt><i>monthAbbreviation</i></dt>
+<dd>
+abbreviation of the month name (string)
+</dd><dt><i>day</i></dt>
+<dd>
+day of the month (string)
+</dd><dt><i>yearOrTime</i></dt>
+<dd>
+string giving the year or a time (string)
+</dd><dt><i>urlInfo</i></dt>
+<dd>
+reference to the URL info object (QUrlInfo)
+</dd>
+</dl><dl>
+<dt>Raises <b>FtpDirLineParserError</b>:</dt>
+<dd>
+Raised if the month abbreviation is
+            not recognized.
+</dd>
+</dl><a NAME="FtpDirLineParser.__parseWindowsLine" ID="FtpDirLineParser.__parseWindowsLine"></a>
+<h4>FtpDirLineParser.__parseWindowsLine</h4>
+<b>__parseWindowsLine</b>(<i>line</i>)
+<p>
+        Private method to parse a Windows style directory listing line.
+</p><dl>
+<dt><i>line</i></dt>
+<dd>
+directory line to be parsed (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+URL info object containing the valid data (QUrlInfo)
+</dd>
+</dl><dl>
+<dt>Raises <b>FtpDirLineParserError</b>:</dt>
+<dd>
+Raised if the line is not of a
+            recognized Windows format.
+</dd>
+</dl><a NAME="FtpDirLineParser.__parseWindowsTime" ID="FtpDirLineParser.__parseWindowsTime"></a>
+<h4>FtpDirLineParser.__parseWindowsTime</h4>
+<b>__parseWindowsTime</b>(<i>date, time, urlInfo</i>)
+<p>
+        Private method to parse a Windows date and time indication modifying
+        the given URL info object.
+</p><p>
+        Date time strings in Windows-style directory listings typically
+        have the format "10-23-12 03:25PM" (month-day_of_month-two_digit_year,
+        hour:minute, am/pm).
+</p><dl>
+<dt><i>date</i></dt>
+<dd>
+date string (string)
+</dd><dt><i>time</i></dt>
+<dd>
+time string (string)
+</dd><dt><i>urlInfo</i></dt>
+<dd>
+reference to the URL info object (QUrlInfo)
+</dd>
+</dl><dl>
+<dt>Raises <b>FtpDirLineParserError</b>:</dt>
+<dd>
+Raised if either of the strings is not
+            recognized.
+</dd>
+</dl><a NAME="FtpDirLineParser.__splitUnixLine" ID="FtpDirLineParser.__splitUnixLine"></a>
+<h4>FtpDirLineParser.__splitUnixLine</h4>
+<b>__splitUnixLine</b>(<i>line</i>)
+<p>
+        Split a line of a Unix like directory listing into meta data,
+        number of links, user, group, size, month, day, year or time
+        and name.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+tuple of nine strings giving the meta data,
+            number of links, user, group, size, month, day, year or time
+            and name
+</dd>
+</dl><dl>
+<dt>Raises <b>FtpDirLineParserError</b>:</dt>
+<dd>
+Raised if the line is not of a
+            recognized Unix format.
+</dd>
+</dl><a NAME="FtpDirLineParser.parseLine" ID="FtpDirLineParser.parseLine"></a>
+<h4>FtpDirLineParser.parseLine</h4>
+<b>parseLine</b>(<i>line</i>)
+<p>
+        Private method to parse a directory listing line.
+</p><p>
+        This implementation support Unix and Windows style directory
+        listings. It tries Unix style first and if that fails switches
+        to Windows style. If that fails as well, an exception is raised.
+</p><dl>
+<dt><i>line</i></dt>
+<dd>
+directory line to be parsed (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+URL info object containing the valid data (QUrlInfo)
+</dd>
+</dl><dl>
+<dt>Raises <b>FtpDirLineParserError</b>:</dt>
+<dd>
+Raised if the line is not of a
+            recognized format.
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="FtpDirLineParserError" ID="FtpDirLineParserError"></a>
+<h2>FtpDirLineParserError</h2>
+<p>
+    Exception class raised, if a parser issue was detected.
+</p>
+<h3>Derived from</h3>
+Exception
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/Documentation/Source/index-eric5.Utilities.html	Sun Sep 16 18:06:46 2012 +0200
+++ b/Documentation/Source/index-eric5.Utilities.html	Mon Sep 17 19:38:48 2012 +0200
@@ -45,6 +45,9 @@
 <td><a href="eric5.Utilities.AutoSaver.html">AutoSaver</a></td>
 <td>Module implementing an auto saver class.</td>
 </tr><tr>
+<td><a href="eric5.Utilities.FtpUtilities.html">FtpUtilities</a></td>
+<td>Module implementing some FTP related utilities.</td>
+</tr><tr>
 <td><a href="eric5.Utilities.ModuleParser.html">ModuleParser</a></td>
 <td>Parse a Python module file.</td>
 </tr><tr>
--- a/Helpviewer/Network/FtpReply.py	Sun Sep 16 18:06:46 2012 +0200
+++ b/Helpviewer/Network/FtpReply.py	Mon Sep 17 19:38:48 2012 +0200
@@ -10,14 +10,21 @@
 import ftplib
 import socket
 import errno
+import mimetypes
 
-from PyQt4.QtCore import QByteArray, QIODevice, Qt, QUrl, QTimer, QBuffer, QDate, QTime, \
-    QDateTime, QCoreApplication
-from PyQt4.QtGui import QPixmap
-from PyQt4.QtNetwork import QNetworkReply, QNetworkRequest, QUrlInfo
+from PyQt4.QtCore import QByteArray, QIODevice, Qt, QUrl, QTimer, QBuffer, \
+    QCoreApplication
+from PyQt4.QtGui import QPixmap, QDialog
+from PyQt4.QtNetwork import QNetworkReply, QNetworkRequest
 from PyQt4.QtWebKit import QWebSettings
 
+import Helpviewer.HelpWindow
+
+from UI.AuthenticationDialog import AuthenticationDialog
+
+import Preferences
 import UI.PixmapCache
+from Utilities.FtpUtilities import FtpDirLineParser, FtpDirLineParserError
 
 ftpListPage_html = """\
 <?xml version="1.0" encoding="UTF-8" ?>
@@ -130,6 +137,7 @@
         self.__items = []
         self.__content = QByteArray()
         self.__units = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
+        self.__dirLineParser = FtpDirLineParser()
         
         if url.path() == "":
             url.setPath("/")
@@ -179,19 +187,23 @@
         """
         Private slot doing the sequence of FTP commands to get the requested result.
         """
+        retry = True
         try:
-            self.__ftp.connect(self.url().host(), timeout=10)
-            self.__ftp.login(self.url().userName(), self.url().password())
-            self.__ftp.retrlines("LIST " + self.url().path(), self.__dirCallback)
-            if len(self.__items) == 1 and \
-               self.__items[0].isFile():
-                self.__setContent()
-                self.__ftp.retrbinary("RETR " + self.url().path(), self.__retrCallback)
-                self.__content.append(512 * b' ')
-                self.readyRead.emit()
-            else:
-                self.__setListContent()
-            self.__ftp.quit()
+            while retry:
+                self.__ftp.connect(self.url().host(), self.url().port(ftplib.FTP_PORT),
+                                   timeout=10)
+                ok, retry = self.__doFtpLogin(self.url().userName(), self.url().password())
+            if ok:
+                self.__ftp.retrlines("LIST " + self.url().path(), self.__dirCallback)
+                if len(self.__items) == 1 and \
+                   self.__items[0].isFile():
+                    self.__setContent()
+                    self.__ftp.retrbinary("RETR " + self.url().path(), self.__retrCallback)
+                    self.__content.append(512 * b' ')
+                    self.readyRead.emit()
+                else:
+                    self.__setListContent()
+                self.__ftp.quit()
         except ftplib.all_errors as err:
             if isinstance(err, socket.gaierror):
                 errCode = QNetworkReply.HostNotFoundError
@@ -203,56 +215,65 @@
             self.error.emit(errCode)
         self.finished.emit()
     
+    def __doFtpLogin(self, username, password):
+        """
+        Private method to do the FTP login with asking for a username and password,
+        if the login fails with an error 530.
+        
+        @param username user name to use for the login (string)
+        @param password password to use for the login (string)
+        @return tuple of two flags indicating a successful login and
+            if the login should be retried (boolean, boolean)
+        """
+        try:
+            self.__ftp.login(username, password)
+            return True, False
+        except ftplib.error_perm as err:
+            code, msg = err.args[0].split(None, 1)
+            if code.strip() == "530":
+                # error 530 -> Login incorrect
+                urlRoot = "{0}://{1}"\
+                    .format(self.url().scheme(), self.url().authority())
+                info = self.trUtf8("<b>Enter username and password for '{0}'</b>")\
+                    .format(urlRoot)
+                dlg = AuthenticationDialog(info, self.url().userName(),
+                                           Preferences.getUser("SavePasswords"),
+                                           Preferences.getUser("SavePasswords"))
+                if Preferences.getUser("SavePasswords"):
+                    username, password = \
+                        Helpviewer.HelpWindow.HelpWindow.passwordManager().getLogin(
+                            self.url(), "")
+                    if username:
+                        dlg.setData(username, password)
+                if dlg.exec_() == QDialog.Accepted:
+                    username, password = dlg.getData()
+                    if Preferences.getUser("SavePasswords"):
+                        Helpviewer.HelpWindow.HelpWindow.passwordManager().setLogin(
+                            self.url(), "", username, password)
+                    url = self.url()
+                    url.setUserName(username)
+                    url.setPassword(password)
+                    self.setUrl(url)
+                    return False, True
+                else:
+                    return False, False
+            else:
+                raise
+    
     def __dirCallback(self, line):
         """
         Private slot handling the receipt of directory listings.
         
         @param line the received line of the directory listing (string)
         """
-        words = line.split(None, 8)
-        if len(words) < 6:
-            # skip short lines
-            return
-        filename = words[-1].lstrip()
-        i = filename.find(" -> ")
-        if i >= 0:
-            filename = filename[:i]
-        infostuff = words[-5:-1]
-        mode = words[0].strip()
+        try:
+            urlInfo = self.__dirLineParser.parseLine(line)
+        except FtpDirLineParserError:
+            # silently ignore parser errors
+            urlInfo = None
         
-        info = QUrlInfo()
-        # 1. type of item
-        if mode[0] == "d":
-            info.setDir(True)
-            info.setFile(False)
-        elif mode[0] == "l":
-            info.setSymLink(True)
-        elif mode[0] == "-":
-            info.setDir(False)
-            info.setFile(True)
-        # 2. name
-        info.setName(filename.strip())
-        # 3. size
-        if mode[0] == "-":
-            info.setSize(int(infostuff[0]))
-        # 4. last modified
-        if infostuff[1] in self.Monthnames2Int:
-            month = self.Monthnames2Int[infostuff[1]]
-        else:
-            month = 1
-        if ":" in infostuff[3]:
-            # year is current year
-            year = QDate.currentDate().year()
-            timeStr = infostuff[3]
-        else:
-            year = int(infostuff[3])
-            timeStr = "00:00"
-        date = QDate(year, month, int(infostuff[2]))
-        time = QTime.fromString(timeStr, "hh:mm")
-        lastModified = QDateTime(date, time)
-        info.setLastModified(lastModified)
-        
-        self.__items.append(info)
+        if urlInfo:
+            self.__items.append(urlInfo)
         
         QCoreApplication.processEvents()
     
@@ -270,8 +291,11 @@
         """
         Private method to finish the setup of the data.
         """
+        mtype, encoding = mimetypes.guess_type(self.url().toString())
         self.open(QIODevice.ReadOnly | QIODevice.Unbuffered)
         self.setHeader(QNetworkRequest.ContentLengthHeader, self.__items[0].size())
+        if mtype:
+            self.setHeader(QNetworkRequest.ContentTypeHeader, mtype)
         self.setAttribute(QNetworkRequest.HttpStatusCodeAttribute, 200)
         self.setAttribute(QNetworkRequest.HttpReasonPhraseAttribute, "Ok")
         self.metaDataChanged.emit()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/FtpUtilities.py	Mon Sep 17 19:38:48 2012 +0200
@@ -0,0 +1,300 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing some FTP related utilities.
+"""
+
+from PyQt4.QtCore import QObject, QDate, QDateTime, QTime
+from PyQt4.QtNetwork import QUrlInfo
+
+
+class FtpDirLineParserError(Exception):
+    """
+    Exception class raised, if a parser issue was detected.
+    """
+
+
+class FtpDirLineParser(QObject):
+    """
+    Class to parse lines returned by a FTP LIST command.
+    """
+    MonthnamesNumbers = {
+        "jan": 1,
+        "feb": 2,
+        "mar": 3,
+        "apr": 4,
+        "may": 5,
+        "jun": 6,
+        "jul": 7,
+        "aug": 8,
+        "sep": 9,
+        "oct": 10,
+        "nov": 11,
+        "dec": 12,
+    }
+    
+    UnixMode = 0
+    WindowsMode = 1
+    MacMode = 2
+    
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent object (QObject)
+        """
+        super().__init__(parent)
+        
+        self.__parseLine = self.__parseUnixLine
+        self.__modeSwitchAllowed = True
+    
+    def __ignoreLine(self, line):
+        """
+        Private method to check, if the line should be ignored.
+        
+        @param line to check (string)
+        @return flag indicating to ignore the line (boolean)
+        """
+        return line.strip() == "" or \
+               line.strip().lower().startswith("total ")
+    
+    def __parseUnixMode(self, modeString, urlInfo):
+        """
+        Private method to parse a Unix mode string modifying the
+        given URL info object.
+        
+        @param modeString mode string to be parsed (string)
+        @param urlInfo reference to the URL info object (QUrlInfo)
+        @exception FtpDirLineParserError Raised if the mode cannot be parsed.
+        """
+        if len(modeString) != 10:
+            raise FtpDirLineParserError("invalid mode string '{0}'".format(modeString))
+        
+        modeString = modeString.lower()
+        
+        permission = 0
+        if modeString[1] != '-':
+            permission |= QUrlInfo.ReadOwner
+        if modeString[2] != '-':
+            permission |= QUrlInfo.WriteOwner
+        if modeString[3] != '-':
+            permission |= QUrlInfo.ExeOwner
+        if modeString[4] != '-':
+            permission |= QUrlInfo.ReadGroup
+        if modeString[5] != '-':
+            permission |= QUrlInfo.WriteGroup
+        if modeString[6] != '-':
+            permission |= QUrlInfo.ExeGroup
+        if modeString[7] != '-':
+            permission |= QUrlInfo.ReadOther
+        if modeString[8] != '-':
+            permission |= QUrlInfo.WriteOther
+        if modeString[9] != '-':
+            permission |= QUrlInfo.ExeOther
+        urlInfo.setPermissions(permission)
+        
+        if modeString[0] == "d":
+            urlInfo.setDir(True)
+            urlInfo.setFile(False)
+        elif modeString[0] == "l":
+            urlInfo.setSymLink(True)
+        elif modeString[0] == "-":
+            urlInfo.setDir(False)
+            urlInfo.setFile(True)
+    
+    def __parseUnixTime(self, monthAbbreviation, day, yearOrTime, urlInfo):
+        """
+        Private method to parse a Unix date and time indication modifying
+        the given URL info object.
+        
+
+        Date time strings in Unix-style directory listings typically
+        have one of these formats:
+        <ul>
+          <li>"Nov 23 02:33" (month name, day of month, time)</li>
+          <li>"May 26  2005" (month name, day of month, year)</li>
+        </ul>
+        
+        @param monthAbbreviation abbreviation of the month name (string)
+        @param day day of the month (string)
+        @param yearOrTime string giving the year or a time (string)
+        @param urlInfo reference to the URL info object (QUrlInfo)
+        @exception FtpDirLineParserError Raised if the month abbreviation is
+            not recognized.
+        """
+        try:
+            month = FtpDirLineParser.MonthnamesNumbers[monthAbbreviation.lower()]
+        except KeyError:
+            raise FtpDirLineParserError("illegal month abbreviation '{0}'".format(
+                monthAbbreviation))
+        day = int(day)
+        if ':' in yearOrTime:
+            year = QDate.currentDate().year()
+            hour, minute = yearOrTime.split(':')
+            hour = int(hour)
+            minute = int(minute)
+        else:
+            year = int(yearOrTime)
+            hour = 0
+            minute = 0
+        
+        lastModified = QDateTime(QDate(year, month, day), QTime(hour, minute))
+        urlInfo.setLastModified(lastModified)
+    
+    def __splitUnixLine(self, line):
+        """
+        Split a line of a Unix like directory listing into meta data,
+        number of links, user, group, size, month, day, year or time
+        and name.
+        
+        @return tuple of nine strings giving the meta data,
+            number of links, user, group, size, month, day, year or time
+            and name
+        @exception FtpDirLineParserError Raised if the line is not of a
+            recognized Unix format.
+        """
+        # This method encapsulates the recognition of an unusual
+        # Unix format variant.
+        lineParts = line.split()
+        fieldCountWithoutUserID = 8
+        fieldCountWithUserID = fieldCountWithoutUserID + 1
+        if len(lineParts) < fieldCountWithoutUserID:
+            raise FtpDirLineParserError("line '{0}' cannot be parsed".format(line))
+        
+        # If we have a valid format (either with or without user id field),
+        # the field with index 5 is either the month abbreviation or a day.
+        try:
+            int(lineParts[5])
+        except ValueError:
+            # Month abbreviation, "invalid literal for int"
+            lineParts = line.split(None, fieldCountWithUserID - 1)
+        else:
+            # Day
+            lineParts = line.split(None, fieldCountWithoutUserID - 1)
+            userFieldIndex = 2
+            lineParts.insert(userFieldIndex, "")
+        
+        return lineParts
+    
+    def __parseUnixLine(self, line):
+        """
+        Private method to parse a Unix style directory listing line.
+        
+        @param line directory line to be parsed (string)
+        @return URL info object containing the valid data (QUrlInfo)
+        @exception FtpDirLineParserError Raised if the line is not of a
+            recognized Unix format.
+        """
+        modeString, nlink, user, group, size, month, day, \
+          yearOrTime, name = self.__splitUnixLine(line)
+        
+        urlInfo = QUrlInfo()
+        self.__parseUnixMode(modeString, urlInfo)
+        self.__parseUnixTime(month, day, yearOrTime, urlInfo)
+        urlInfo.setOwner(user)
+        urlInfo.setGroup(group)
+        urlInfo.setSize(int(size))
+        name = name.strip()
+        i = name.find(" -> ")
+        if i >= 0:
+            name = name[:i]
+        urlInfo.setName(name)
+        
+        return urlInfo
+    
+    def __parseWindowsTime(self, date, time, urlInfo):
+        """
+        Private method to parse a Windows date and time indication modifying
+        the given URL info object.
+
+        Date time strings in Windows-style directory listings typically
+        have the format "10-23-12 03:25PM" (month-day_of_month-two_digit_year,
+        hour:minute, am/pm).
+        
+        @param date date string (string)
+        @param time time string (string)
+        @param urlInfo reference to the URL info object (QUrlInfo)
+        @exception FtpDirLineParserError Raised if either of the strings is not
+            recognized.
+        """
+        try:
+            month, day, year = [int(part) for part in date.split('-')]
+            if year >= 70:
+                year = 1900 + year
+            else:
+                year = 2000 + year
+        except (ValueError, IndexError):
+            raise FtpDirLineParserError("illegal date string '{0}'".format(month))
+        try:
+            hour, minute, am_pm = time[0:2], time[3:5], time[5]
+            hour = int(hour)
+            minute = int(minute)
+        except (ValueError, IndexError):
+            raise FtpDirLineParserError("illegal time string '{0}'".format(month))
+        if hour == 12 and am_pm == 'A':
+            hour = 0
+        if hour != 12 and am_pm == 'P':
+            hour = hour + 12
+        
+        lastModified = QDateTime(QDate(year, month, day), QTime(hour, minute))
+        urlInfo.setLastModified(lastModified)
+    
+    def __parseWindowsLine(self, line):
+        """
+        Private method to parse a Windows style directory listing line.
+        
+        @param line directory line to be parsed (string)
+        @return URL info object containing the valid data (QUrlInfo)
+        @exception FtpDirLineParserError Raised if the line is not of a
+            recognized Windows format.
+        """
+        try:
+            date, time, dirOrSize, name = line.split(None, 3)
+        except ValueError:
+            # "unpack list of wrong size"
+            raise FtpDirLineParserError("line '{0}' cannot be parsed".format(line))
+        
+        urlInfo = QUrlInfo()
+        self.__parseWindowsTime(date, time, urlInfo)
+        if dirOrSize.lower() == "<dir>":
+            urlInfo.setDir(True)
+            urlInfo.setFile(False)
+        else:
+            urlInfo.setDir(False)
+            urlInfo.setFile(True)
+            try:
+                urlInfo.setSize(int(dirOrSize))
+            except ValueError:
+                raise FtpDirLineParserError("illegal size '{0}'".format(dirOrSize))
+        urlInfo.setName(name)
+        
+        return urlInfo
+    
+    def parseLine(self, line):
+        """
+        Private method to parse a directory listing line.
+        
+        This implementation support Unix and Windows style directory
+        listings. It tries Unix style first and if that fails switches
+        to Windows style. If that fails as well, an exception is raised.
+        
+        @param line directory line to be parsed (string)
+        @return URL info object containing the valid data (QUrlInfo)
+        @exception FtpDirLineParserError Raised if the line is not of a
+            recognized format.
+        """
+        if self.__ignoreLine(line):
+            return None
+        
+        try:
+            return self.__parseLine(line)
+        except FtpDirLineParserError:
+            if self.__modeSwitchAllowed:
+                self.__parseLine = self.__parseWindowsLine
+                self.__modeSwitchAllowed = False
+                return self.__parseLine(line)
+            else:
+                raise
--- a/eric5.e4p	Sun Sep 16 18:06:46 2012 +0200
+++ b/eric5.e4p	Mon Sep 17 19:38:48 2012 +0200
@@ -1040,6 +1040,7 @@
     <Source>Graphics/PackageDiagramBuilder.py</Source>
     <Source>Graphics/ImportsDiagramBuilder.py</Source>
     <Source>Graphics/ApplicationDiagramBuilder.py</Source>
+    <Source>Utilities/FtpUtilities.py</Source>
   </Sources>
   <Forms>
     <Form>PyUnit/UnittestDialog.ui</Form>
--- a/i18n/eric5_cs.ts	Sun Sep 16 18:06:46 2012 +0200
+++ b/i18n/eric5_cs.ts	Mon Sep 17 19:38:48 2012 +0200
@@ -13616,32 +13616,32 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="133"/>
-        <source>No suitable proxy found.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="333"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="348"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="346"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="361"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="372"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="387"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="396"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="411"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Network/FtpReply.py" line="237"/>
+        <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
+        <translation type="unfinished">&lt;b&gt;Zadejte uživatelské jméno a heslo pro &apos;{0}&apos;&lt;/b&gt;</translation>
+    </message>
 </context>
 <context>
     <name>FtpSyncHandler</name>
@@ -39111,17 +39111,17 @@
         <translation>&lt;default&gt;</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="76"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="78"/>
         <source>Select project word list</source>
         <translation>Vybrat seznam slov projektu</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Dictionary File (*.dic);;All Files (*)</source>
         <translation>Soubor slovníku (*.dic);;Všechny soubory (*)</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Select project exclude list</source>
         <translation>Vybrat seznam vyřazených v projektu</translation>
     </message>
@@ -47974,12 +47974,12 @@
         <translation>Seznam cest nebo souborů pro provedení překladu formulářů</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="161"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="167"/>
         <source>Exempt file from translation</source>
         <translation>Vyjmout soubor z překladu</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="174"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="180"/>
         <source>Exempt directory from translation</source>
         <translation>Vyjmout adresář z překladu</translation>
     </message>
@@ -47989,7 +47989,7 @@
         <translation>Stisknout pro odebrání vybraného záznamu ze seznamu</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="65"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="64"/>
         <source>All Files (*)</source>
         <translation>Všechny soubory (*)</translation>
     </message>
@@ -47999,12 +47999,12 @@
         <translation>Zadejte vzorek cesty pro soubory s překlady</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="95"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="96"/>
         <source>Select translation file</source>
         <translation>Vybrat soubor s překladem</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="119"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="124"/>
         <source>Select directory for binary translations</source>
         <translation>Výběr adresáře pro binární překlady</translation>
     </message>
@@ -48034,7 +48034,7 @@
         <translation>Zdrojové soubory ({0});;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="63"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="62"/>
         <source>Forms Files ({0});;</source>
         <translation>Soubory s formuláři ({0});;</translation>
     </message>
--- a/i18n/eric5_de.ts	Sun Sep 16 18:06:46 2012 +0200
+++ b/i18n/eric5_de.ts	Mon Sep 17 19:38:48 2012 +0200
@@ -13283,32 +13283,32 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="333"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="348"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;In den übergeordneten Ordner wechseln&lt;/a&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="346"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="361"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Größe&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Zuletzt verändert&lt;/th&gt;&lt;/tr&gt;
 </translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="372"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="387"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation>{0} {1}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="396"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="411"/>
         <source>Listing of {0}</source>
         <translation>Index von {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="133"/>
-        <source>No suitable proxy found.</source>
-        <translation>Kein geeigneter Proxy gefunden.</translation>
+        <location filename="Helpviewer/Network/FtpReply.py" line="237"/>
+        <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
+        <translation>&lt;b&gt;Gib Nutzernamen und Kennwort für &apos;{0}&apos; ein&lt;/b&gt;</translation>
     </message>
 </context>
 <context>
@@ -37751,17 +37751,17 @@
         <translation>&lt;Standard&gt;</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="76"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="78"/>
         <source>Select project word list</source>
         <translation>Wähle Projektwörterliste</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Dictionary File (*.dic);;All Files (*)</source>
         <translation>Wörterbuch (*.dic);;Alle Dateien(*)</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Select project exclude list</source>
         <translation>Wähle Projektausnahmenliste</translation>
     </message>
@@ -46472,12 +46472,12 @@
         <translation>Liste der Dateien und Pfade, die nicht übersetzt werden sollen</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="161"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="167"/>
         <source>Exempt file from translation</source>
         <translation>Datei von der Übersetzung ausnehmen</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="174"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="180"/>
         <source>Exempt directory from translation</source>
         <translation>Verzeichnis von der Übersetzung ausnehmen</translation>
     </message>
@@ -46497,12 +46497,12 @@
         <translation>Quelldateien ({0});;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="63"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="62"/>
         <source>Forms Files ({0});;</source>
         <translation>Formulare ({0});;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="65"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="64"/>
         <source>All Files (*)</source>
         <translation>Alle Dateien (*)</translation>
     </message>
@@ -46512,12 +46512,12 @@
         <translation>Gib das Pfadmuster für Übersetzungsdateien ein</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="95"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="96"/>
         <source>Select translation file</source>
         <translation>Wähle Übersetzungsdatei</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="119"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="124"/>
         <source>Select directory for binary translations</source>
         <translation>Wähle Verzeichnis für binäre Übersetzungsdateien</translation>
     </message>
--- a/i18n/eric5_en.ts	Sun Sep 16 18:06:46 2012 +0200
+++ b/i18n/eric5_en.ts	Mon Sep 17 19:38:48 2012 +0200
@@ -13198,32 +13198,32 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="133"/>
-        <source>No suitable proxy found.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="333"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="348"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="346"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="361"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="372"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="387"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="396"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="411"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Network/FtpReply.py" line="237"/>
+        <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>FtpSyncHandler</name>
@@ -37423,17 +37423,17 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="76"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="78"/>
         <source>Select project word list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Dictionary File (*.dic);;All Files (*)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Select project exclude list</source>
         <translation type="unfinished"></translation>
     </message>
@@ -46057,32 +46057,32 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="63"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="62"/>
         <source>Forms Files ({0});;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="65"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="64"/>
         <source>All Files (*)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="95"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="96"/>
         <source>Select translation file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="119"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="124"/>
         <source>Select directory for binary translations</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="161"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="167"/>
         <source>Exempt file from translation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="174"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="180"/>
         <source>Exempt directory from translation</source>
         <translation type="unfinished"></translation>
     </message>
--- a/i18n/eric5_es.ts	Sun Sep 16 18:06:46 2012 +0200
+++ b/i18n/eric5_es.ts	Mon Sep 17 19:38:48 2012 +0200
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.0" language="es">
+<!DOCTYPE TS><TS version="2.0" language="es" sourcelanguage="">
 <context>
     <name>AboutDialog</name>
     <message>
@@ -1987,8 +1986,8 @@
     </message>
     <message>
         <location filename="Helpviewer/Bookmarks/BookmarksMenu.py" line="142"/>
-        <source>Open in New &amp;Tab	Ctrl+LMB</source>
-        <translation>Abrir en Nueva &amp;Pestaña	Ctrl+LMB (botón izquierdo del ratón)</translation>
+        <source>Open in New &amp;Tab<byte value="x9"/>Ctrl+LMB</source>
+        <translation>Abrir en Nueva &amp;Pestaña<byte value="x9"/>Ctrl+LMB (botón izquierdo del ratón)</translation>
     </message>
     <message>
         <location filename="Helpviewer/Bookmarks/BookmarksMenu.py" line="147"/>
@@ -2229,8 +2228,8 @@
     </message>
     <message>
         <location filename="Helpviewer/Bookmarks/BookmarksToolBar.py" line="90"/>
-        <source>Open in New &amp;Tab	Ctrl+LMB</source>
-        <translation>Abrir en Nueva &amp;Pestaña	Ctrl+LMB (botón izquierdo del ratón)</translation>
+        <source>Open in New &amp;Tab<byte value="x9"/>Ctrl+LMB</source>
+        <translation>Abrir en Nueva &amp;Pestaña<byte value="x9"/>Ctrl+LMB (botón izquierdo del ratón)</translation>
     </message>
     <message>
         <location filename="Helpviewer/Bookmarks/BookmarksToolBar.py" line="99"/>
@@ -13342,31 +13341,36 @@
     <message>
         <location filename="Helpviewer/Network/FtpReply.py" line="133"/>
         <source>No suitable proxy found.</source>
-        <translation>No se ha encontrado ningún proxy adecuado.</translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="333"/>
+        <translation type="obsolete">No se ha encontrado ningún proxy adecuado.</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Network/FtpReply.py" line="348"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Cambiar al directorio superior&lt;/a&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="346"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="361"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Nombre&lt;/th&gt;&lt;th&gt;Tamaño&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Última modificación&lt;/th&gt;&lt;/tr&gt;
 </translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="372"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="387"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation>{0} {1}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="396"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="411"/>
         <source>Listing of {0}</source>
         <translation>Listado de {0}</translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Network/FtpReply.py" line="237"/>
+        <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
+        <translation type="unfinished">&lt;b&gt;Introduzca nombre de usuario y contraseña para &apos;{0}&apos;&lt;/b&gt;</translation>
+    </message>
 </context>
 <context>
     <name>FtpSyncHandler</name>
@@ -13799,7 +13803,7 @@
     <name>HelpBrowser</name>
     <message>
         <location filename="Helpviewer/HelpBrowserWV.py" line="977"/>
-        <source>Open Link in New Tab	Ctrl+LMB</source>
+        <source>Open Link in New Tab<byte value="x9"/>Ctrl+LMB</source>
         <translation>Abrir enlace en Nueva Pestaña Ctrl+LMB (botón izquierdo del ratón)</translation>
     </message>
     <message>
@@ -37923,17 +37927,17 @@
         <translation>&lt;Por defecto&gt;</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="76"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="78"/>
         <source>Select project word list</source>
         <translation>Seleccionar listado de palabras del proyecto</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Dictionary File (*.dic);;All Files (*)</source>
         <translation>Archivo de Diccionario (*.dict);;Todos los Archivos(*)</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Select project exclude list</source>
         <translation>Seleccionar listado de exclusión del proyecto</translation>
     </message>
@@ -46720,17 +46724,17 @@
         <translation>Lista de rutas o archivos a excluir de la traducción</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="65"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="64"/>
         <source>All Files (*)</source>
         <translation>Todos los archivos (*)</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="161"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="167"/>
         <source>Exempt file from translation</source>
         <translation>Eximir archivo de traducción</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="174"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="180"/>
         <source>Exempt directory from translation</source>
         <translation>Eximir directorio de traducción</translation>
     </message>
@@ -46747,12 +46751,12 @@
         <translation>Introducir el patrón de la ruta para los archivos de traducciones</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="95"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="96"/>
         <source>Select translation file</source>
         <translation>Seleccione archivos de traducción</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="119"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="124"/>
         <source>Select directory for binary translations</source>
         <translation>Seleccionar directorio para binarios de traducciones</translation>
     </message>
@@ -46776,7 +46780,7 @@
         <translation>Archivos de fuentes ({0});;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="63"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="62"/>
         <source>Forms Files ({0});;</source>
         <translation>Archivos de Formularios ({0});;</translation>
     </message>
--- a/i18n/eric5_fr.ts	Sun Sep 16 18:06:46 2012 +0200
+++ b/i18n/eric5_fr.ts	Mon Sep 17 19:38:48 2012 +0200
@@ -14444,30 +14444,30 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="333"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="348"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="346"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="361"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="372"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="387"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="396"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="411"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="133"/>
-        <source>No suitable proxy found.</source>
+        <location filename="Helpviewer/Network/FtpReply.py" line="237"/>
+        <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -41602,17 +41602,17 @@
         <translation>&lt;défaut&gt;</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="76"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="78"/>
         <source>Select project word list</source>
         <translation>Sélection d&apos;une liste de mots pour le projet</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Dictionary File (*.dic);;All Files (*)</source>
         <translation>Fichiers dictionnaires (*.dic);;Tous les fichiers (*)</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Select project exclude list</source>
         <translation>Sélection d&apos;un liste de mots à exclure pour le projet</translation>
     </message>
@@ -51086,12 +51086,12 @@
         <translation>Liste des chemins ou fichiers à exclure de la traduction</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="161"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="167"/>
         <source>Exempt file from translation</source>
         <translation>Exclure le fichier de la traduction</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="174"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="180"/>
         <source>Exempt directory from translation</source>
         <translation>Exclure le répertoire de la traduction</translation>
     </message>
@@ -51111,7 +51111,7 @@
         <translation type="obsolete">Fichiers feuilles (%1);;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="65"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="64"/>
         <source>All Files (*)</source>
         <translation>Tous fichiers (*)</translation>
     </message>
@@ -51141,12 +51141,12 @@
 (Utiliser la balise %language% là où la langue doit être insérée, ex:  i18n/eric4_%language%.ts)</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="95"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="96"/>
         <source>Select translation file</source>
         <translation>Sélection d&apos;un fichier de traductions</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="119"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="124"/>
         <source>Select directory for binary translations</source>
         <translation>Sélection d&apos;un répertoire pour les traductions binaires</translation>
     </message>
@@ -51169,7 +51169,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="63"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="62"/>
         <source>Forms Files ({0});;</source>
         <translation type="unfinished"></translation>
     </message>
--- a/i18n/eric5_it.ts	Sun Sep 16 18:06:46 2012 +0200
+++ b/i18n/eric5_it.ts	Mon Sep 17 19:38:48 2012 +0200
@@ -13452,31 +13452,36 @@
     <message>
         <location filename="Helpviewer/Network/FtpReply.py" line="133"/>
         <source>No suitable proxy found.</source>
-        <translation>Nessun proxy utilizzabile trovato.</translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="333"/>
+        <translation type="obsolete">Nessun proxy utilizzabile trovato.</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Network/FtpReply.py" line="348"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Cambia alla directory superiore&lt;/a&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="346"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="361"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Nome&lt;/th&gt;&lt;th&gt;Dimensione&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Ultima modifica&lt;/th&gt;&lt;/tr&gt;
 </translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="372"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="387"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation>{0} {1}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="396"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="411"/>
         <source>Listing of {0}</source>
         <translation>Elenco di {0}</translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Network/FtpReply.py" line="237"/>
+        <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
+        <translation type="unfinished">&lt;b&gt;Inserisci utente e password per &apos;{0}&apos;&lt;/b&gt;</translation>
+    </message>
 </context>
 <context>
     <name>FtpSyncHandler</name>
@@ -38659,17 +38664,17 @@
         <translation>&lt;default&gt;</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="76"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="78"/>
         <source>Select project word list</source>
         <translation>Seleziona la lista di parole del progetto</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Dictionary File (*.dic);;All Files (*)</source>
         <translation>File Dizionario (*.dic);;Tutti i file (*)</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Select project exclude list</source>
         <translation>Seleziona la lista di esclusione del progetto</translation>
     </message>
@@ -47662,12 +47667,12 @@
         <translation>Elenca i path o i file da escludere dalla traduzione</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="161"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="167"/>
         <source>Exempt file from translation</source>
         <translation>Escludi file dalla traduzione</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="174"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="180"/>
         <source>Exempt directory from translation</source>
         <translation>Escludi directory dalla traduzione</translation>
     </message>
@@ -47677,7 +47682,7 @@
         <translation>Premi per cancellare gli elementi selezionati dalla lista</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="65"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="64"/>
         <source>All Files (*)</source>
         <translation>Tutti i file (*)</translation>
     </message>
@@ -47694,12 +47699,12 @@
         <translation>Inserisci il path per il file di traduzione</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="95"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="96"/>
         <source>Select translation file</source>
         <translation>Seleziona un file di traduzione</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="119"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="124"/>
         <source>Select directory for binary translations</source>
         <translation>Seleziona la directory per le traduzioni binarie</translation>
     </message>
@@ -47723,7 +47728,7 @@
         <translation>Source Files ({0});;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="63"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="62"/>
         <source>Forms Files ({0});;</source>
         <translation>File Forms ({0});;</translation>
     </message>
--- a/i18n/eric5_ru.ts	Sun Sep 16 18:06:46 2012 +0200
+++ b/i18n/eric5_ru.ts	Mon Sep 17 19:38:48 2012 +0200
@@ -13548,32 +13548,37 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="333"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="348"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Перейти в родительский каталог&lt;/a&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="346"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="361"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Имя&lt;/th&gt;&lt;th&gt;Размер&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Последнее изменение&lt;/th&gt;&lt;/tr&gt;
 </translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="372"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="387"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation>{0} {1}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="396"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="411"/>
         <source>Listing of {0}</source>
         <translation>Список {0}</translation>
     </message>
     <message>
         <location filename="Helpviewer/Network/FtpReply.py" line="133"/>
         <source>No suitable proxy found.</source>
-        <translation>Не найдено подходящего прокси.</translation>
+        <translation type="obsolete">Не найдено подходящего прокси.</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Network/FtpReply.py" line="237"/>
+        <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
+        <translation type="unfinished">&lt;b&gt;Введите имя пользователя и пароль для &apos;{0}&apos;&lt;/b&gt;</translation>
     </message>
 </context>
 <context>
@@ -38778,17 +38783,17 @@
         <translation>&lt;По умолчанию&gt;</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="76"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="78"/>
         <source>Select project word list</source>
         <translation>Выберите список слов проекта</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Dictionary File (*.dic);;All Files (*)</source>
         <translation>Файл словаря (*.dic);Все файлы (*)</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Select project exclude list</source>
         <translation>Выберите список исключений проекта</translation>
     </message>
@@ -47758,12 +47763,12 @@
         <translation>Список файлов для исключения из переводов</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="161"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="167"/>
         <source>Exempt file from translation</source>
         <translation>Исключить файл из переводов</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="174"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="180"/>
         <source>Exempt directory from translation</source>
         <translation>Исключить каталог из переводов</translation>
     </message>
@@ -47783,12 +47788,12 @@
         <translation>Файлы с исходниками ({0});;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="63"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="62"/>
         <source>Forms Files ({0});;</source>
         <translation>Файлы с формами ({0});;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="65"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="64"/>
         <source>All Files (*)</source>
         <translation>Все файлы(*)</translation>
     </message>
@@ -47798,12 +47803,12 @@
         <translation>Задайте шаблон для каталога файлов переводов</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="95"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="96"/>
         <source>Select translation file</source>
         <translation>Выберите файл перевода</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="119"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="124"/>
         <source>Select directory for binary translations</source>
         <translation>Задайте путь для каталога двоичных переводов</translation>
     </message>
--- a/i18n/eric5_tr.ts	Sun Sep 16 18:06:46 2012 +0200
+++ b/i18n/eric5_tr.ts	Mon Sep 17 19:38:48 2012 +0200
@@ -13628,32 +13628,32 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="133"/>
-        <source>No suitable proxy found.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="333"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="348"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="346"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="361"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="372"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="387"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="396"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="411"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Network/FtpReply.py" line="237"/>
+        <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
+        <translation type="unfinished">&lt;b&gt; &apos;{0}&apos; için kullanıcı adını ve parolayı giriniz&lt;/b&gt;</translation>
+    </message>
 </context>
 <context>
     <name>FtpSyncHandler</name>
@@ -38732,17 +38732,17 @@
         <translation>&lt;default&gt;</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="76"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="78"/>
         <source>Select project word list</source>
         <translation>Proje kelime listesini seçiniz</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Dictionary File (*.dic);;All Files (*)</source>
         <translation>Sözlük Dosyaları (*.dic);;Tüm Dosyalar (*)</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Select project exclude list</source>
         <translation>Proje istisna listesini seçiniz</translation>
     </message>
@@ -47561,32 +47561,32 @@
         <translation>Kaynak Dosyaları ({0});;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="63"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="62"/>
         <source>Forms Files ({0});;</source>
         <translation>Form Dosyaları ({0});;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="65"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="64"/>
         <source>All Files (*)</source>
         <translation>Tüm Dosyalar (*)</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="95"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="96"/>
         <source>Select translation file</source>
         <translation>Çeviri dosyasını seç</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="119"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="124"/>
         <source>Select directory for binary translations</source>
         <translation>İkili çeviri için dizini seçiniz</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="161"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="167"/>
         <source>Exempt file from translation</source>
         <translation>Çeviriden muaf tutulacak dosya</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="174"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="180"/>
         <source>Exempt directory from translation</source>
         <translation>Çeviriden muaf tutlacak dizin</translation>
     </message>
--- a/i18n/eric5_zh_CN.GB2312.ts	Sun Sep 16 18:06:46 2012 +0200
+++ b/i18n/eric5_zh_CN.GB2312.ts	Mon Sep 17 19:38:48 2012 +0200
@@ -14391,30 +14391,30 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="333"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="348"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="346"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="361"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="372"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="387"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="396"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="411"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="133"/>
-        <source>No suitable proxy found.</source>
+        <location filename="Helpviewer/Network/FtpReply.py" line="237"/>
+        <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -41578,17 +41578,17 @@
         <translation type="unfinished">&lt;default&gt;</translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="76"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="78"/>
         <source>Select project word list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Dictionary File (*.dic);;All Files (*)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/SpellingPropertiesDialog.py" line="93"/>
+        <location filename="Project/SpellingPropertiesDialog.py" line="98"/>
         <source>Select project exclude list</source>
         <translation type="unfinished"></translation>
     </message>
@@ -51102,27 +51102,27 @@
         <translation type="obsolete">窗体文件(%1);;</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="65"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="64"/>
         <source>All Files (*)</source>
         <translation>所有文件 (*)</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="95"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="96"/>
         <source>Select translation file</source>
         <translation>选择翻译文件</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="119"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="124"/>
         <source>Select directory for binary translations</source>
         <translation>为二进制翻译选择文件夹</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="161"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="167"/>
         <source>Exempt file from translation</source>
         <translation>从翻译中除去文件</translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="174"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="180"/>
         <source>Exempt directory from translation</source>
         <translation>从翻译中除去文件夹</translation>
     </message>
@@ -51145,7 +51145,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Project/TranslationPropertiesDialog.py" line="63"/>
+        <location filename="Project/TranslationPropertiesDialog.py" line="62"/>
         <source>Forms Files ({0});;</source>
         <translation type="unfinished"></translation>
     </message>

eric ide

mercurial