Mon, 17 Sep 2012 19:38:48 +0200
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.
--- 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
--- 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> <p><a class="link_parent" href="{0}">Change to parent directory</a></p></source> <translation type="unfinished"></translation> </message> <message> - <location filename="Helpviewer/Network/FtpReply.py" line="346"/> + <location filename="Helpviewer/Network/FtpReply.py" line="361"/> <source> <tr><th align="left">Name</th><th>Size</th><th align="left">Last modified</th></tr> </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><b>Enter username and password for '{0}'</b></source> + <translation type="unfinished"><b>Zadejte uživatelské jméno a heslo pro '{0}'</b></translation> + </message> </context> <context> <name>FtpSyncHandler</name> @@ -39111,17 +39111,17 @@ <translation><default></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> <p><a class="link_parent" href="{0}">Change to parent directory</a></p></source> <translation> <p><a class="link_parent" href="{0}">In den übergeordneten Ordner wechseln</a></p></translation> </message> <message> - <location filename="Helpviewer/Network/FtpReply.py" line="346"/> + <location filename="Helpviewer/Network/FtpReply.py" line="361"/> <source> <tr><th align="left">Name</th><th>Size</th><th align="left">Last modified</th></tr> </source> <translation> <tr><th align="left">Name</th><th>Größe</th><th align="left">Zuletzt verändert</th></tr> </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><b>Enter username and password for '{0}'</b></source> + <translation><b>Gib Nutzernamen und Kennwort für '{0}' ein</b></translation> </message> </context> <context> @@ -37751,17 +37751,17 @@ <translation><Standard></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> <p><a class="link_parent" href="{0}">Change to parent directory</a></p></source> <translation type="unfinished"></translation> </message> <message> - <location filename="Helpviewer/Network/FtpReply.py" line="346"/> + <location filename="Helpviewer/Network/FtpReply.py" line="361"/> <source> <tr><th align="left">Name</th><th>Size</th><th align="left">Last modified</th></tr> </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><b>Enter username and password for '{0}'</b></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 &Tab Ctrl+LMB</source> - <translation>Abrir en Nueva &Pestaña Ctrl+LMB (botón izquierdo del ratón)</translation> + <source>Open in New &Tab<byte value="x9"/>Ctrl+LMB</source> + <translation>Abrir en Nueva &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 &Tab Ctrl+LMB</source> - <translation>Abrir en Nueva &Pestaña Ctrl+LMB (botón izquierdo del ratón)</translation> + <source>Open in New &Tab<byte value="x9"/>Ctrl+LMB</source> + <translation>Abrir en Nueva &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> <p><a class="link_parent" href="{0}">Change to parent directory</a></p></source> <translation> <p><a class="link_parent" href="{0}">Cambiar al directorio superior</a></p></translation> </message> <message> - <location filename="Helpviewer/Network/FtpReply.py" line="346"/> + <location filename="Helpviewer/Network/FtpReply.py" line="361"/> <source> <tr><th align="left">Name</th><th>Size</th><th align="left">Last modified</th></tr> </source> <translation> <tr><th align="left">Nombre</th><th>Tamaño</th><th align="left">Última modificación</th></tr> </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><b>Enter username and password for '{0}'</b></source> + <translation type="unfinished"><b>Introduzca nombre de usuario y contraseña para '{0}'</b></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><Por defecto></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> <p><a class="link_parent" href="{0}">Change to parent directory</a></p></source> <translation type="unfinished"></translation> </message> <message> - <location filename="Helpviewer/Network/FtpReply.py" line="346"/> + <location filename="Helpviewer/Network/FtpReply.py" line="361"/> <source> <tr><th align="left">Name</th><th>Size</th><th align="left">Last modified</th></tr> </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><b>Enter username and password for '{0}'</b></source> <translation type="unfinished"></translation> </message> </context> @@ -41602,17 +41602,17 @@ <translation><défaut></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'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'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'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'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> <p><a class="link_parent" href="{0}">Change to parent directory</a></p></source> <translation> <p><a class="link_parent" href="{0}">Cambia alla directory superiore</a></p></translation> </message> <message> - <location filename="Helpviewer/Network/FtpReply.py" line="346"/> + <location filename="Helpviewer/Network/FtpReply.py" line="361"/> <source> <tr><th align="left">Name</th><th>Size</th><th align="left">Last modified</th></tr> </source> <translation> <tr><th align="left">Nome</th><th>Dimensione</th><th align="left">Ultima modifica</th></tr> </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><b>Enter username and password for '{0}'</b></source> + <translation type="unfinished"><b>Inserisci utente e password per '{0}'</b></translation> + </message> </context> <context> <name>FtpSyncHandler</name> @@ -38659,17 +38664,17 @@ <translation><default></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> <p><a class="link_parent" href="{0}">Change to parent directory</a></p></source> <translation> <p><a class="link_parent" href="{0}">Перейти в родительский каталог</a></p></translation> </message> <message> - <location filename="Helpviewer/Network/FtpReply.py" line="346"/> + <location filename="Helpviewer/Network/FtpReply.py" line="361"/> <source> <tr><th align="left">Name</th><th>Size</th><th align="left">Last modified</th></tr> </source> <translation> <tr><th align="left">Имя</th><th>Размер</th><th align="left">Последнее изменение</th></tr> </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><b>Enter username and password for '{0}'</b></source> + <translation type="unfinished"><b>Введите имя пользователя и пароль для '{0}'</b></translation> </message> </context> <context> @@ -38778,17 +38783,17 @@ <translation><По умолчанию></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> <p><a class="link_parent" href="{0}">Change to parent directory</a></p></source> <translation type="unfinished"></translation> </message> <message> - <location filename="Helpviewer/Network/FtpReply.py" line="346"/> + <location filename="Helpviewer/Network/FtpReply.py" line="361"/> <source> <tr><th align="left">Name</th><th>Size</th><th align="left">Last modified</th></tr> </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><b>Enter username and password for '{0}'</b></source> + <translation type="unfinished"><b> '{0}' için kullanıcı adını ve parolayı giriniz</b></translation> + </message> </context> <context> <name>FtpSyncHandler</name> @@ -38732,17 +38732,17 @@ <translation><default></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> <p><a class="link_parent" href="{0}">Change to parent directory</a></p></source> <translation type="unfinished"></translation> </message> <message> - <location filename="Helpviewer/Network/FtpReply.py" line="346"/> + <location filename="Helpviewer/Network/FtpReply.py" line="361"/> <source> <tr><th align="left">Name</th><th>Size</th><th align="left">Last modified</th></tr> </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><b>Enter username and password for '{0}'</b></source> <translation type="unfinished"></translation> </message> </context> @@ -41578,17 +41578,17 @@ <translation type="unfinished"><default></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>