Merged with default branch before 19.02 release. conda

Sun, 03 Feb 2019 16:31:53 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 03 Feb 2019 16:31:53 +0100
branch
conda
changeset 6696
706185900558
parent 6685
fbaee9890715 (current diff)
parent 6692
c104c120e043 (diff)
child 6697
2f5c951bdf14

Merged with default branch before 19.02 release.

VirtualEnv/VirtualenvExecDialog.py file | annotate | diff | comparison | revisions
VirtualEnv/VirtualenvManager.py file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric6.api	Wed Jan 30 18:56:27 2019 +0100
+++ b/APIs/Python3/eric6.api	Sun Feb 03 16:31:53 2019 +0100
@@ -9849,6 +9849,7 @@
 eric6.UI.FindFileNameDialog.FindFileNameDialog?1(project, parent=None)
 eric6.UI.Info.BugAddress?7
 eric6.UI.Info.Copyright?7
+eric6.UI.Info.CopyrightShort?7
 eric6.UI.Info.FeatureAddress?7
 eric6.UI.Info.Homepage?7
 eric6.UI.Info.Program?7
@@ -12167,6 +12168,7 @@
 eric6.WebBrowser.Tools.Scripts.getFeedLinks?4()
 eric6.WebBrowser.Tools.Scripts.getFormData?4(pos)
 eric6.WebBrowser.Tools.Scripts.getOpenSearchLinks?4()
+eric6.WebBrowser.Tools.Scripts.scrollToAnchor?4(anchor)
 eric6.WebBrowser.Tools.Scripts.sendPostData?4(url, data)
 eric6.WebBrowser.Tools.Scripts.setCss?4(css)
 eric6.WebBrowser.Tools.Scripts.setStyleSheet?4(css)
@@ -12774,10 +12776,12 @@
 eric6.install.defaultMacPythonExe?7
 eric6.install.determinePyQtVariant?4()
 eric6.install.distDir?7
+eric6.install.doCleanDesktopLinks?7
 eric6.install.doCleanup?7
 eric6.install.doCompile?7
 eric6.install.doDependancyChecks?4()
 eric6.install.exit?4(rcode=0)
+eric6.install.forceCleanDesktopLinks?7
 eric6.install.getWinregEntry?4(name, path)
 eric6.install.includePythonVariant?7
 eric6.install.initGlobals?4()
--- a/DebugClients/Python/DebugBase.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/DebugClients/Python/DebugBase.py	Sun Feb 03 16:31:53 2019 +0100
@@ -708,10 +708,11 @@
         @return list of lists with file name (string), line number (integer)
             and function name (string)
         """
+        tb_lineno = None
         if frame is None:
             fr = self.getCurrentFrame()
         elif type(frame) == list:
-            fr = frame.pop(0)
+            fr, tb_lineno = frame.pop(0)
         else:
             fr = frame
         
@@ -732,7 +733,7 @@
                      "ThreadExtension.py", "threading.py")):
                 break
             
-            fline = fr.f_lineno
+            fline = tb_lineno or fr.f_lineno
             ffunc = fr.f_code.co_name
             
             if ffunc == '?':
@@ -754,7 +755,7 @@
             # is it a stack frame or exception list?
             if type(frame) == list:
                 if frame != []:
-                    fr = frame.pop(0)
+                    fr, tb_lineno = frame.pop(0)
                 else:
                     fr = None
             else:
@@ -886,7 +887,7 @@
             frlist = self.__extract_stack(exctb)
             frlist.reverse()
             
-            self.currentFrame = frlist[0]
+            self.currentFrame = frlist[0][0]
             stack = self.getStack(frlist[self.skipFrames:])
         
         self._dbgClient.lockClient()
@@ -936,7 +937,7 @@
         tb = exctb
         stack = []
         while tb is not None:
-            stack.append(tb.tb_frame)
+            stack.append((tb.tb_frame, tb.tb_lineno))
             tb = tb.tb_next
         tb = None
         return stack
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Wed Jan 30 18:56:27 2019 +0100
+++ b/Documentation/Help/source.qhp	Sun Feb 03 16:31:53 2019 +0100
@@ -17842,6 +17842,7 @@
       <keyword name="WebBrowserPage (Constructor)" id="WebBrowserPage (Constructor)" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__init__" />
       <keyword name="WebBrowserPage (Module)" id="WebBrowserPage (Module)" ref="eric6.Preferences.ConfigurationPages.WebBrowserPage.html" />
       <keyword name="WebBrowserPage (Module)" id="WebBrowserPage (Module)" ref="eric6.WebBrowser.WebBrowserPage.html" />
+      <keyword name="WebBrowserPage.__contentsSizeChanged" id="WebBrowserPage.__contentsSizeChanged" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__contentsSizeChanged" />
       <keyword name="WebBrowserPage.__featurePermissionRequested" id="WebBrowserPage.__featurePermissionRequested" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__featurePermissionRequested" />
       <keyword name="WebBrowserPage.__fullScreenRequested" id="WebBrowserPage.__fullScreenRequested" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__fullScreenRequested" />
       <keyword name="WebBrowserPage.__loadProgress" id="WebBrowserPage.__loadProgress" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.__loadProgress" />
@@ -19354,6 +19355,7 @@
       <keyword name="saveToolGroups" id="saveToolGroups" ref="eric6.Preferences.__init__.html#saveToolGroups" />
       <keyword name="sbsdiff" id="sbsdiff" ref="eric6.UI.CompareDialog.html#sbsdiff" />
       <keyword name="schemeFromProxyType" id="schemeFromProxyType" ref="eric6.E5Network.E5NetworkProxyFactory.html#schemeFromProxyType" />
+      <keyword name="scrollToAnchor" id="scrollToAnchor" ref="eric6.WebBrowser.Tools.Scripts.html#scrollToAnchor" />
       <keyword name="sendPostData" id="sendPostData" ref="eric6.WebBrowser.Tools.Scripts.html#sendPostData" />
       <keyword name="setActions" id="setActions" ref="eric6.Preferences.Shortcuts.html#setActions" />
       <keyword name="setConfigDir" id="setConfigDir" ref="eric6.Globals.__init__.html#setConfigDir" />
--- a/Documentation/Source/eric6.UI.Info.html	Wed Jan 30 18:56:27 2019 +0100
+++ b/Documentation/Source/eric6.UI.Info.html	Sun Feb 03 16:31:53 2019 +0100
@@ -25,7 +25,7 @@
 </p>
 <h3>Global Attributes</h3>
 <table>
-<tr><td>BugAddress</td></tr><tr><td>Copyright</td></tr><tr><td>FeatureAddress</td></tr><tr><td>Homepage</td></tr><tr><td>Program</td></tr><tr><td>Version</td></tr><tr><td>VersionOnly</td></tr>
+<tr><td>BugAddress</td></tr><tr><td>Copyright</td></tr><tr><td>CopyrightShort</td></tr><tr><td>FeatureAddress</td></tr><tr><td>Homepage</td></tr><tr><td>Program</td></tr><tr><td>Version</td></tr><tr><td>VersionOnly</td></tr>
 </table>
 <h3>Classes</h3>
 <table>
--- a/Documentation/Source/eric6.WebBrowser.Tools.Scripts.html	Wed Jan 30 18:56:27 2019 +0100
+++ b/Documentation/Source/eric6.WebBrowser.Tools.Scripts.html	Sun Feb 03 16:31:53 2019 +0100
@@ -52,6 +52,9 @@
 <td><a href="#getOpenSearchLinks">getOpenSearchLinks</a></td>
 <td>Function generating a script to extract all open search links.</td>
 </tr><tr>
+<td><a href="#scrollToAnchor">scrollToAnchor</a></td>
+<td>Function generating script to scroll to a given anchor.</td>
+</tr><tr>
 <td><a href="#sendPostData">sendPostData</a></td>
 <td>Function generating a script to send Post data.</td>
 </tr><tr>
@@ -190,6 +193,29 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
+<a NAME="scrollToAnchor" ID="scrollToAnchor"></a>
+<h2>scrollToAnchor</h2>
+<b>scrollToAnchor</b>(<i>anchor</i>)
+<p>
+    Function generating script to scroll to a given anchor.
+</p><dl>
+<dt><i>anchor</i> (str)</dt>
+<dd>
+name of the anchor to scroll to
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+script to set the style sheet
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
 <a NAME="sendPostData" ID="sendPostData"></a>
 <h2>sendPostData</h2>
 <b>sendPostData</b>(<i>url, data</i>)
--- a/Documentation/Source/eric6.WebBrowser.WebBrowserPage.html	Wed Jan 30 18:56:27 2019 +0100
+++ b/Documentation/Source/eric6.WebBrowser.WebBrowserPage.html	Sun Feb 03 16:31:53 2019 +0100
@@ -88,6 +88,9 @@
 <td><a href="#WebBrowserPage.__init__">WebBrowserPage</a></td>
 <td>Constructor</td>
 </tr><tr>
+<td><a href="#WebBrowserPage.__contentsSizeChanged">__contentsSizeChanged</a></td>
+<td>Private slot to work around QWebEnginePage not scrolling to anchors when opened in a background tab.</td>
+</tr><tr>
 <td><a href="#WebBrowserPage.__featurePermissionRequested">__featurePermissionRequested</a></td>
 <td>Private slot handling a feature permission request.</td>
 </tr><tr>
@@ -210,6 +213,17 @@
 <dd>
 parent widget of this window (QWidget)
 </dd>
+</dl><a NAME="WebBrowserPage.__contentsSizeChanged" ID="WebBrowserPage.__contentsSizeChanged"></a>
+<h4>WebBrowserPage.__contentsSizeChanged</h4>
+<b>__contentsSizeChanged</b>(<i>size</i>)
+<p>
+        Private slot to work around QWebEnginePage not scrolling to anchors
+        when opened in a background tab.
+</p><dl>
+<dt><i>size</i> (QSize)</dt>
+<dd>
+changed contents size (unused)
+</dd>
 </dl><a NAME="WebBrowserPage.__featurePermissionRequested" ID="WebBrowserPage.__featurePermissionRequested"></a>
 <h4>WebBrowserPage.__featurePermissionRequested</h4>
 <b>__featurePermissionRequested</b>(<i>url, feature</i>)
--- a/Documentation/Source/eric6.install.html	Wed Jan 30 18:56:27 2019 +0100
+++ b/Documentation/Source/eric6.install.html	Sun Feb 03 16:31:53 2019 +0100
@@ -25,7 +25,7 @@
 </p>
 <h3>Global Attributes</h3>
 <table>
-<tr><td>BlackLists</td></tr><tr><td>PlatformsBlackLists</td></tr><tr><td>PythonMarkers</td></tr><tr><td>PythonTextMarkers</td></tr><tr><td>apisDir</td></tr><tr><td>cfg</td></tr><tr><td>configLength</td></tr><tr><td>configName</td></tr><tr><td>currDir</td></tr><tr><td>defaultMacAppBundleName</td></tr><tr><td>defaultMacAppBundlePath</td></tr><tr><td>defaultMacPythonExe</td></tr><tr><td>distDir</td></tr><tr><td>doCleanup</td></tr><tr><td>doCompile</td></tr><tr><td>includePythonVariant</td></tr><tr><td>installApis</td></tr><tr><td>macAppBundleName</td></tr><tr><td>macAppBundlePath</td></tr><tr><td>macPythonExe</td></tr><tr><td>modDir</td></tr><tr><td>platBinDir</td></tr><tr><td>platBinDirOld</td></tr><tr><td>progLanguages</td></tr><tr><td>progName</td></tr><tr><td>pyModDir</td></tr><tr><td>pyqtOverride</td></tr><tr><td>pyqtVariant</td></tr><tr><td>sourceDir</td></tr>
+<tr><td>BlackLists</td></tr><tr><td>PlatformsBlackLists</td></tr><tr><td>PythonMarkers</td></tr><tr><td>PythonTextMarkers</td></tr><tr><td>apisDir</td></tr><tr><td>cfg</td></tr><tr><td>configLength</td></tr><tr><td>configName</td></tr><tr><td>currDir</td></tr><tr><td>defaultMacAppBundleName</td></tr><tr><td>defaultMacAppBundlePath</td></tr><tr><td>defaultMacPythonExe</td></tr><tr><td>distDir</td></tr><tr><td>doCleanDesktopLinks</td></tr><tr><td>doCleanup</td></tr><tr><td>doCompile</td></tr><tr><td>forceCleanDesktopLinks</td></tr><tr><td>includePythonVariant</td></tr><tr><td>installApis</td></tr><tr><td>macAppBundleName</td></tr><tr><td>macAppBundlePath</td></tr><tr><td>macPythonExe</td></tr><tr><td>modDir</td></tr><tr><td>platBinDir</td></tr><tr><td>platBinDirOld</td></tr><tr><td>progLanguages</td></tr><tr><td>progName</td></tr><tr><td>pyModDir</td></tr><tr><td>pyqtOverride</td></tr><tr><td>pyqtVariant</td></tr><tr><td>sourceDir</td></tr>
 </table>
 <h3>Classes</h3>
 <table>
--- a/MultiProject/MultiProjectBrowser.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/MultiProject/MultiProjectBrowser.py	Sun Feb 03 16:31:53 2019 +0100
@@ -21,6 +21,7 @@
 import UI.PixmapCache
 
 
+# TODO: add action to copy a project on disk
 class MultiProjectBrowser(QTreeWidget):
     """
     Class implementing the multi project browser.
--- a/Project/DebuggerPropertiesDialog.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/Project/DebuggerPropertiesDialog.py	Sun Feb 03 16:31:53 2019 +0100
@@ -84,7 +84,8 @@
         self.venvComboBox.setCurrentIndex(venvIndex)
         if self.project.debugProperties["DEBUGCLIENT"]:
             self.debugClientPicker.setText(
-                self.project.debugProperties["DEBUGCLIENT"])
+                self.project.debugProperties["DEBUGCLIENT"],
+                toNative=False)
         else:
             if self.project.pdata["PROGLANGUAGE"] in ["Python", "Python2",
                                                       "Python3"]:
@@ -93,7 +94,7 @@
                     "DebugClients", "Python", "DebugClient.py")
             else:
                 debugClient = ""
-            self.debugClientPicker.setText(debugClient)
+            self.debugClientPicker.setText(debugClient, toNative=False)
         self.debugEnvironmentOverrideCheckBox.setChecked(
             self.project.debugProperties["ENVIRONMENTOVERRIDE"])
         self.debugEnvironmentEdit.setText(
@@ -141,7 +142,7 @@
             self.venvComboBox.currentText()
         
         self.project.debugProperties["DEBUGCLIENT"] = \
-            self.debugClientPicker.text()
+            self.debugClientPicker.text(toNative=False)
         if not self.project.debugProperties["DEBUGCLIENT"]:
             if self.project.pdata["PROGLANGUAGE"] in ["Python", "Python2",
                                                       "Python3"]:
@@ -184,7 +185,7 @@
         """
         Private method to save the path picker histories.
         """
-        debugClient = self.debugClientPicker.text()
+        debugClient = self.debugClientPicker.text(toNative=False)
         debugClientsHistory = self.debugClientPicker.getPathItems()
         if debugClient not in debugClientsHistory:
             debugClientsHistory.insert(0, debugClient)
--- a/VirtualEnv/VirtualenvExecDialog.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/VirtualEnv/VirtualenvExecDialog.py	Sun Feb 03 16:31:53 2019 +0100
@@ -130,7 +130,7 @@
         if button == self.buttonBox.button(QDialogButtonBox.Close):
             self.accept()
         elif button == self.buttonBox.button(QDialogButtonBox.Cancel):
-            self.__finish(0, 0, )
+            self.__finish(0, 0, giveUp=True)
     
     def __finish(self, exitCode, exitStatus, giveUp=False):
         """
--- a/VirtualEnv/VirtualenvManagerDialog.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/VirtualEnv/VirtualenvManagerDialog.py	Sun Feb 03 16:31:53 2019 +0100
@@ -243,7 +243,7 @@
                     itm.setFont(column, font)
             
             # show Anaconda environments with italic font
-            elif environments[venvName]["is_conda"]:
+            if environments[venvName]["is_conda"]:
                 font = itm.font(0)
                 font.setItalic(True)
                 for column in range(itm.columnCount()):
--- a/WebBrowser/Network/EricSchemeHandler.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/WebBrowser/Network/EricSchemeHandler.py	Sun Feb 03 16:31:53 2019 +0100
@@ -10,7 +10,7 @@
 from __future__ import unicode_literals
 
 from PyQt5.QtCore import pyqtSignal, QByteArray, QBuffer, QIODevice, \
-    QUrlQuery, QMutex, QMutexLocker, QTimer
+    QUrlQuery, QMutex, QMutexLocker
 from PyQt5.QtWidgets import qApp
 from PyQt5.QtWebEngineCore import QWebEngineUrlSchemeHandler
 
@@ -94,7 +94,7 @@
         self.__pageName = self.__job.requestUrl().path()
         self.__buffer = QBuffer()
         
-        QTimer.singleShot(0, self.__loadPage)
+        self.__loadPage()
     
     def __loadPage(self):
         """
--- a/WebBrowser/Tools/Scripts.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/WebBrowser/Tools/Scripts.py	Sun Feb 03 16:31:53 2019 +0100
@@ -413,6 +413,29 @@
     style = css.replace("'", "\\'").replace("\n", "\\n")
     return source.format(style)
 
+
+def scrollToAnchor(anchor):
+    """
+    Function generating script to scroll to a given anchor.
+    
+    @param anchor name of the anchor to scroll to
+    @type str
+    @return script to set the style sheet
+    @rtype str
+    """
+    source = """
+(function() {{
+    var e = document.getElementById("{0}")
+    if (!e) {{
+        var els = document.querySelectorAll("[name='{0}']");
+        if (els.length)
+            e = els[0]
+    }}
+    if (e)
+        e.scrollIntoView()
+    }})()"""
+    return source.format(anchor)
+
 ###########################################################################
 ## scripts below are specific for eric
 ###########################################################################
--- a/WebBrowser/Tools/WebHitTestResult.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/WebBrowser/Tools/WebHitTestResult.py	Sun Feb 03 16:31:53 2019 +0100
@@ -86,16 +86,16 @@
                 var r = e.getBoundingClientRect();
                 res.boundingRect = [r.top, r.left, r.width, r.height];
                 if (e.tagName.toLowerCase() == 'img')
-                    res.imageUrl = e.getAttribute('src');
+                    res.imageUrl = e.getAttribute('src').trim();
                 if (e.tagName.toLowerCase() == 'a') {{
                     res.linkTitle = e.text;
-                    res.linkUrl = e.getAttribute('href');
+                    res.linkUrl = e.getAttribute('href').trim();
                 }}
                 while (e) {{
                     if (res.linkTitle == '' && e.tagName.toLowerCase() == 'a')
                         res.linkTitle = e.text;
                     if (res.linkUrl == '' && e.tagName.toLowerCase() == 'a')
-                        res.linkUrl = e.getAttribute('href');
+                        res.linkUrl = e.getAttribute('href').trim();
                     if (res.mediaUrl == '' && isMediaElement(e)) {{
                         res.mediaUrl = e.currentSrc;
                         res.mediaPaused = e.paused;
--- a/WebBrowser/WebBrowserPage.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/WebBrowser/WebBrowserPage.py	Sun Feb 03 16:31:53 2019 +0100
@@ -28,6 +28,7 @@
 from .JavaScript.ExternalJsObject import ExternalJsObject
 
 from .Tools.WebHitTestResult import WebHitTestResult
+from .Tools import Scripts
 
 import Preferences
 from Globals import qVersionTuple
@@ -83,6 +84,12 @@
         
         self.urlChanged.connect(self.__urlChanged)
         
+        try:
+            self.contentsSizeChanged.connect(self.__contentsSizeChanged)
+        except AttributeError:
+            # defined for Qt >= 5.7
+            pass
+        
         self.__printer = None
         self.__badSite = False
         
@@ -466,6 +473,17 @@
         loop.exec_()
         return resultDict["res"]
     
+    def __contentsSizeChanged(self, size):
+        """
+        Private slot to work around QWebEnginePage not scrolling to anchors
+        when opened in a background tab.
+        
+        @param size changed contents size (unused)
+        @type QSize
+        """
+        fragment = self.url().fragment()
+        self.runJavaScript(Scripts.scrollToAnchor(fragment))
+    
     ##############################################
     ## Methods below deal with JavaScript messages
     ##############################################
--- a/WebBrowser/WebBrowserView.py	Wed Jan 30 18:56:27 2019 +0100
+++ b/WebBrowser/WebBrowserView.py	Sun Feb 03 16:31:53 2019 +0100
@@ -1519,7 +1519,7 @@
             self.parentWidget().installEventFilter(self)
         
         # find the render widget receiving events for the web page
-        if qVersionTuple() < (5, 8, 0):
+        if qVersionTuple() < (5, 8, 0) or qVersionTuple() >= (5, 12, 0):
             if obj is self and evt.type() == QEvent.ChildAdded:
                 child = evt.child()
                 if child and child.inherits(
--- a/changelog	Wed Jan 30 18:56:27 2019 +0100
+++ b/changelog	Sun Feb 03 16:31:53 2019 +0100
@@ -2,6 +2,9 @@
 ----------
 Version 19.02:
 - bug fixes
+- Debugger
+  -- show / stop at correct line number if an exception happens in a with
+     statement or specific try-except clauses where no breakpoints are set
 - Editor
   -- added cpability to suppress some markers in the marker map
 - Multi Project
Binary file i18n/eric6_es.qm has changed
--- a/i18n/eric6_es.ts	Wed Jan 30 18:56:27 2019 +0100
+++ b/i18n/eric6_es.ts	Sun Feb 03 16:31:53 2019 +0100
@@ -6850,7 +6850,7 @@
         <translation>No establecer la codificación del cliente de depuración</translation>
     </message>
     <message>
-        <location filename="../Project/DebuggerPropertiesDialog.py" line="135"/>
+        <location filename="../Project/DebuggerPropertiesDialog.py" line="136"/>
         <source>All Files (*)</source>
         <translation>Todos los archivos (*)</translation>
     </message>
@@ -9041,32 +9041,32 @@
 <context>
     <name>E5PathPickerBase</name>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="168"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="167"/>
         <source>Enter Path Name</source>
         <translation>Introducir Nombre de Ruta</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="165"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="164"/>
         <source>Enter Path Names separated by &apos;;&apos;</source>
         <translation>Introducir Nombres de Ruta separados por &apos;;&apos;</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="506"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="505"/>
         <source>Choose a file to open</source>
         <translation>Elegir un archivo para abrir</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="508"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="507"/>
         <source>Choose files to open</source>
         <translation>Elegir archivos a abrir</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="513"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="512"/>
         <source>Choose a file to save</source>
         <translation>Elegir un archivo para guardar</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="515"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="514"/>
         <source>Choose a directory</source>
         <translation>Elegir un directorio</translation>
     </message>
@@ -9127,42 +9127,42 @@
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="14"/>
         <source>SSL Certificate Selection</source>
-        <translation type="unfinished"></translation>
+        <translation>Selección de Certificado SSL</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="23"/>
         <source>Select a SSL certificate:</source>
-        <translation type="unfinished"></translation>
+        <translation>Seleccionar un certificado SSL:</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="31"/>
         <source>Certificate name</source>
-        <translation type="unfinished">Nombre de certificado</translation>
+        <translation>Nombre de certificado</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="36"/>
         <source>Expiry Date</source>
-        <translation type="unfinished">Fecha de expiración</translation>
+        <translation>Fecha de expiración</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="49"/>
         <source>Press to view the selected certificate</source>
-        <translation type="unfinished">Pulse para ver el certificado seleccionado</translation>
+        <translation>Pulse para ver el certificado seleccionado</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="52"/>
         <source>&amp;View...</source>
-        <translation type="unfinished">&amp;Ver...</translation>
+        <translation>&amp;Ver...</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.py" line="88"/>
         <source>(Unknown)</source>
-        <translation type="unfinished">(Desconocido)</translation>
+        <translation>(Desconocido)</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.py" line="90"/>
         <source>(Unknown common name)</source>
-        <translation type="unfinished">(Nombre común desconocido)</translation>
+        <translation>(Nombre común desconocido)</translation>
     </message>
 </context>
 <context>
@@ -14308,42 +14308,42 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1893"/>
         <source>Shown Markers</source>
-        <translation type="unfinished"></translation>
+        <translation>Mostrar Marcadores</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1899"/>
         <source>Select to show change markers</source>
-        <translation type="unfinished"></translation>
+        <translation>Seleccionar para mostrar los marcadores de cambios</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1902"/>
         <source>Changes</source>
-        <translation type="unfinished">Cambios</translation>
+        <translation>Cambios</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1909"/>
         <source>Select to show coverage markers</source>
-        <translation type="unfinished"></translation>
+        <translation>Seleccionar para mostrar cobertura de marcadores</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1912"/>
         <source>Coverage</source>
-        <translation type="unfinished">Cobertura</translation>
+        <translation>Cobertura</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1919"/>
         <source>Select to show search markers</source>
-        <translation type="unfinished"></translation>
+        <translation>Seleccionar para mostrar marcadores de búsqueda</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1922"/>
         <source>Search Markers</source>
-        <translation type="unfinished">Marcadores de Búsqueda</translation>
+        <translation>Marcadores de Búsqueda</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1929"/>
         <source>&lt;b&gt;Note&lt;/b&gt;: Marker types not listed are always shown.</source>
-        <translation type="unfinished"></translation>
+        <translation>&lt;b&gt;Nota&lt;/b&gt;: Tipos de marcadores no listados se muestran siempre.</translation>
     </message>
 </context>
 <context>
@@ -15711,7 +15711,7 @@
 <context>
     <name>EricdocPlugin</name>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="95"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="103"/>
         <source>Qt Help Tools</source>
         <translation>Herramientas de Ayuda de Qt</translation>
     </message>
@@ -15721,22 +15721,22 @@
         <translation>Generador de Documentación de Eric6</translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="139"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="147"/>
         <source>Generate documentation (eric6_doc)</source>
         <translation>Generar documentación (eric6_doc)</translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="139"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="147"/>
         <source>Generate &amp;documentation (eric6_doc)</source>
         <translation>Generar &amp;documentación (eric6_doc)</translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="143"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="151"/>
         <source>Generate API documentation using eric6_doc</source>
         <translation>Generar documentación de API utilizando eric6_doc</translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="145"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="153"/>
         <source>&lt;b&gt;Generate documentation&lt;/b&gt;&lt;p&gt;Generate API documentation using eric6_doc.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Generar documentación&lt;/b&gt;&lt;p&gt;Generar documentación de API utilizando eric6_doc.&lt;/p&gt;</translation>
     </message>
@@ -46167,64 +46167,59 @@
 <context>
     <name>MultiProjectBrowser</name>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="405"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="406"/>
         <source>Open</source>
         <translation>Abrir</translation>
     </message>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="333"/>
-        <source>Remove</source>
-        <translation type="obsolete">Eliminar</translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="410"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="411"/>
         <source>Properties</source>
         <translation>Propiedades</translation>
     </message>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="422"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="423"/>
         <source>Configure...</source>
         <translation>Configurar...</translation>
     </message>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="419"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="420"/>
         <source>Add Project...</source>
         <translation>Añadir Proyecto...</translation>
     </message>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="242"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="243"/>
         <source>Not categorized</source>
         <translation>Sin categoría</translation>
     </message>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="326"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="327"/>
         <source>Delete Project</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="308"/>
+        <translation>Borrar Proyecto</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="309"/>
         <source>The current project cannot be deleted. Please close it first.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="319"/>
+        <translation>El proyecto actual no se puede borrar. Por favor, cerrar primero.</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="320"/>
         <source>&lt;p&gt;Shall the project &lt;b&gt;{0}&lt;/b&gt; (Path: {1}) really be deleted?&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="326"/>
+        <translation>&lt;p&gt;¿Desea borrar el proyecto &lt;b&gt;{0}&lt;/b&gt; (Ruta: {1})?&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="327"/>
         <source>&lt;p&gt;Shall the project &lt;b&gt;{0}&lt;/b&gt; (Path: {1}) really be deleted?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; It contains &lt;b&gt;{2}&lt;/b&gt; sub-projects.&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="406"/>
+        <translation>&lt;p&gt;¿Desea borrar el proyecto &lt;b&gt;{0}&lt;/b&gt; (Ruta: {1})?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Advertencia:&lt;/b&gt; Contiene &lt;b&gt;{2}&lt;/b&gt; subproyectos.&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="407"/>
         <source>Remove from Multi Project</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="408"/>
+        <translation>Eliminar del Multi Proyecto</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="409"/>
         <source>Delete from Disk</source>
-        <translation type="unfinished"></translation>
+        <translation>Borrar del Disco</translation>
     </message>
 </context>
 <context>
@@ -50831,22 +50826,22 @@
         <translation>Compilador CORBA IDL</translation>
     </message>
     <message>
-        <location filename="../Preferences/ProgramsDialog.py" line="346"/>
+        <location filename="../Preferences/ProgramsDialog.py" line="347"/>
         <source>(not configured)</source>
         <translation>(no configurado)</translation>
     </message>
     <message>
+        <location filename="../Preferences/ProgramsDialog.py" line="397"/>
+        <source>(not executable)</source>
+        <translation>(no ejecutable)</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ProgramsDialog.py" line="434"/>
+        <source>(not found)</source>
+        <translation>(no encontrado)</translation>
+    </message>
+    <message>
         <location filename="../Preferences/ProgramsDialog.py" line="395"/>
-        <source>(not executable)</source>
-        <translation>(no ejecutable)</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ProgramsDialog.py" line="427"/>
-        <source>(not found)</source>
-        <translation>(no encontrado)</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ProgramsDialog.py" line="393"/>
         <source>(unknown)</source>
         <translation>(desconocido)</translation>
     </message>
@@ -50936,7 +50931,7 @@
         <translation>Compilador gRPC</translation>
     </message>
     <message>
-        <location filename="../Preferences/ProgramsDialog.py" line="374"/>
+        <location filename="../Preferences/ProgramsDialog.py" line="376"/>
         <source>(module not found)</source>
         <translation>(módule no encontrado)</translation>
     </message>
@@ -82104,52 +82099,52 @@
 <context>
     <name>VirtualenvManager</name>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="186"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="187"/>
         <source>Add Virtual Environment</source>
         <translation>Añadir Entorno Virtual</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="186"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="187"/>
         <source>A virtual environment named &lt;b&gt;{0}&lt;/b&gt; exists already. Shall it be replaced?</source>
         <translation>Un entorno virtual llamado &lt;b&gt;{0}&lt;/b&gt; ya existe. ¿Desea reemplazarlo?</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="241"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="244"/>
         <source>Change Virtual Environment</source>
         <translation>Cambiar Entorno Virtual</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="290"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="293"/>
         <source>A virtual environment named &lt;b&gt;{0}&lt;/b&gt; does not exist. Aborting!</source>
         <translation>Un entorno virtual llamado &lt;b&gt;{0}&lt;/b&gt; no existe. ¡Abortando!</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="290"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="293"/>
         <source>Rename Virtual Environment</source>
         <translation>Renombrar Entorno Virtual</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="368"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="371"/>
         <source>{0} - {1}</source>
         <translation>{0} - {1}</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="319"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="322"/>
         <source>Delete Virtual Environments</source>
         <translation>Borrar Entornos Virtuales</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="319"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="322"/>
         <source>Do you really want to delete these virtual environments?</source>
         <translation>¿Desea borrar estos entornos virtuales?</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="373"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="376"/>
         <source>Remove Virtual Environments</source>
         <translation>Eliminar Entornos Virtuales</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="373"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="376"/>
         <source>Do you really want to remove these virtual environments?</source>
         <translation>¿Desea eliminar estos entornos virtuales?</translation>
     </message>
@@ -83563,12 +83558,12 @@
         <translation> s</translation>
     </message>
     <message>
-        <location filename="../WebBrowser/WebBrowserPage.py" line="174"/>
+        <location filename="../WebBrowser/WebBrowserPage.py" line="173"/>
         <source>Suspicuous URL detected</source>
         <translation>Detectada URL sospechosa</translation>
     </message>
     <message>
-        <location filename="../WebBrowser/WebBrowserPage.py" line="174"/>
+        <location filename="../WebBrowser/WebBrowserPage.py" line="173"/>
         <source>&lt;p&gt;The URL &lt;b&gt;{0}&lt;/b&gt; was found in the Safe Browsing database.&lt;/p&gt;{1}</source>
         <translation>&lt;p&gt;La URL &lt;b&gt;{0}&lt;/b&gt; se ha encontrado en la base de datos de Navegación Segura.&lt;/p&gt;{1}</translation>
     </message>
@@ -83808,12 +83803,12 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="153"/>
         <source>Select to try to pre-fetch DNS entries to speed up browsing</source>
-        <translation type="unfinished"></translation>
+        <translation>Seleccionar para intentar preestablecer entradas DNS para acelerar la navegación</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="156"/>
         <source>Enable DNS Prefetch</source>
-        <translation type="unfinished"></translation>
+        <translation>Habilitar Preestablecimiento de DNS</translation>
     </message>
 </context>
 <context>
Binary file i18n/eric6_ru.qm has changed
--- a/i18n/eric6_ru.ts	Wed Jan 30 18:56:27 2019 +0100
+++ b/i18n/eric6_ru.ts	Sun Feb 03 16:31:53 2019 +0100
@@ -2204,7 +2204,7 @@
     <message>
         <location filename="../UI/Browser.py" line="217"/>
         <source>Run unittest...</source>
-        <translation>Запустить unittest...</translation>
+        <translation>Запустить юниттест...</translation>
     </message>
     <message>
         <location filename="../UI/Browser.py" line="286"/>
@@ -3025,14 +3025,14 @@
     <message>
         <location filename="../DataViews/CodeMetricsDialog.ui" line="14"/>
         <source>Code Metrics</source>
-        <translation>Статистика кода</translation>
+        <translation>Метрики кода</translation>
     </message>
     <message>
         <location filename="../DataViews/CodeMetricsDialog.ui" line="17"/>
         <source>&lt;b&gt;Code Metrics&lt;/b&gt;
 &lt;p&gt;This dialog shows some code metrics.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Статистика кода&lt;/b&gt;
-&lt;p&gt;Этот диалог показывает некоторую статистику кода.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Метрики кода&lt;/b&gt;
+&lt;p&gt;Этот диалог показывает некоторые метрики кода.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/CodeMetricsDialog.ui" line="39"/>
@@ -3047,7 +3047,7 @@
     <message>
         <location filename="../DataViews/CodeMetricsDialog.ui" line="63"/>
         <source>Press to start the code metrics run</source>
-        <translation>Запустить подсчёт метрик исходного кода</translation>
+        <translation>Запустить подсчёт метрик кода</translation>
     </message>
     <message>
         <location filename="../DataViews/CodeMetricsDialog.ui" line="89"/>
@@ -3058,8 +3058,8 @@
         <location filename="../DataViews/CodeMetricsDialog.ui" line="76"/>
         <source>&lt;b&gt;Code metrics&lt;/b&gt;
 &lt;p&gt;This list shows some code metrics.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Статистика кода&lt;/b&gt;
-&lt;p&gt;Этот список показывает некоторую статистику кода.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Метрики кода&lt;/b&gt;
+&lt;p&gt;Этот список отображает некоторые метрики кода.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/CodeMetricsDialog.ui" line="84"/>
@@ -3096,7 +3096,7 @@
         <source>&lt;b&gt;Summary&lt;/b&gt;
 &lt;p&gt;This shows some overall code metrics.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Итого&lt;/b&gt;
-&lt;p&gt;Этот показывает общую статистику кода.&lt;/p&gt;</translation>
+&lt;p&gt;Отображение общих метрик кода.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/CodeMetricsDialog.ui" line="136"/>
@@ -3111,7 +3111,7 @@
     <message>
         <location filename="../DataViews/CodeMetricsDialog.ui" line="149"/>
         <source>Shows the progress of the code metrics action</source>
-        <translation>Отображение прогресса сбора статистики кода</translation>
+        <translation>Отображение прогресса сбора метрик кода</translation>
     </message>
     <message>
         <location filename="../DataViews/CodeMetricsDialog.py" line="53"/>
@@ -5567,7 +5567,7 @@
         <location filename="../Debugger/DebugUI.py" line="182"/>
         <source>&lt;b&gt;Run Script&lt;/b&gt;&lt;p&gt;Set the command line arguments and run the script outside the debugger. If the file has unsaved changes it may be saved first.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Выполнить сценарий&lt;/b&gt;
-&lt;p&gt;Задание аргументов и запуск сценария без отладки. Если файл не был сохранён, изменения можно предварительно сохранить.&lt;/p&gt;</translation>
+&lt;p&gt;Установка аргументов командной строки и запуск сценария вне отладчика. Если файл имеет несохранённые изменения, он может быть сохранен первым.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="1841"/>
@@ -5593,44 +5593,44 @@
     <message>
         <location filename="../Debugger/DebugUI.py" line="207"/>
         <source>Coverage run of Script</source>
-        <translation>Охватывающее выполнение сценария</translation>
+        <translation>Прогон покрытия сценария</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="207"/>
         <source>Coverage run of Script...</source>
-        <translation>Охватывающее выполнение сценария...</translation>
+        <translation>Покрытие сценария...</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="212"/>
         <source>Perform a coverage run of the current Script</source>
-        <translation>Выполнить охватывающее выполнение текущего сценария</translation>
+        <translation>Выполнить прогон покрытия текущего сценария</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="214"/>
         <source>&lt;b&gt;Coverage run of Script&lt;/b&gt;&lt;p&gt;Set the command line arguments and run the script under the control of a coverage analysis tool. If the file has unsaved changes it may be saved first.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Охватывающее выполнение сценария&lt;/b&gt;
-&lt;p&gt;Задание аргументов командной строки и запуск сценария под управлением программы охватывающего анализа. Если файл не был сохранён, изменения можно предварительно сохранить.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Прогон покрытия сценария&lt;/b&gt;
+&lt;p&gt;Установка аргументов командной строки и запуск сценария под управлением инструмента анализа покрытия. Если файл имеет несохранённые изменения, он может быть сохранен первым.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="223"/>
         <source>Coverage run of Project</source>
-        <translation>Охватывающее выполнение проекта</translation>
+        <translation>Прогон покрытия проекта</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="223"/>
         <source>Coverage run of Project...</source>
-        <translation>Охватывающее выполнение проекта...</translation>
+        <translation>Покрытие проекта...</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="228"/>
         <source>Perform a coverage run of the current Project</source>
-        <translation>Выполнить охватывающее выполнение текущего проекта</translation>
+        <translation>Выполнить прогон покрытия текущего проекта</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="230"/>
         <source>&lt;b&gt;Coverage run of Project&lt;/b&gt;&lt;p&gt;Set the command line arguments and run the current project under the control of a coverage analysis tool. If files of the current project have unsaved changes they may be saved first.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Охватывающее выполнение проекта&lt;/b&gt;
-&lt;p&gt;Задание аргументов командной строки и запуск проекта под управлением программы охватывающего анализа. Если файлы проекта не были сохранены, изменения можно предварительно сохранить.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Прогон покрытия проекта&lt;/b&gt;
+&lt;p&gt;Задание аргументов командной строки и запуск текущего проекта под управлением инструмента анализа покрытия. Если файл имеет несохранённые изменения, он может быть сохранен первым.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="240"/>
@@ -5650,8 +5650,8 @@
     <message>
         <location filename="../Debugger/DebugUI.py" line="245"/>
         <source>&lt;b&gt;Profile Script&lt;/b&gt;&lt;p&gt;Set the command line arguments and profile the script. If the file has unsaved changes it may be saved first.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Профилирование сценария&lt;/b&gt;
-&lt;p&gt;Задание аргументов и запуск сценария на профилирование. Если файл не был сохранён, изменения можно предварительно сохранить.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Профилировать сценарий&lt;/b&gt;
+&lt;p&gt;Установка аргументов командной строки и запуск профилирования сценария. Если файл имеет несохранённые изменения, он может быть сохранен первым.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="253"/>
@@ -5677,12 +5677,12 @@
     <message>
         <location filename="../Debugger/DebugUI.py" line="1961"/>
         <source>Debug Script</source>
-        <translation>Отладить сценарий</translation>
+        <translation>Отладка сценария</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="269"/>
         <source>&amp;Debug Script...</source>
-        <translation>&amp;Отладить сценарий...</translation>
+        <translation>&amp;Отладка сценария...</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="274"/>
@@ -5693,17 +5693,17 @@
         <location filename="../Debugger/DebugUI.py" line="275"/>
         <source>&lt;b&gt;Debug Script&lt;/b&gt;&lt;p&gt;Set the command line arguments and set the current line to be the first executable Python statement of the current editor window. If the file has unsaved changes it may be saved first.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Отладка сценария&lt;/b&gt;
-&lt;p&gt;Задание аргументов командной строки и запуск сценария на отладку. Если файл не был сохранён, изменения можно предварительно сохранить.&lt;/p&gt;</translation>
+&lt;p&gt;Установка аргументов командной строки и задание в качестве текущей строки первый исполняемый оператор Python текущего окна редактора. Если файл имеет несохранённые изменения, он может быть сохранен первым.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="1977"/>
         <source>Debug Project</source>
-        <translation>Отладить проект</translation>
+        <translation>Отладка проекта</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="285"/>
         <source>Debug &amp;Project...</source>
-        <translation>&amp;Отладить проект...</translation>
+        <translation>&amp;Отладка проекта...</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="290"/>
@@ -5719,7 +5719,7 @@
     <message>
         <location filename="../Debugger/DebugUI.py" line="306"/>
         <source>Restart the last debugged script</source>
-        <translation>Перезапустить сценарий, который отлаживался последним</translation>
+        <translation>Перезапустить последний отлаживаемый сценарий</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="323"/>
@@ -5760,12 +5760,12 @@
     <message>
         <location filename="../Debugger/DebugUI.py" line="354"/>
         <source>Continue running the program from the current line to the current cursor position</source>
-        <translation>Продолжить выполнение программы до строки, на которой находится курсор</translation>
+        <translation>Продолжить выполнение программы до строки, в которой находится курсор</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="357"/>
         <source>&lt;b&gt;Continue To Cursor&lt;/b&gt;&lt;p&gt;Continue running the program from the current line to the current cursor position.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Продолжить до курсора&lt;/b&gt;&lt;p&gt;Продолжить выполнение программы до строки, на которой находится курсор.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Продолжить до курсора&lt;/b&gt;&lt;p&gt;Продолжить выполнение программы до строки, в которой находится курсор.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="385"/>
@@ -5848,7 +5848,7 @@
         <location filename="../Debugger/DebugUI.py" line="445"/>
         <source>&lt;b&gt;Stop&lt;/b&gt;&lt;p&gt;Stop the running debugging session.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Стоп&lt;/b&gt;
-&lt;p&gt;Прервать текущую отладочную сессию.&lt;/p&gt;</translation>
+&lt;p&gt;Остановить текущую отладочную сессию.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="452"/>
@@ -6095,12 +6095,12 @@
     <message>
         <location filename="../Debugger/DebugUI.py" line="1575"/>
         <source>Coverage of Project</source>
-        <translation>Охват проекта</translation>
+        <translation>Покрытие проекта</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="1562"/>
         <source>Coverage of Script</source>
-        <translation>Охват сценария</translation>
+        <translation>Покрытие сценария</translation>
     </message>
     <message>
         <location filename="../Debugger/DebugUI.py" line="1841"/>
@@ -6879,7 +6879,7 @@
         <translation>Не устанавливать кодировку клиента отладки</translation>
     </message>
     <message>
-        <location filename="../Project/DebuggerPropertiesDialog.py" line="135"/>
+        <location filename="../Project/DebuggerPropertiesDialog.py" line="136"/>
         <source>All Files (*)</source>
         <translation>Все файлы (*)</translation>
     </message>
@@ -9078,32 +9078,32 @@
 <context>
     <name>E5PathPickerBase</name>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="168"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="167"/>
         <source>Enter Path Name</source>
         <translation>Задайте путь</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="165"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="164"/>
         <source>Enter Path Names separated by &apos;;&apos;</source>
         <translation>Задайте пути, разделенные &apos;;&apos;</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="506"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="505"/>
         <source>Choose a file to open</source>
         <translation>Выберите файл для открытия</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="508"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="507"/>
         <source>Choose files to open</source>
         <translation>Выберите файлы для открытия</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="513"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="512"/>
         <source>Choose a file to save</source>
         <translation>Выберите файл для сохранения</translation>
     </message>
     <message>
-        <location filename="../E5Gui/E5PathPicker.py" line="515"/>
+        <location filename="../E5Gui/E5PathPicker.py" line="514"/>
         <source>Choose a directory</source>
         <translation>Выберите директорию</translation>
     </message>
@@ -9164,42 +9164,42 @@
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="14"/>
         <source>SSL Certificate Selection</source>
-        <translation type="unfinished"></translation>
+        <translation>Выбор SSL сертификата</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="23"/>
         <source>Select a SSL certificate:</source>
-        <translation type="unfinished"></translation>
+        <translation>Выберите SSL сертификат:</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="31"/>
         <source>Certificate name</source>
-        <translation type="unfinished">Имя сертификата</translation>
+        <translation>Имя сертификата</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="36"/>
         <source>Expiry Date</source>
-        <translation type="unfinished">Дата окончания</translation>
+        <translation>Дата окончания</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="49"/>
         <source>Press to view the selected certificate</source>
-        <translation type="unfinished">Показать выбранный сертификат</translation>
+        <translation>Просмотреть выбранный сертификат</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.ui" line="52"/>
         <source>&amp;View...</source>
-        <translation type="unfinished">&amp;Показать...</translation>
+        <translation>&amp;Просмотреть...</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.py" line="88"/>
         <source>(Unknown)</source>
-        <translation type="unfinished">(Неизвестный)</translation>
+        <translation>(Unknown)</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificateSelectionDialog.py" line="90"/>
         <source>(Unknown common name)</source>
-        <translation type="unfinished">(Неизвестное имя)</translation>
+        <translation>(Unknown common name)</translation>
     </message>
 </context>
 <context>
@@ -9237,7 +9237,7 @@
     <message>
         <location filename="../E5Network/E5SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
-        <translation>Показать выбранный сертификат</translation>
+        <translation>Просмотреть выбранный сертификат</translation>
     </message>
     <message>
         <location filename="../E5Network/E5SslCertificatesDialog.ui" line="161"/>
@@ -10164,22 +10164,22 @@
     <message>
         <location filename="../QScintilla/Editor.py" line="961"/>
         <source>Code metrics...</source>
-        <translation>Статистика кода...</translation>
+        <translation>Метрики кода...</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="962"/>
         <source>Code coverage...</source>
-        <translation>Охват кода...</translation>
+        <translation>Покрытие кода...</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="964"/>
         <source>Show code coverage annotations</source>
-        <translation>Показать аннотации по охвату</translation>
+        <translation>Показать аннотации по покрытию кода</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="967"/>
         <source>Hide code coverage annotations</source>
-        <translation>Не показывать аннотации по охвату</translation>
+        <translation>Не показывать аннотации по покрытию кода</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="970"/>
@@ -10479,17 +10479,17 @@
     <message>
         <location filename="../QScintilla/Editor.py" line="5676"/>
         <source>Code Coverage</source>
-        <translation>Охват кода</translation>
+        <translation>Покрытие кода</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="5676"/>
         <source>Please select a coverage file</source>
-        <translation>Пожалуйста, выберите файл для информации охвата</translation>
+        <translation>Пожалуйста, выберите файл покрытия</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="5739"/>
         <source>Show Code Coverage Annotations</source>
-        <translation>Показать аннотации по охвату</translation>
+        <translation>Показать аннотации по покрытию кода</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="5732"/>
@@ -10499,7 +10499,7 @@
     <message>
         <location filename="../QScintilla/Editor.py" line="5739"/>
         <source>There is no coverage file available.</source>
-        <translation>Нет файла с информацией по охвату.</translation>
+        <translation>Нет доступного файла покрытия.</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="5854"/>
@@ -14199,12 +14199,12 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1775"/>
         <source>Coverage:</source>
-        <translation>Охвата:</translation>
+        <translation>Покрытия:</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1788"/>
         <source>Select the colour for coverage markers</source>
-        <translation>Выберите цвет маркеров охвата</translation>
+        <translation>Выберите цвет маркеров покрытия</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1798"/>
@@ -14264,7 +14264,7 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1821"/>
         <source>Search Markers:</source>
-        <translation>Маркеры поиска:</translation>
+        <translation>Поиска:</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1834"/>
@@ -14346,42 +14346,42 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1893"/>
         <source>Shown Markers</source>
-        <translation type="unfinished"></translation>
+        <translation>Отображать маркеры</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1899"/>
         <source>Select to show change markers</source>
-        <translation type="unfinished"></translation>
+        <translation>Разрешить отображать маркеры изменений</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1902"/>
         <source>Changes</source>
-        <translation type="unfinished">Изменения</translation>
+        <translation>Изменения</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1909"/>
         <source>Select to show coverage markers</source>
-        <translation type="unfinished"></translation>
+        <translation>Разрешить отображать маркеры покрытия</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1912"/>
         <source>Coverage</source>
-        <translation type="unfinished">Охват</translation>
+        <translation>Покрытия</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1919"/>
         <source>Select to show search markers</source>
-        <translation type="unfinished"></translation>
+        <translation>Разрешить отображать маркеры поиска</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1922"/>
         <source>Search Markers</source>
-        <translation type="unfinished">Маркеры поиска</translation>
+        <translation>Поиска</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorStylesPage.ui" line="1929"/>
         <source>&lt;b&gt;Note&lt;/b&gt;: Marker types not listed are always shown.</source>
-        <translation type="unfinished"></translation>
+        <translation>&lt;b&gt;Примечание&lt;/b&gt;: Типы маркеров, не перечисленные в списке, отображаются всегда.</translation>
     </message>
 </context>
 <context>
@@ -15748,7 +15748,7 @@
 <context>
     <name>EricdocPlugin</name>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="95"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="103"/>
         <source>Qt Help Tools</source>
         <translation>Утилиты Qt справки</translation>
     </message>
@@ -15758,22 +15758,22 @@
         <translation>Генератор документации eric6</translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="139"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="147"/>
         <source>Generate documentation (eric6_doc)</source>
         <translation>Создать документацию (eric6_doc)</translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="139"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="147"/>
         <source>Generate &amp;documentation (eric6_doc)</source>
         <translation>Создать &amp;документацию (eric6_doc)</translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="143"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="151"/>
         <source>Generate API documentation using eric6_doc</source>
         <translation>Создать документацию API с помощью eric6_doc</translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginEricdoc.py" line="145"/>
+        <location filename="../Plugins/PluginEricdoc.py" line="153"/>
         <source>&lt;b&gt;Generate documentation&lt;/b&gt;&lt;p&gt;Generate API documentation using eric6_doc.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Создать документацию&lt;/b&gt;&lt;p&gt;Создать документацию API с помощью eric6_doc&lt;/p&gt;</translation>
     </message>
@@ -26629,7 +26629,7 @@
     <message>
         <location filename="../Helpviewer/HelpBrowserWV.py" line="230"/>
         <source>In order to display the site, the request along with all the data must be sent once again, which may lead to some unexpected behaviour of the site e.g. the same action might be performed once again. Do you want to continue anyway?</source>
-        <translation>Для того чтобы показать страницу, необходимо повторить запрос, что может вызвать неожиданное поведение сервера, например, он может дважды сделать одно и то же действие. Продолжить не смотря на это?</translation>
+        <translation>Для того чтобы показать страницу, необходимо повторить запрос, что может вызвать непредвиденное поведение сервера, например, он может дважды сделать одно и то же действие. Продолжить не смотря на это?</translation>
     </message>
     <message>
         <location filename="../Helpviewer/HelpBrowserWV.py" line="422"/>
@@ -39707,17 +39707,17 @@
     <message>
         <location filename="../IconEditor/IconEditorWindow.py" line="1244"/>
         <source>eric6 Icon Editor</source>
-        <translation>Eric редактор иконок</translation>
+        <translation>Eric6 редактор иконок</translation>
     </message>
     <message>
         <location filename="../IconEditor/IconEditorWindow.py" line="1334"/>
         <source>About eric6 Icon Editor</source>
-        <translation>О редакторе иконок Eric</translation>
+        <translation>О eric6 редакторе иконок</translation>
     </message>
     <message>
         <location filename="../IconEditor/IconEditorWindow.py" line="1334"/>
         <source>The eric6 Icon Editor is a simple editor component to perform icon drawing tasks.</source>
-        <translation>Редактор иконок Eric - это простой редактор для рисования иконок.</translation>
+        <translation>Eric6 редактор иконок - это простой редактор для рисования иконок.</translation>
     </message>
     <message>
         <location filename="../IconEditor/IconEditorWindow.py" line="296"/>
@@ -40481,7 +40481,7 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/InterfacePage.ui" line="126"/>
         <source>Enter the number of characters to be shown in the main window title.</source>
-        <translation>Введите длину отображаемого заголовка главного окна.</translation>
+        <translation>Задайте длину отображаемого заголовка главного окна.</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/InterfacePage.ui" line="163"/>
@@ -40662,7 +40662,7 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/InterfacePage.ui" line="92"/>
         <source>Enter wildcard file patterns separated by semicolon. Files matching these patterns will not be shown by the file browsers.</source>
-        <translation>Шаблоны имен файлов, которые не нужно показывать в браузерах.</translation>
+        <translation>Введите шаблоны файлов, разделенные точкой с запятой. Файлы, соответствующие этим шаблонам, не будут отображаться браузерами файлов.</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/InterfacePage.ui" line="333"/>
@@ -45660,17 +45660,17 @@
     <message>
         <location filename="../QScintilla/MiniEditor.py" line="284"/>
         <source>About eric6 Mini Editor</source>
-        <translation>О миниредакторе Eric</translation>
+        <translation>О eric6 миниредакторе</translation>
     </message>
     <message>
         <location filename="../QScintilla/MiniEditor.py" line="284"/>
         <source>The eric6 Mini Editor is an editor component based on QScintilla. It may be used for simple editing tasks, that don&apos;t need the power of a full blown editor.</source>
-        <translation>Миниредактор Eric — это компонент, основанный на QScintilla. Его можно использовать для простых задач редактирования, не требующих полномасштабного редактора.</translation>
+        <translation>Eric6 миниредактор — это компонент, основанный на QScintilla. Его можно использовать для простых задач редактирования, не требующих полномасштабного редактора.</translation>
     </message>
     <message>
         <location filename="../QScintilla/MiniEditor.py" line="2299"/>
         <source>eric6 Mini Editor</source>
-        <translation>Миниредактор eric6</translation>
+        <translation>Eric6 миниредактор</translation>
     </message>
     <message>
         <location filename="../QScintilla/MiniEditor.py" line="460"/>
@@ -46253,64 +46253,59 @@
 <context>
     <name>MultiProjectBrowser</name>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="405"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="406"/>
         <source>Open</source>
         <translation>Открыть</translation>
     </message>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="333"/>
-        <source>Remove</source>
-        <translation type="obsolete">Удалить</translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="410"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="411"/>
         <source>Properties</source>
         <translation>Свойства</translation>
     </message>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="422"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="423"/>
         <source>Configure...</source>
         <translation>Настроить...</translation>
     </message>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="419"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="420"/>
         <source>Add Project...</source>
         <translation>Добавить проект...</translation>
     </message>
     <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="242"/>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="243"/>
         <source>Not categorized</source>
-        <translation>Не отсортирован</translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="326"/>
+        <translation>Не категоризирован</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="327"/>
         <source>Delete Project</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="308"/>
+        <translation>Удалить проект</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="309"/>
         <source>The current project cannot be deleted. Please close it first.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="319"/>
+        <translation>Текущий проект не может быть удален. Пожалуйста, сначала закройте его.</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="320"/>
         <source>&lt;p&gt;Shall the project &lt;b&gt;{0}&lt;/b&gt; (Path: {1}) really be deleted?&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="326"/>
+        <translation>&lt;p&gt;Действительно ли проект &lt;b&gt;{0}&lt;/b&gt; (Путь: {1}) должен быть действительно удален?&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="327"/>
         <source>&lt;p&gt;Shall the project &lt;b&gt;{0}&lt;/b&gt; (Path: {1}) really be deleted?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; It contains &lt;b&gt;{2}&lt;/b&gt; sub-projects.&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="406"/>
+        <translation>&lt;p&gt;Действительно ли проект &lt;b&gt;{0}&lt;/b&gt; (Путь: {1}) должен быть действительно удален?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Предупреждение:&lt;/b&gt; Он содержит &lt;b&gt;{2}&lt;/b&gt; суб-проект(а,ов).&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="407"/>
         <source>Remove from Multi Project</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MultiProject/MultiProjectBrowser.py" line="408"/>
+        <translation>Удалить из мультипроекта</translation>
+    </message>
+    <message>
+        <location filename="../MultiProject/MultiProjectBrowser.py" line="409"/>
         <source>Delete from Disk</source>
-        <translation type="unfinished"></translation>
+        <translation>Удалить с диска</translation>
     </message>
 </context>
 <context>
@@ -49257,7 +49252,7 @@
     <message>
         <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py" line="230"/>
         <source>&lt;p&gt;The package search did not return anything.&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Поиск такого пакета ничего не дал.&lt;/p&gt;</translation>
+        <translation>&lt;p&gt;Поиск пакета не дал никаких результатов.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py" line="267"/>
@@ -50939,7 +50934,7 @@
         <translation>Компилятор IDL CORBA</translation>
     </message>
     <message>
-        <location filename="../Preferences/ProgramsDialog.py" line="393"/>
+        <location filename="../Preferences/ProgramsDialog.py" line="395"/>
         <source>(unknown)</source>
         <translation>(неизвестный)</translation>
     </message>
@@ -50949,17 +50944,17 @@
         <translation>Проверка орфографии - PyEnchant</translation>
     </message>
     <message>
-        <location filename="../Preferences/ProgramsDialog.py" line="346"/>
+        <location filename="../Preferences/ProgramsDialog.py" line="347"/>
         <source>(not configured)</source>
         <translation>(не настроено)</translation>
     </message>
     <message>
-        <location filename="../Preferences/ProgramsDialog.py" line="395"/>
+        <location filename="../Preferences/ProgramsDialog.py" line="397"/>
         <source>(not executable)</source>
         <translation>(не исполняемый)</translation>
     </message>
     <message>
-        <location filename="../Preferences/ProgramsDialog.py" line="427"/>
+        <location filename="../Preferences/ProgramsDialog.py" line="434"/>
         <source>(not found)</source>
         <translation>(не найдено)</translation>
     </message>
@@ -51029,7 +51024,7 @@
         <translation>Компилятор gRPC</translation>
     </message>
     <message>
-        <location filename="../Preferences/ProgramsDialog.py" line="374"/>
+        <location filename="../Preferences/ProgramsDialog.py" line="376"/>
         <source>(module not found)</source>
         <translation>(модуль не найден)</translation>
     </message>
@@ -51791,42 +51786,42 @@
     <message>
         <location filename="../Project/Project.py" line="4095"/>
         <source>Code Metrics</source>
-        <translation>Статистика кода</translation>
+        <translation>Метрики кода</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4095"/>
         <source>&amp;Code Metrics...</source>
-        <translation>&amp;Статистика кода...</translation>
+        <translation>&amp;Метрики кода...</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4099"/>
         <source>Show some code metrics for the project.</source>
-        <translation>Отображение статистики кода проекта.</translation>
+        <translation>Отображение некоторых метрик кода проекта.</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4101"/>
         <source>&lt;b&gt;Code Metrics...&lt;/b&gt;&lt;p&gt;This shows some code metrics for all Python files in the project.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Статистика кода...&lt;/b&gt;&lt;p&gt;Отображение статистики кода проекта.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Метрики кода...&lt;/b&gt;&lt;p&gt;Отображение некоторых метрик кода для всех Python-файлов проекта.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4109"/>
         <source>Python Code Coverage</source>
-        <translation>Охват кода Python</translation>
+        <translation>Покрытие кода Python</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4109"/>
         <source>Code Co&amp;verage...</source>
-        <translation>&amp;Заключения по коду...</translation>
+        <translation>&amp;Покрытие кода...</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4113"/>
         <source>Show code coverage information for the project.</source>
-        <translation>Показать заключение охвата по коду проекта.</translation>
+        <translation>Показать информацию покрытия кода проекта.</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4115"/>
         <source>&lt;b&gt;Code Coverage...&lt;/b&gt;&lt;p&gt;This shows the code coverage information for all Python files in the project.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Заключение по охвату коду...&lt;/b&gt;&lt;p&gt;Показать заключение охвата по коду всех файлов проекта.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Покрытие кода...&lt;/b&gt;&lt;p&gt;Показать информацию покрытия кода всех Python-файлов проекта.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4977"/>
@@ -51971,7 +51966,7 @@
     <message>
         <location filename="../Project/Project.py" line="4904"/>
         <source>Coverage Data</source>
-        <translation>Данные охвата</translation>
+        <translation>Данные покрытия</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4954"/>
@@ -51981,12 +51976,12 @@
     <message>
         <location filename="../Project/Project.py" line="4927"/>
         <source>Code Coverage</source>
-        <translation>Охват кода</translation>
+        <translation>Покрытие кода</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4927"/>
         <source>Please select a coverage file</source>
-        <translation>Пожалуйста, выберите файл для информации охвата</translation>
+        <translation>Пожалуйста, выберите файл покрытия</translation>
     </message>
     <message>
         <location filename="../Project/Project.py" line="4977"/>
@@ -53721,12 +53716,12 @@
     <message>
         <location filename="../Project/ProjectSourcesBrowser.py" line="116"/>
         <source>Code metrics...</source>
-        <translation>Статистика кода...</translation>
+        <translation>Метрики кода...</translation>
     </message>
     <message>
         <location filename="../Project/ProjectSourcesBrowser.py" line="118"/>
         <source>Code coverage...</source>
-        <translation>Охват кода...</translation>
+        <translation>Покрытие кода...</translation>
     </message>
     <message>
         <location filename="../Project/ProjectSourcesBrowser.py" line="120"/>
@@ -53761,7 +53756,7 @@
     <message>
         <location filename="../Project/ProjectSourcesBrowser.py" line="140"/>
         <source>Run unittest...</source>
-        <translation>Запустить unittest...</translation>
+        <translation>Запустить юниттест...</translation>
     </message>
     <message>
         <location filename="../Project/ProjectSourcesBrowser.py" line="440"/>
@@ -53841,12 +53836,12 @@
     <message>
         <location filename="../Project/ProjectSourcesBrowser.py" line="966"/>
         <source>Code Coverage</source>
-        <translation>Охват кода</translation>
+        <translation>Покрытие кода</translation>
     </message>
     <message>
         <location filename="../Project/ProjectSourcesBrowser.py" line="966"/>
         <source>Please select a coverage file</source>
-        <translation>Пожалуйста, выберите охватываемый файл</translation>
+        <translation>Пожалуйста, выберите файл покрытия</translation>
     </message>
     <message>
         <location filename="../Project/ProjectSourcesBrowser.py" line="1020"/>
@@ -54561,14 +54556,14 @@
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="20"/>
         <source>Python Code Coverage</source>
-        <translation>Охват кода Python</translation>
+        <translation>Покрытие кода Python</translation>
     </message>
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="23"/>
         <source>&lt;b&gt;Python Code Coverage&lt;/b&gt;
 &lt;p&gt;This dialog shows the collected code coverage data.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Охват кода Python&lt;/b&gt;
-&lt;p&gt;Отображение диалога с результатами охватывающего выполнения проекта.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Покрытие кода Python&lt;/b&gt;
+&lt;p&gt;Отображение диалога собранных данных покрытия данных.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="35"/>
@@ -54578,14 +54573,14 @@
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="51"/>
         <source>Enter a regexp pattern marking lines to exclude from coverage</source>
-        <translation>Задайте шаблон регулярного выражения, описывающего, какие строки должны быть исключены из охвата</translation>
+        <translation>Задайте шаблон регулярного выражения, описывающего, какие строки должны быть исключены из покрытия</translation>
     </message>
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="54"/>
         <source>&lt;b&gt;Exclude pattern&lt;/b&gt;
 &lt;p&gt;Enter a regular expression pattern. Lines matching this pattern are excluded from the coverage analysis. The default pattern is &apos;#pragma[: ]+[nN][oO] [cC][oO][vV][eE][rR]&apos;. If the pattern is found on a line containing the colon that introduces a suite of statements, the entire suite is excluded.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Шаблон исключения&lt;/b&gt;
-&lt;p&gt;Задайте шаблон регулярного выражения. Строки, удовлетворяющие этому выражению, будут исключены из анализа охвата. Шаблон по умолчанию - &apos;#pragma[: ]+[nN][oO] [cC][oO][vV][eE][rR]&apos;. Если шаблон находится в строке, содержащей несколько операторов, то будет выполнена вся строка.&lt;/p&gt;</translation>
+&lt;p&gt;Задайте шаблон регулярного выражения. Строки, удовлетворяющие этому выражению, будут исключены из анализа покрытия. Шаблон по умолчанию - &apos;#pragma[: ]+[nN][oO] [cC][oO][vV][eE][rR]&apos;. Если шаблон находится в строке, содержащей двоеточие, которое вводит набор операторов, весь набор исключается.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="71"/>
@@ -54601,9 +54596,8 @@
         <location filename="../DataViews/PyCoverageDialog.ui" line="89"/>
         <source>&lt;b&gt;Python Code Coverage&lt;/b&gt;
 &lt;p&gt;This list shows the collected code coverage data. There are several actions available via the context menu.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Охват кода Python&lt;/b&gt;
-&lt;p&gt;Отображение диалога с результатами охватывающего выполнения проекта.
-Некоторые действия доступны из контекстного меню&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Покрытие кода Python&lt;/b&gt;
+&lt;p&gt;Отображение списка собранных данных покрытия кода. Некоторые действия доступны из контекстного меню&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="103"/>
@@ -54623,7 +54617,7 @@
     <message>
         <location filename="../DataViews/PyCoverageDialog.py" line="349"/>
         <source>Coverage</source>
-        <translation>Охват</translation>
+        <translation>Покрытие</translation>
     </message>
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="123"/>
@@ -54645,12 +54639,12 @@
         <source>&lt;b&gt;Summary&lt;/b&gt;
 &lt;p&gt;This shows some overall code coverage information.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Итого&lt;/b&gt;
-&lt;p&gt;Отображение общей информации охвата кода.&lt;/p&gt;</translation>
+&lt;p&gt;Отображение общей информации покрытия кода.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="183"/>
         <source>Shows the progress of the code coverage action</source>
-        <translation>Отображение процесса сбора информации охвата кода</translation>
+        <translation>Отображение процесса сбора информации покрытия кода</translation>
     </message>
     <message>
         <location filename="../DataViews/PyCoverageDialog.py" line="61"/>
@@ -54670,7 +54664,7 @@
     <message>
         <location filename="../DataViews/PyCoverageDialog.py" line="67"/>
         <source>Erase Coverage Info</source>
-        <translation>Удалять информацию охвата</translation>
+        <translation>Удалить информацию покрытия</translation>
     </message>
     <message>
         <location filename="../DataViews/PyCoverageDialog.py" line="345"/>
@@ -54696,9 +54690,9 @@
         <location filename="../DataViews/PyCoverageDialog.py" line="243"/>
         <source>%n file(s) could not be parsed. Coverage info for these is not available.</source>
         <translation>
-            <numerusform>Невозможно разобрать %n файл. Информация охвата для него недоступна.</numerusform>
-            <numerusform>Невозможно разобрать %n файла. Информация охвата для них недоступна.</numerusform>
-            <numerusform>Невозможно разобрать %n файлов. Информация охвата для них недоступна.</numerusform>
+            <numerusform>Невозможно разобрать %n файл. Информация покрытия для него недоступна.</numerusform>
+            <numerusform>Невозможно разобрать %n файла. Информация покрытия для них недоступна.</numerusform>
+            <numerusform>Невозможно разобрать %n файлов. Информация покрытия для них недоступна.</numerusform>
         </translation>
     </message>
     <message>
@@ -54718,13 +54712,13 @@
         <location filename="../DataViews/PyProfileDialog.ui" line="23"/>
         <source>&lt;b&gt;Profile Results&lt;/b&gt;
 &lt;p&gt;This dialog shows the profile results.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Данные профайлера...&lt;/b&gt;&lt;p&gt;Отображение результатов профилирования проекта.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Результаты профайлера...&lt;/b&gt;&lt;p&gt;Отображение результатов профилирования проекта.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="39"/>
         <source>&lt;b&gt;Profile Results&lt;/b&gt;
 &lt;p&gt;This list shows the profile results. There are several actions available via the context menu.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Данные профайлера...&lt;/b&gt;&lt;p&gt;Отображение результатов профилирования проекта. Некоторые действия доступны из контекстного меню.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Результаты профайлера...&lt;/b&gt;&lt;p&gt;Отображение результатов профилирования проекта. Некоторые действия доступны из контекстного меню.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="56"/>
@@ -54734,12 +54728,12 @@
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="61"/>
         <source>Total Time</source>
-        <translation>Итого времени</translation>
+        <translation>Тотальное время</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="66"/>
         <source>Tot. Time / Call</source>
-        <translation>Общ.вр / Выз</translation>
+        <translation>Тотал. время/Выз</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="71"/>
@@ -54749,7 +54743,7 @@
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="76"/>
         <source>Cum. Time / Call</source>
-        <translation>Сов.вр / Выз</translation>
+        <translation>Совокуп. время/Выз</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="81"/>
@@ -54770,13 +54764,13 @@
         <location filename="../DataViews/PyProfileDialog.ui" line="105"/>
         <source>&lt;b&gt;Summary&lt;/b&gt;
 &lt;p&gt;This shows some overall profile data. There are several actions available via the context menu.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Итого&lt;/b&gt;
-&lt;p&gt;Отображает общие данные профайлера. Некоторые действия доступны из контекстного меню.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Сводка&lt;/b&gt;
+&lt;p&gt;Отображает некоторые общие данные профиля. В контекстном меню доступны Некоторые действия доступны в контекстном меню.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="119"/>
         <source>Summary</source>
-        <translation>Итого</translation>
+        <translation>Сводка</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="124"/>
@@ -54786,22 +54780,22 @@
     <message>
         <location filename="../DataViews/PyProfileDialog.ui" line="132"/>
         <source>Shows the progress of the profile data calculation</source>
-        <translation>Отображение прогресса сбора информации профайлера</translation>
+        <translation>Отображение прогресса сбора информации профиля</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="337"/>
         <source>Exclude Python Library</source>
-        <translation>Исключить библиотеку Python</translation>
+        <translation>Исключить библиотеки Python</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="89"/>
         <source>Erase Profiling Info</source>
-        <translation>Удалить информацию профайлера</translation>
+        <translation>Удалить информацию профилирования</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="91"/>
         <source>Erase Timing Info</source>
-        <translation>Удалять информацию времени выполнения</translation>
+        <translation>Удалить информацию времени выполнения</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="94"/>
@@ -54816,27 +54810,27 @@
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="217"/>
         <source>primitive calls</source>
-        <translation>простые вызовы</translation>
+        <translation>вызовы примитивов</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="219"/>
         <source>CPU seconds</source>
-        <translation>Секунд процессора</translation>
+        <translation>CPU, секунды</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="233"/>
         <source>&lt;p&gt;There is no profiling data available for &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Нет данных профайлера для &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;</translation>
+        <translation>&lt;p&gt;Нет данных профилирования для &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="246"/>
         <source>Loading Profiling Data</source>
-        <translation>Загрузка данных профайлера</translation>
+        <translation>Загрузка данных профилирования</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="246"/>
         <source>&lt;p&gt;The profiling data could not be read from file &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Невозможно считать данные профайлера из файла &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;</translation>
+        <translation>&lt;p&gt;Невозможно считать данные профилирования из файла &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../DataViews/PyProfileDialog.py" line="333"/>
@@ -64623,7 +64617,7 @@
     <message>
         <location filename="../Debugger/StartCoverageDialog.ui" line="14"/>
         <source>Start coverage run</source>
-        <translation>Начать выполнение с охватом</translation>
+        <translation>Запустить прогон покрытия</translation>
     </message>
     <message>
         <location filename="../Debugger/StartCoverageDialog.ui" line="35"/>
@@ -64735,19 +64729,19 @@
     <message>
         <location filename="../Debugger/StartCoverageDialog.ui" line="214"/>
         <source>Select this to erase the collected coverage information</source>
-        <translation>Разрешить удаление собранной информации охвата</translation>
+        <translation>Разрешить удаление собранной информации покрытия</translation>
     </message>
     <message>
         <location filename="../Debugger/StartCoverageDialog.ui" line="217"/>
         <source>&lt;b&gt;Erase coverage information&lt;/b&gt;
 &lt;p&gt;Select this to erase the collected coverage information before the next coverage run.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Стереть информацию охвата&lt;/b&gt;
-&lt;p&gt;Разрешить удаление информации охвата перед следующим охватывающим выполнением.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Стереть информацию покрытия&lt;/b&gt;
+&lt;p&gt;Разрешить удаление информации покрытия перед следующим прогоном покрытия.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../Debugger/StartCoverageDialog.ui" line="221"/>
         <source>Erase &amp;coverage information</source>
-        <translation>&amp;Удалять информацию охвата</translation>
+        <translation>&amp;Удалять информацию покрытия</translation>
     </message>
     <message>
         <location filename="../Debugger/StartCoverageDialog.ui" line="224"/>
@@ -73851,7 +73845,7 @@
     <message>
         <location filename="../Tools/TrayStarter.py" line="109"/>
         <source>Unittest</source>
-        <translation>Unittest</translation>
+        <translation>Юниттест</translation>
     </message>
     <message>
         <location filename="../Tools/TrayStarter.py" line="114"/>
@@ -74585,7 +74579,7 @@
     <message>
         <location filename="../PyUnit/UnittestDialog.py" line="405"/>
         <source>Unittest</source>
-        <translation>Unittest</translation>
+        <translation>Юниттест</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="69"/>
@@ -74596,12 +74590,12 @@
         <location filename="../PyUnit/UnittestDialog.ui" line="72"/>
         <source>&lt;b&gt;Testname&lt;/b&gt;&lt;p&gt;Enter the name of the test to be performed. This name must follow the rules given by Python&apos;s unittest module. If this field is empty, the default name of &quot;suite&quot; will be used.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Testname&lt;/b&gt;
- &lt;p&gt;Задайте имя теста для исполнения. Имя должно соотвестсвовать правилам, заданным модулем unittest Python. Если оставить поле пустым, будет использовано имя по умолчанию (&quot;suite&quot;).&lt;/p&gt;</translation>
+&lt;p&gt;Задайте имя теста для исполнения. Имя должно соотвестсвовать правилам, заданным модулем unittest Python. Если оставить поле пустым, будет использовано имя по умолчанию (&quot;suite&quot;).&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="45"/>
         <source>Enter name of file defining the testsuite</source>
-        <translation>Задайте имя файла, определяющего testsuite</translation>
+        <translation>Задайте имя файла, определяющего набор тестов</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="48"/>
@@ -74611,10 +74605,9 @@
 found, the module will be inspected for proper test
 cases.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Testsuite&lt;/b&gt;
-&lt;p&gt;Задайте имя файла, определяющего testsuite.
+&lt;p&gt;Задайте имя файла, определяющего набор тестов (testsuite).
 Он должен содержать метод с именем, указанным ниже. Если имя не задано, будет вызван метод suite().
-Если метод не может быть найден, модуль будет проверен
-на правильность тестов.&lt;/p&gt;</translation>
+Если метод не может быть найден, модуль будет проверен на правильность тестов.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="59"/>
@@ -74639,22 +74632,22 @@
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="101"/>
         <source>Select whether coverage data should be collected</source>
-        <translation>Разрешить собирать данные охвата</translation>
+        <translation>Разрешить собирать данные покрытия</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="104"/>
         <source>C&amp;ollect coverage data</source>
-        <translation>Собирать данные &amp;охвата</translation>
+        <translation>Собирать данные &amp;покрытия</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="114"/>
         <source>Select whether old coverage data should be erased</source>
-        <translation>Разрешить удалять старые данные охвата</translation>
+        <translation>Разрешить удалять старые данные покрытия</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="117"/>
         <source>&amp;Erase coverage data</source>
-        <translation>&amp;Удалять данные охвата</translation>
+        <translation>&amp;Удалять данные покрытия</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="135"/>
@@ -74744,7 +74737,7 @@
     <message>
         <location filename="../PyUnit/UnittestDialog.py" line="75"/>
         <source>&lt;b&gt;Start Test&lt;/b&gt;&lt;p&gt;This button starts the selected testsuite.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Запустить тесты&lt;/b&gt;&lt;p&gt;Запустить выбранный набор тестов.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Запустить тест&lt;/b&gt;&lt;p&gt;Запустить выбранный набор тестов.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.py" line="86"/>
@@ -74754,12 +74747,12 @@
     <message>
         <location filename="../PyUnit/UnittestDialog.py" line="88"/>
         <source>Stop the running unittest</source>
-        <translation>Остановить выполняющийся набор тестов</translation>
+        <translation>Остановить выполняющийся юниттест</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.py" line="89"/>
         <source>&lt;b&gt;Stop Test&lt;/b&gt;&lt;p&gt;This button stops a running unittest.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Остановить&lt;/b&gt;&lt;p&gt;Остановить выполняющийся набор тестов.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Остановить&lt;/b&gt;&lt;p&gt;Остановить выполняющийся юниттест.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.py" line="121"/>
@@ -74784,7 +74777,7 @@
     <message>
         <location filename="../PyUnit/UnittestDialog.py" line="271"/>
         <source>You must enter a test suite file.</source>
-        <translation>Необходимо ввести имя файла с набором тестов.</translation>
+        <translation>Необходимо ввести файл с набором тестов.</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.py" line="279"/>
@@ -74884,7 +74877,7 @@
     <message>
         <location filename="../PyUnit/UnittestDialog.py" line="82"/>
         <source>&lt;b&gt;Rerun Failed&lt;/b&gt;&lt;p&gt;This button reruns all failed tests of the selected testsuite.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Повторить неудачные&lt;/b&gt;&lt;p&gt;Перезапустить все неудачные тесты выбранного набора.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Повторить неудачные&lt;/b&gt;&lt;p&gt;Перезапустить все неудачные тесты выбранного набора тестов.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../PyUnit/UnittestDialog.ui" line="166"/>
@@ -75501,84 +75494,84 @@
     <message>
         <location filename="../UI/UserInterface.py" line="2948"/>
         <source>Unittest</source>
-        <translation>Unittest</translation>
+        <translation>Юниттест</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1905"/>
         <source>&amp;Unittest...</source>
-        <translation>&amp;Unittest...</translation>
+        <translation>&amp;Юниттест...</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1910"/>
         <source>Start unittest dialog</source>
-        <translation>Запустить unittest</translation>
+        <translation>Запустить диалог юниттеста</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1911"/>
         <source>&lt;b&gt;Unittest&lt;/b&gt;&lt;p&gt;Perform unit tests. The dialog gives you the ability to select and run a unittest suite.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Unittest&lt;/b&gt;
-&lt;p&gt;Выполнение тестов. Диалог даёт возможность выбрать и выполнить набор тестов с помощью Unittest.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Юниттест&lt;/b&gt;
+&lt;p&gt;Выполнение тестов. Диалог даёт возможность выбрать и выполнить набор юниттестов.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1919"/>
         <source>Unittest Restart</source>
-        <translation>Перезапустить Unittest</translation>
+        <translation>Перезапустить юниттест</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1919"/>
         <source>&amp;Restart Unittest...</source>
-        <translation>&amp;Перезапустить Unittest...</translation>
+        <translation>&amp;Перезапустить юниттест...</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1924"/>
         <source>Restart last unittest</source>
-        <translation>Перезапустить последний Unittest</translation>
+        <translation>Перезапустить последний юниттест</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1925"/>
         <source>&lt;b&gt;Restart Unittest&lt;/b&gt;&lt;p&gt;Restart the unittest performed last.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Перезапустить Unittest&lt;/b&gt;
- &lt;p&gt;Перезапустить последний проведённый тест.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Перезапустить юниттест&lt;/b&gt;
+ &lt;p&gt;Перезапустить последний проведённый юниттест.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1949"/>
         <source>Unittest Script</source>
-        <translation>Unittest на сценарии</translation>
+        <translation>Юниттест на сценарии</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1949"/>
         <source>Unittest &amp;Script...</source>
-        <translation>Unittest на &amp;сценарии...</translation>
+        <translation>Юниттест на &amp;сценарии...</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1954"/>
         <source>Run unittest with current script</source>
-        <translation>Выполнить Uniitest с текущим сценарием</translation>
+        <translation>Выполнить юниттест на текущем сценарии</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1956"/>
         <source>&lt;b&gt;Unittest Script&lt;/b&gt;&lt;p&gt;Run unittest with current script.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Сценарий Unittest&lt;/b&gt;&lt;p&gt;Выполнить Uniitest с текущим сценарием.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Юнитест на сценарии&lt;/b&gt;&lt;p&gt;Выполнить юнитест на с текущем сценарии.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="4512"/>
         <source>Unittest Project</source>
-        <translation>Unittest на проекте</translation>
+        <translation>Юнитест на проекте</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1964"/>
         <source>Unittest &amp;Project...</source>
-        <translation>Unittest на &amp;проекте...</translation>
+        <translation>Юнитест на &amp;проекте...</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1969"/>
         <source>Run unittest with current project</source>
-        <translation>Выполнить Unittest с текущим проектом</translation>
+        <translation>Выполнить юнитест на текущем проекте</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1971"/>
         <source>&lt;b&gt;Unittest Project&lt;/b&gt;&lt;p&gt;Run unittest with current project.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Сценарий Unittest&lt;/b&gt;&lt;p&gt;Выполнить Uniitest с текущим проектом.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Юнитест на проекте&lt;/b&gt;&lt;p&gt;Выполнить юнитест на текущем проекте.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="2032"/>
@@ -76059,7 +76052,7 @@
     <message>
         <location filename="../UI/UserInterface.py" line="2725"/>
         <source>&amp;Unittest</source>
-        <translation>&amp;Unittest</translation>
+        <translation>&amp;Юнитест</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="2742"/>
@@ -76534,7 +76527,7 @@
     <message>
         <location filename="../UI/UserInterface.py" line="1933"/>
         <source>Unittest Rerun Failed</source>
-        <translation>Перезапуск тестов провалился</translation>
+        <translation>Неудачный перезапуск юнитеста</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="1933"/>
@@ -77039,12 +77032,12 @@
     <message>
         <location filename="../UI/UserInterface.py" line="2148"/>
         <source>Start the eric6 Icon Editor</source>
-        <translation>Запустить редактор иконок</translation>
+        <translation>Запустить eric6 редактор иконок</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="2150"/>
         <source>&lt;b&gt;Icon Editor&lt;/b&gt;&lt;p&gt;Starts the eric6 Icon Editor for editing simple icons.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Редактор иконок&lt;/b&gt;&lt;p&gt;Запустить редактор иконок.&lt;/p&gt;</translation>
+        <translation>&lt;b&gt;Редактор иконок&lt;/b&gt;&lt;p&gt;Запустить eric6 редактор иконок.&lt;/p&gt;</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="2236"/>
@@ -77189,8 +77182,8 @@
     <message>
         <location filename="../UI/UserInterface.py" line="6883"/>
         <source>You installed eric directly from the source code. There is no possibility to check for the availability of an update.</source>
-        <translation>Вы установили eric непосредственно из исходного кода.
-Нет возможности проверить наличие обновлений.</translation>
+        <translation>Eric установлен непосредственно из исходного кода.
+Невозможно проверить наличие обновлений.</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="6873"/>
@@ -82358,52 +82351,52 @@
 <context>
     <name>VirtualenvManager</name>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="186"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="187"/>
         <source>Add Virtual Environment</source>
         <translation>Добавить виртуальное окружение</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="186"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="187"/>
         <source>A virtual environment named &lt;b&gt;{0}&lt;/b&gt; exists already. Shall it be replaced?</source>
         <translation>Виртуальное окружение с именем &lt;b&gt;{0}&lt;/b&gt; уже существует.Заменить его?</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="241"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="244"/>
         <source>Change Virtual Environment</source>
         <translation>Изменить виртуальное окружение</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="290"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="293"/>
         <source>A virtual environment named &lt;b&gt;{0}&lt;/b&gt; does not exist. Aborting!</source>
         <translation>Виртуальное окружение с именем &lt;b&gt;{0}&lt;/b&gt; не существует. Прерывание!</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="290"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="293"/>
         <source>Rename Virtual Environment</source>
         <translation>Переименовать виртуальное окружение</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="368"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="371"/>
         <source>{0} - {1}</source>
         <translation>{0} - {1}</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="319"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="322"/>
         <source>Delete Virtual Environments</source>
         <translation>Удалить виртуальные окружения</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="319"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="322"/>
         <source>Do you really want to delete these virtual environments?</source>
         <translation>Вы действительно хотите удалить эти виртуальные окружения?</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="373"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="376"/>
         <source>Remove Virtual Environments</source>
         <translation>Убрать виртуальные окружения из списка</translation>
     </message>
     <message>
-        <location filename="../VirtualEnv/VirtualenvManager.py" line="373"/>
+        <location filename="../VirtualEnv/VirtualenvManager.py" line="376"/>
         <source>Do you really want to remove these virtual environments?</source>
         <translation>Вы действительно хотите убрать эти виртуальные окружения из списка?</translation>
     </message>
@@ -83817,12 +83810,12 @@
         <translation> сек</translation>
     </message>
     <message>
-        <location filename="../WebBrowser/WebBrowserPage.py" line="174"/>
+        <location filename="../WebBrowser/WebBrowserPage.py" line="173"/>
         <source>Suspicuous URL detected</source>
         <translation>Обнаружен подозрительный URL</translation>
     </message>
     <message>
-        <location filename="../WebBrowser/WebBrowserPage.py" line="174"/>
+        <location filename="../WebBrowser/WebBrowserPage.py" line="173"/>
         <source>&lt;p&gt;The URL &lt;b&gt;{0}&lt;/b&gt; was found in the Safe Browsing database.&lt;/p&gt;{1}</source>
         <translation>&lt;p&gt;URL &lt;b&gt;{0}&lt;/b&gt; был найден в базе Safe Browsing.&lt;/p&gt;{1}</translation>
     </message>
@@ -84062,12 +84055,12 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="153"/>
         <source>Select to try to pre-fetch DNS entries to speed up browsing</source>
-        <translation type="unfinished"></translation>
+        <translation>Разрешить предварительное извлечение записей DNS для ускорения просмотра</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="156"/>
         <source>Enable DNS Prefetch</source>
-        <translation type="unfinished"></translation>
+        <translation>Включить предварительную выборку DNS</translation>
     </message>
 </context>
 <context>

eric ide

mercurial