Enhanced the certificate manager of the web browser by code to import/export certificates and to delete system certificates.

Sun, 19 Dec 2010 19:51:37 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 19 Dec 2010 19:51:37 +0100
changeset 762
48190a225699
parent 761
de0723fab049
child 763
59c27b72d344

Enhanced the certificate manager of the web browser by code to import/export certificates and to delete system certificates.

APIs/Python3/eric5.api file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Helpviewer.Network.NetworkAccessManager.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Helpviewer.SslCertificatesDialog.html file | annotate | diff | comparison | revisions
Helpviewer/Network/NetworkAccessManager.py file | annotate | diff | comparison | revisions
Helpviewer/SslCertificatesDialog.py file | annotate | diff | comparison | revisions
Helpviewer/SslCertificatesDialog.ui file | annotate | diff | comparison | revisions
i18n/eric5_cs.ts file | annotate | diff | comparison | revisions
i18n/eric5_de.qm file | annotate | diff | comparison | revisions
i18n/eric5_de.ts file | annotate | diff | comparison | revisions
i18n/eric5_en.ts file | annotate | diff | comparison | revisions
i18n/eric5_es.ts file | annotate | diff | comparison | revisions
i18n/eric5_fr.ts file | annotate | diff | comparison | revisions
i18n/eric5_it.ts file | annotate | diff | comparison | revisions
i18n/eric5_ru.ts file | annotate | diff | comparison | revisions
i18n/eric5_tr.ts file | annotate | diff | comparison | revisions
i18n/eric5_zh_CN.GB2312.ts file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric5.api	Sun Dec 19 15:26:00 2010 +0100
+++ b/APIs/Python3/eric5.api	Sun Dec 19 19:51:37 2010 +0100
@@ -2371,9 +2371,14 @@
 eric5.Helpviewer.SearchWidget.SearchWidget?1(mainWindow, parent = None)
 eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.CertRole?7
 eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_caCertificatesTree_currentItemChanged?4(current, previous)
+eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_caDeleteButton_clicked?4()
+eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_caExportButton_clicked?4()
+eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_caImportButton_clicked?4()
 eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_caViewButton_clicked?4()
 eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_serversCertificatesTree_currentItemChanged?4(current, previous)
 eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_serversDeleteButton_clicked?4()
+eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_serversExportButton_clicked?4()
+eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_serversImportButton_clicked?4()
 eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog.on_serversViewButton_clicked?4()
 eric5.Helpviewer.SslCertificatesDialog.SslCertificatesDialog?1(parent = None)
 eric5.Helpviewer.SslInfoDialog.SslInfoDialog?1(certificate, parent = None)
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Sun Dec 19 15:26:00 2010 +0100
+++ b/Documentation/Help/source.qhp	Sun Dec 19 19:51:37 2010 +0100
@@ -2557,12 +2557,21 @@
       <keyword name="SslCertificatesDialog (Constructor)" id="SslCertificatesDialog (Constructor)" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.__init__" />
       <keyword name="SslCertificatesDialog.__createCaCertificateEntry" id="SslCertificatesDialog.__createCaCertificateEntry" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.__createCaCertificateEntry" />
       <keyword name="SslCertificatesDialog.__createServerCertificateEntry" id="SslCertificatesDialog.__createServerCertificateEntry" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.__createServerCertificateEntry" />
+      <keyword name="SslCertificatesDialog.__exportCertificate" id="SslCertificatesDialog.__exportCertificate" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.__exportCertificate" />
+      <keyword name="SslCertificatesDialog.__getSystemCaCertificates" id="SslCertificatesDialog.__getSystemCaCertificates" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.__getSystemCaCertificates" />
+      <keyword name="SslCertificatesDialog.__importCertificate" id="SslCertificatesDialog.__importCertificate" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.__importCertificate" />
       <keyword name="SslCertificatesDialog.__populateCaCertificatesTree" id="SslCertificatesDialog.__populateCaCertificatesTree" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.__populateCaCertificatesTree" />
       <keyword name="SslCertificatesDialog.__populateServerCertificatesTree" id="SslCertificatesDialog.__populateServerCertificatesTree" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.__populateServerCertificatesTree" />
+      <keyword name="SslCertificatesDialog.__updateDefaultConfiguration" id="SslCertificatesDialog.__updateDefaultConfiguration" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.__updateDefaultConfiguration" />
       <keyword name="SslCertificatesDialog.on_caCertificatesTree_currentItemChanged" id="SslCertificatesDialog.on_caCertificatesTree_currentItemChanged" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_caCertificatesTree_currentItemChanged" />
+      <keyword name="SslCertificatesDialog.on_caDeleteButton_clicked" id="SslCertificatesDialog.on_caDeleteButton_clicked" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_caDeleteButton_clicked" />
+      <keyword name="SslCertificatesDialog.on_caExportButton_clicked" id="SslCertificatesDialog.on_caExportButton_clicked" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_caExportButton_clicked" />
+      <keyword name="SslCertificatesDialog.on_caImportButton_clicked" id="SslCertificatesDialog.on_caImportButton_clicked" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_caImportButton_clicked" />
       <keyword name="SslCertificatesDialog.on_caViewButton_clicked" id="SslCertificatesDialog.on_caViewButton_clicked" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_caViewButton_clicked" />
       <keyword name="SslCertificatesDialog.on_serversCertificatesTree_currentItemChanged" id="SslCertificatesDialog.on_serversCertificatesTree_currentItemChanged" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_serversCertificatesTree_currentItemChanged" />
       <keyword name="SslCertificatesDialog.on_serversDeleteButton_clicked" id="SslCertificatesDialog.on_serversDeleteButton_clicked" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_serversDeleteButton_clicked" />
+      <keyword name="SslCertificatesDialog.on_serversExportButton_clicked" id="SslCertificatesDialog.on_serversExportButton_clicked" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_serversExportButton_clicked" />
+      <keyword name="SslCertificatesDialog.on_serversImportButton_clicked" id="SslCertificatesDialog.on_serversImportButton_clicked" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_serversImportButton_clicked" />
       <keyword name="SslCertificatesDialog.on_serversViewButton_clicked" id="SslCertificatesDialog.on_serversViewButton_clicked" ref="eric5.Helpviewer.SslCertificatesDialog.html#SslCertificatesDialog.on_serversViewButton_clicked" />
       <keyword name="HelpTopicDialog (Module)" id="HelpTopicDialog (Module)" ref="eric5.Helpviewer.HelpTopicDialog.html" />
       <keyword name="HelpTopicDialog" id="HelpTopicDialog" ref="eric5.Helpviewer.HelpTopicDialog.html#HelpTopicDialog" />
@@ -6987,6 +6996,7 @@
       <keyword name="NetworkAccessManager (Constructor)" id="NetworkAccessManager (Constructor)" ref="eric5.Helpviewer.Network.NetworkAccessManager.html#NetworkAccessManager.__init__" />
       <keyword name="NetworkAccessManager.__authenticationRequired" id="NetworkAccessManager.__authenticationRequired" ref="eric5.Helpviewer.Network.NetworkAccessManager.html#NetworkAccessManager.__authenticationRequired" />
       <keyword name="NetworkAccessManager.__certToString" id="NetworkAccessManager.__certToString" ref="eric5.Helpviewer.Network.NetworkAccessManager.html#NetworkAccessManager.__certToString" />
+      <keyword name="NetworkAccessManager.__getSystemCaCertificates" id="NetworkAccessManager.__getSystemCaCertificates" ref="eric5.Helpviewer.Network.NetworkAccessManager.html#NetworkAccessManager.__getSystemCaCertificates" />
       <keyword name="NetworkAccessManager.__setDiskCache" id="NetworkAccessManager.__setDiskCache" ref="eric5.Helpviewer.Network.NetworkAccessManager.html#NetworkAccessManager.__setDiskCache" />
       <keyword name="NetworkAccessManager.__sslErrors" id="NetworkAccessManager.__sslErrors" ref="eric5.Helpviewer.Network.NetworkAccessManager.html#NetworkAccessManager.__sslErrors" />
       <keyword name="NetworkAccessManager.createRequest" id="NetworkAccessManager.createRequest" ref="eric5.Helpviewer.Network.NetworkAccessManager.html#NetworkAccessManager.createRequest" />
--- a/Documentation/Source/eric5.Helpviewer.Network.NetworkAccessManager.html	Sun Dec 19 15:26:00 2010 +0100
+++ b/Documentation/Source/eric5.Helpviewer.Network.NetworkAccessManager.html	Sun Dec 19 19:51:37 2010 +0100
@@ -69,6 +69,9 @@
 <td><a href="#NetworkAccessManager.__certToString">__certToString</a></td>
 <td>Private method to convert a certificate to a formatted string.</td>
 </tr><tr>
+<td><a href="#NetworkAccessManager.__getSystemCaCertificates">__getSystemCaCertificates</a></td>
+<td>Private method to get the list of system certificates.</td>
+</tr><tr>
 <td><a href="#NetworkAccessManager.__setDiskCache">__setDiskCache</a></td>
 <td>Private method to set the disk cache.</td>
 </tr><tr>
@@ -129,6 +132,16 @@
 <dd>
 formatted string (string)
 </dd>
+</dl><a NAME="NetworkAccessManager.__getSystemCaCertificates" ID="NetworkAccessManager.__getSystemCaCertificates"></a>
+<h4>NetworkAccessManager.__getSystemCaCertificates</h4>
+<b>__getSystemCaCertificates</b>(<i></i>)
+<p>
+        Private method to get the list of system certificates.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+list of system certificates (list of QSslCertificate)
+</dd>
 </dl><a NAME="NetworkAccessManager.__setDiskCache" ID="NetworkAccessManager.__setDiskCache"></a>
 <h4>NetworkAccessManager.__setDiskCache</h4>
 <b>__setDiskCache</b>(<i></i>)
--- a/Documentation/Source/eric5.Helpviewer.SslCertificatesDialog.html	Sun Dec 19 15:26:00 2010 +0100
+++ b/Documentation/Source/eric5.Helpviewer.SslCertificatesDialog.html	Sun Dec 19 19:51:37 2010 +0100
@@ -63,15 +63,36 @@
 <td><a href="#SslCertificatesDialog.__createServerCertificateEntry">__createServerCertificateEntry</a></td>
 <td>Private method to create a server certificate entry.</td>
 </tr><tr>
+<td><a href="#SslCertificatesDialog.__exportCertificate">__exportCertificate</a></td>
+<td>Private slot to export a certificate.</td>
+</tr><tr>
+<td><a href="#SslCertificatesDialog.__getSystemCaCertificates">__getSystemCaCertificates</a></td>
+<td>Private method to get the list of system certificates.</td>
+</tr><tr>
+<td><a href="#SslCertificatesDialog.__importCertificate">__importCertificate</a></td>
+<td>Private method to read a certificate.</td>
+</tr><tr>
 <td><a href="#SslCertificatesDialog.__populateCaCertificatesTree">__populateCaCertificatesTree</a></td>
 <td>Private slot to populate the CA certificates tree.</td>
 </tr><tr>
 <td><a href="#SslCertificatesDialog.__populateServerCertificatesTree">__populateServerCertificatesTree</a></td>
 <td>Private slot to populate the server certificates tree.</td>
 </tr><tr>
+<td><a href="#SslCertificatesDialog.__updateDefaultConfiguration">__updateDefaultConfiguration</a></td>
+<td>Private method to update the default SSL configuration.</td>
+</tr><tr>
 <td><a href="#SslCertificatesDialog.on_caCertificatesTree_currentItemChanged">on_caCertificatesTree_currentItemChanged</a></td>
 <td>Private slot handling a change of the current item in the CA certificates list.</td>
 </tr><tr>
+<td><a href="#SslCertificatesDialog.on_caDeleteButton_clicked">on_caDeleteButton_clicked</a></td>
+<td>Private slot to delete the selected CA certificate.</td>
+</tr><tr>
+<td><a href="#SslCertificatesDialog.on_caExportButton_clicked">on_caExportButton_clicked</a></td>
+<td>Private slot to export the selected CA certificate.</td>
+</tr><tr>
+<td><a href="#SslCertificatesDialog.on_caImportButton_clicked">on_caImportButton_clicked</a></td>
+<td>Private slot to import server certificates.</td>
+</tr><tr>
 <td><a href="#SslCertificatesDialog.on_caViewButton_clicked">on_caViewButton_clicked</a></td>
 <td>Private slot to show data of the selected CA certificate.</td>
 </tr><tr>
@@ -81,6 +102,12 @@
 <td><a href="#SslCertificatesDialog.on_serversDeleteButton_clicked">on_serversDeleteButton_clicked</a></td>
 <td>Private slot to delete the selected server certificate.</td>
 </tr><tr>
+<td><a href="#SslCertificatesDialog.on_serversExportButton_clicked">on_serversExportButton_clicked</a></td>
+<td>Private slot to export the selected server certificate.</td>
+</tr><tr>
+<td><a href="#SslCertificatesDialog.on_serversImportButton_clicked">on_serversImportButton_clicked</a></td>
+<td>Private slot to import server certificates.</td>
+</tr><tr>
 <td><a href="#SslCertificatesDialog.on_serversViewButton_clicked">on_serversViewButton_clicked</a></td>
 <td>Private slot to show data of the selected server certificate.</td>
 </tr>
@@ -118,6 +145,39 @@
 <dd>
 certificate to insert (QSslCertificate)
 </dd>
+</dl><a NAME="SslCertificatesDialog.__exportCertificate" ID="SslCertificatesDialog.__exportCertificate"></a>
+<h4>SslCertificatesDialog.__exportCertificate</h4>
+<b>__exportCertificate</b>(<i>name, cert</i>)
+<p>
+        Private slot to export a certificate.
+</p><dl>
+<dt><i>name</i></dt>
+<dd>
+default file name without extension (string)
+</dd><dt><i>cert</i></dt>
+<dd>
+certificate to be exported (QSslCertificate)
+</dd>
+</dl><a NAME="SslCertificatesDialog.__getSystemCaCertificates" ID="SslCertificatesDialog.__getSystemCaCertificates"></a>
+<h4>SslCertificatesDialog.__getSystemCaCertificates</h4>
+<b>__getSystemCaCertificates</b>(<i></i>)
+<p>
+        Private method to get the list of system certificates.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+list of system certificates (list of QSslCertificate)
+</dd>
+</dl><a NAME="SslCertificatesDialog.__importCertificate" ID="SslCertificatesDialog.__importCertificate"></a>
+<h4>SslCertificatesDialog.__importCertificate</h4>
+<b>__importCertificate</b>(<i></i>)
+<p>
+        Private method to read a certificate.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+certificates read (list of QSslCertificate)
+</dd>
 </dl><a NAME="SslCertificatesDialog.__populateCaCertificatesTree" ID="SslCertificatesDialog.__populateCaCertificatesTree"></a>
 <h4>SslCertificatesDialog.__populateCaCertificatesTree</h4>
 <b>__populateCaCertificatesTree</b>(<i></i>)
@@ -128,6 +188,11 @@
 <b>__populateServerCertificatesTree</b>(<i></i>)
 <p>
         Private slot to populate the server certificates tree.
+</p><a NAME="SslCertificatesDialog.__updateDefaultConfiguration" ID="SslCertificatesDialog.__updateDefaultConfiguration"></a>
+<h4>SslCertificatesDialog.__updateDefaultConfiguration</h4>
+<b>__updateDefaultConfiguration</b>(<i></i>)
+<p>
+        Private method to update the default SSL configuration.
 </p><a NAME="SslCertificatesDialog.on_caCertificatesTree_currentItemChanged" ID="SslCertificatesDialog.on_caCertificatesTree_currentItemChanged"></a>
 <h4>SslCertificatesDialog.on_caCertificatesTree_currentItemChanged</h4>
 <b>on_caCertificatesTree_currentItemChanged</b>(<i>current, previous</i>)
@@ -142,7 +207,22 @@
 <dd>
 previous current item (QTreeWidgetItem)
 </dd>
-</dl><a NAME="SslCertificatesDialog.on_caViewButton_clicked" ID="SslCertificatesDialog.on_caViewButton_clicked"></a>
+</dl><a NAME="SslCertificatesDialog.on_caDeleteButton_clicked" ID="SslCertificatesDialog.on_caDeleteButton_clicked"></a>
+<h4>SslCertificatesDialog.on_caDeleteButton_clicked</h4>
+<b>on_caDeleteButton_clicked</b>(<i></i>)
+<p>
+        Private slot to delete the selected CA certificate.
+</p><a NAME="SslCertificatesDialog.on_caExportButton_clicked" ID="SslCertificatesDialog.on_caExportButton_clicked"></a>
+<h4>SslCertificatesDialog.on_caExportButton_clicked</h4>
+<b>on_caExportButton_clicked</b>(<i></i>)
+<p>
+        Private slot to export the selected CA certificate.
+</p><a NAME="SslCertificatesDialog.on_caImportButton_clicked" ID="SslCertificatesDialog.on_caImportButton_clicked"></a>
+<h4>SslCertificatesDialog.on_caImportButton_clicked</h4>
+<b>on_caImportButton_clicked</b>(<i></i>)
+<p>
+        Private slot to import server certificates.
+</p><a NAME="SslCertificatesDialog.on_caViewButton_clicked" ID="SslCertificatesDialog.on_caViewButton_clicked"></a>
 <h4>SslCertificatesDialog.on_caViewButton_clicked</h4>
 <b>on_caViewButton_clicked</b>(<i></i>)
 <p>
@@ -166,6 +246,16 @@
 <b>on_serversDeleteButton_clicked</b>(<i></i>)
 <p>
         Private slot to delete the selected server certificate.
+</p><a NAME="SslCertificatesDialog.on_serversExportButton_clicked" ID="SslCertificatesDialog.on_serversExportButton_clicked"></a>
+<h4>SslCertificatesDialog.on_serversExportButton_clicked</h4>
+<b>on_serversExportButton_clicked</b>(<i></i>)
+<p>
+        Private slot to export the selected server certificate.
+</p><a NAME="SslCertificatesDialog.on_serversImportButton_clicked" ID="SslCertificatesDialog.on_serversImportButton_clicked"></a>
+<h4>SslCertificatesDialog.on_serversImportButton_clicked</h4>
+<b>on_serversImportButton_clicked</b>(<i></i>)
+<p>
+        Private slot to import server certificates.
 </p><a NAME="SslCertificatesDialog.on_serversViewButton_clicked" ID="SslCertificatesDialog.on_serversViewButton_clicked"></a>
 <h4>SslCertificatesDialog.on_serversViewButton_clicked</h4>
 <b>on_serversViewButton_clicked</b>(<i></i>)
--- a/Helpviewer/Network/NetworkAccessManager.py	Sun Dec 19 15:26:00 2010 +0100
+++ b/Helpviewer/Network/NetworkAccessManager.py	Sun Dec 19 19:51:37 2010 +0100
@@ -72,14 +72,14 @@
         self.languagesChanged()
         
         if SSL_AVAILABLE:
-            sslCfg = QSslConfiguration.defaultConfiguration()
-            caList = sslCfg.caCertificates()
+            caList = self.__getSystemCaCertificates()
             certificateDict = Preferences.toDict(
                     Preferences.Prefs.settings.value("Help/CaCertificatesDict"))
             for server in certificateDict:
                 for cert in QSslCertificate.fromData(certificateDict[server]):
                     if cert not in caList:
                         caList.append(cert)
+            sslCfg = QSslConfiguration.defaultConfiguration()
             sslCfg.setCaCertificates(caList)
             QSslConfiguration.setDefaultConfiguration(sslCfg)
             
@@ -300,6 +300,18 @@
         
         return result
     
+    def __getSystemCaCertificates(self):
+        """
+        Private method to get the list of system certificates.
+        
+        @return list of system certificates (list of QSslCertificate)
+        """
+        caList = QSslCertificate.fromData(Preferences.toByteArray(
+            Preferences.Prefs.settings.value("Help/SystemCertificates")))
+        if not caList:
+            caList = QSslSocket.systemCaCertificates()
+        return caList
+    
     def preferencesChanged(self):
         """
         Public slot to signal a change of preferences.
--- a/Helpviewer/SslCertificatesDialog.py	Sun Dec 19 15:26:00 2010 +0100
+++ b/Helpviewer/SslCertificatesDialog.py	Sun Dec 19 19:51:37 2010 +0100
@@ -7,10 +7,10 @@
 Module implementing a dialog to show and edit all certificates.
 """
 
-from PyQt4.QtCore import pyqtSlot, Qt
-from PyQt4.QtGui import QDialog, QTreeWidgetItem
+from PyQt4.QtCore import pyqtSlot, Qt, QByteArray, QFile, QFileInfo, QIODevice
+from PyQt4.QtGui import QDialog, QTreeWidgetItem, QFileDialog
 try:
-    from PyQt4.QtNetwork import QSslCertificate, QSslSocket, QSslConfiguration
+    from PyQt4.QtNetwork import QSslCertificate, QSslSocket, QSslConfiguration, QSsl
 except ImportError:
     pass
 
@@ -96,6 +96,7 @@
         enable = current is not None and current.parent() is not None
         self.serversViewButton.setEnabled(enable)
         self.serversDeleteButton.setEnabled(enable)
+        self.serversExportButton.setEnabled(enable)
     
     @pyqtSlot()
     def on_serversViewButton_clicked(self):
@@ -122,6 +123,7 @@
                 .format(itm.text(0)))
         if res:
             server = itm.text(1)
+            cert = self.serversCertificatesTree.currentItem().data(0, self.CertRole)
             
             # delete the selected entry and it's parent entry, if it was the only one
             parent = itm.parent()
@@ -133,29 +135,102 @@
             # delete the certificate from the user certificate store
             certificateDict = Preferences.toDict(
                     Preferences.Prefs.settings.value("Help/CaCertificatesDict"))
-            del certificateDict[server]
+            if server in certificateDict:
+                certs = QSslCertificate.fromData(certificateDict[server])
+                if cert in certs:
+                    certs.remove(cert)
+                if certs:
+                    pems = QByteArray()
+                    for cert in certs:
+                        pems.append(cert.toPem() + '\n')
+                    certificateDict[server] = pems
+                else:
+                    del certificateDict[server]
             Preferences.Prefs.settings.setValue("Help/CaCertificatesDict", 
                 certificateDict)
             
             # delete the certificate from the default certificates
-            caNew = []
-            for topLevelIndex in range(self.serversCertificatesTree.topLevelItemCount()):
-                parent = self.serversCertificatesTree.topLevelItem(topLevelIndex)
-                for childIndex in range(parent.childCount()):
-                    cert = parent.child(childIndex).data(0, self.CertRole)
-                    if cert not in caNew:
-                        caNew.append(cert)
+            self.__updateDefaultConfiguration()
+    
+    @pyqtSlot()
+    def on_serversImportButton_clicked(self):
+        """
+        Private slot to import server certificates.
+        """
+        certs = self.__importCertificate()
+        if certs:
+            server = "*"
+            certificateDict = Preferences.toDict(
+                Preferences.Prefs.settings.value("Help/CaCertificatesDict"))
+            if server in certificateDict:
+                sCerts = QSslCertificate.fromData(certificateDict[server])
+            else:
+                sCerts = []
+            
+            pems = QByteArray()
+            for cert in certs:
+                if cert in sCerts:
+                    E5MessageBox.warning(self,
+                        self.trUtf8("Import Certificate"),
+                        self.trUtf8("""<p>The certificate <b>{0}</b> already exists."""
+                                    """ Skipping.</p>""")
+                            .format(Utilities.decodeString(
+                                cert.subjectInfo(QSslCertificate.CommonName))))
+                else:
+                    pems.append(cert.toPem() + '\n')
+            if server not in certificateDict:
+                certificateDict[server] = QByteArray()
+            certificateDict[server].append(pems)
+            Preferences.Prefs.settings.setValue("Help/CaCertificatesDict", 
+                certificateDict)
+            
+            self.serversCertificatesTree.clear()
+            self.__populateServerCertificatesTree()
+            
+            self.__updateDefaultConfiguration()
+    
+    @pyqtSlot()
+    def on_serversExportButton_clicked(self):
+        """
+        Private slot to export the selected server certificate.
+        """
+        cert = self.serversCertificatesTree.currentItem().data(0, self.CertRole)
+        fname = self.serversCertificatesTree.currentItem().text(0)\
+            .replace(" ", "").replace("\t", "")
+        self.__exportCertificate(fname, cert)
+    
+    def __updateDefaultConfiguration(self):
+        """
+        Private method to update the default SSL configuration.
+        """
+        caList = self.__getSystemCaCertificates()
+        certificateDict = Preferences.toDict(
+                Preferences.Prefs.settings.value("Help/CaCertificatesDict"))
+        for server in certificateDict:
+            for cert in QSslCertificate.fromData(certificateDict[server]):
+                if cert not in caList:
+                    caList.append(cert)
+        sslCfg = QSslConfiguration.defaultConfiguration()
+        sslCfg.setCaCertificates(caList)
+        QSslConfiguration.setDefaultConfiguration(sslCfg)
+    
+    def __getSystemCaCertificates(self):
+        """
+        Private method to get the list of system certificates.
+        
+        @return list of system certificates (list of QSslCertificate)
+        """
+        caList = QSslCertificate.fromData(Preferences.toByteArray(
+            Preferences.Prefs.settings.value("Help/SystemCertificates")))
+        if not caList:
             caList = QSslSocket.systemCaCertificates()
-            caList.extend(caNew)
-            sslCfg = QSslConfiguration.defaultConfiguration()
-            sslCfg.setCaCertificates(caList)
-            QSslConfiguration.setDefaultConfiguration(sslCfg)
+        return caList
     
     def __populateCaCertificatesTree(self):
         """
         Private slot to populate the CA certificates tree.
         """
-        for cert in QSslSocket.systemCaCertificates():
+        for cert in self.__getSystemCaCertificates():
             self.__createCaCertificateEntry(cert)
         
         self.caCertificatesTree.expandAll()
@@ -202,6 +277,8 @@
         """
         enable = current is not None and current.parent() is not None
         self.caViewButton.setEnabled(enable)
+        self.caDeleteButton.setEnabled(enable)
+        self.caExportButton.setEnabled(enable)
     
     @pyqtSlot()
     def on_caViewButton_clicked(self):
@@ -211,3 +288,163 @@
         cert = self.caCertificatesTree.currentItem().data(0, self.CertRole)
         dlg = SslInfoDialog(cert, self)
         dlg.exec_()
+    
+    @pyqtSlot()
+    def on_caDeleteButton_clicked(self):
+        """
+        Private slot to delete the selected CA certificate.
+        """
+        itm = self.caCertificatesTree.currentItem()
+        res = E5MessageBox.yesNo(self,
+            self.trUtf8("Delete CA Certificate"),
+            self.trUtf8("""<p>Shall the CA certificate really be deleted?</p>"""
+                        """<p>{0}</p>"""
+                        """<p>If the CA certificate is deleted, the browser"""
+                        """ will not trust any certificate issued by this CA.</p>""")\
+                .format(itm.text(0)))
+        if res:
+            cert = self.caCertificatesTree.currentItem().data(0, self.CertRole)
+            
+            # delete the selected entry and it's parent entry, if it was the only one
+            parent = itm.parent()
+            parent.takeChild(parent.indexOfChild(itm))
+            if parent.childCount() == 0:
+                self.caCertificatesTree.takeTopLevelItem(
+                    self.caCertificatesTree.indexOfTopLevelItem(parent))
+            
+            # delete the certificate from the CA certificate store
+            caCerts = self.__getSystemCaCertificates()
+            if cert in caCerts:
+                caCerts.remove(cert)
+            pems = QByteArray()
+            for cert in caCerts:
+                pems.append(cert.toPem() + '\n')
+            Preferences.Prefs.settings.setValue("Help/SystemCertificates", pems)
+            
+            # delete the certificate from the default certificates
+            self.__updateDefaultConfiguration()
+    
+    @pyqtSlot()
+    def on_caImportButton_clicked(self):
+        """
+        Private slot to import server certificates.
+        """
+        certs = self.__importCertificate()
+        if certs:
+            caCerts = self.__getSystemCaCertificates()
+            for cert in certs:
+                if cert in caCerts:
+                    E5MessageBox.warning(self,
+                        self.trUtf8("Import Certificate"),
+                        self.trUtf8("""<p>The certificate <b>{0}</b> already exists."""
+                                    """ Skipping.</p>""")
+                            .format(Utilities.decodeString(
+                                cert.subjectInfo(QSslCertificate.CommonName))))
+                else:
+                    caCerts.append(cert)
+            
+            pems = QByteArray()
+            for cert in caCerts:
+                pems.append(cert.toPem() + '\n')
+            Preferences.Prefs.settings.setValue("Help/SystemCertificates", pems)
+            
+            self.caCertificatesTree.clear()
+            self.__populateCaCertificatesTree()
+            
+            self.__updateDefaultConfiguration()
+    
+    @pyqtSlot()
+    def on_caExportButton_clicked(self):
+        """
+        Private slot to export the selected CA certificate.
+        """
+        cert = self.caCertificatesTree.currentItem().data(0, self.CertRole)
+        fname = self.caCertificatesTree.currentItem().text(0)\
+            .replace(" ", "").replace("\t", "")
+        self.__exportCertificate(fname, cert)
+    
+    def __exportCertificate(self, name, cert):
+        """
+        Private slot to export a certificate.
+        
+        @param name default file name without extension (string)
+        @param cert certificate to be exported (QSslCertificate)
+        """
+        if cert is not None:
+            fname, selectedFilter = QFileDialog.getSaveFileNameAndFilter(
+                self,
+                self.trUtf8("Export Certificate"),
+                name,
+                self.trUtf8("Certificate File (PEM) (*.pem);;"
+                            "Certificate File (DER) (*.der)"),
+                None,
+                QFileDialog.Options(QFileDialog.DontConfirmOverwrite))
+            
+            if fname:
+                ext = QFileInfo(fname).suffix()
+                if not ext or ext not in ["pem", "der"]:
+                    ex = selectedFilter.split("(*")[1].split(")")[0]
+                    if ex:
+                        fname += ex
+                if QFileInfo(fname).exists():
+                    res = E5MessageBox.yesNo(self,
+                        self.trUtf8("Export Certificate"),
+                        self.trUtf8("<p>The file <b>{0}</b> already exists."
+                                    " Overwrite it?</p>").format(fname),
+                        icon = E5MessageBox.Warning)
+                    if not res:
+                        return
+                
+                f = QFile(fname)
+                if not f.open(QIODevice.WriteOnly):
+                    E5MessageBox.critical(self,
+                        self.trUtf8("Export Certificate"),
+                        self.trUtf8("""<p>The certificate could not be written to file"""
+                                    """ <b>{0}</b></p><p>Error: {1}</p>""")
+                            .format(fname, f.errorString()))
+                    return
+                
+                if fname.endswith(".pem"):
+                    crt = cert.toPem()
+                else:
+                    crt = cert.toDer()
+                f.write(crt)
+                f.close()
+    
+    def __importCertificate(self):
+        """
+        Private method to read a certificate.
+        
+        @return certificates read (list of QSslCertificate)
+        """
+        fname, selectedFilter = QFileDialog.getOpenFileNameAndFilter(
+            self,
+            self.trUtf8("Import Certificate"),
+            "",
+            self.trUtf8("Certificate Files (*.pem *.crt *.der *.cer *.ca);;"
+                        "All Files (*)"),
+            None)
+        
+        if fname:
+            f = QFile(fname)
+            if not f.open(QIODevice.ReadOnly):
+                E5MessageBox.critical(self,
+                    self.trUtf8("Export Certificate"),
+                    self.trUtf8("""<p>The certificate could not be read from file"""
+                                """ <b>{0}</b></p><p>Error: {1}</p>""")
+                        .format(fname, f.errorString()))
+                return []
+            
+            crt = f.readAll()
+            f.close()
+            cert = QSslCertificate.fromData(crt, QSsl.Pem)
+            if not cert:
+                cert = QSslCertificate.fromData(crt, QSsl.Der)
+##            if fname.endswith((".pem", ".crt")):
+##                cert = QSslCertificate.fromData(crt, QSsl.Pem)
+##            elif fname.endswith((".der", ".cer", ".ca")):
+##                cert = QSslCertificate.fromData(crt, QSsl.Der)
+            
+            return cert
+        
+        return []
--- a/Helpviewer/SslCertificatesDialog.ui	Sun Dec 19 15:26:00 2010 +0100
+++ b/Helpviewer/SslCertificatesDialog.ui	Sun Dec 19 19:51:37 2010 +0100
@@ -18,7 +18,7 @@
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
-    <widget class="QTabWidget" name="tabWidget">
+    <widget class="QTabWidget" name="certificatesWidget">
      <property name="currentIndex">
       <number>0</number>
      </property>
@@ -69,6 +69,29 @@
           </widget>
          </item>
          <item>
+          <widget class="QPushButton" name="serversImportButton">
+           <property name="toolTip">
+            <string>Press to import a certificate</string>
+           </property>
+           <property name="text">
+            <string>&amp;Import...</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="serversExportButton">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="toolTip">
+            <string>Press to export the selected certificate</string>
+           </property>
+           <property name="text">
+            <string>&amp;Export...</string>
+           </property>
+          </widget>
+         </item>
+         <item>
           <widget class="QPushButton" name="serversDeleteButton">
            <property name="enabled">
             <bool>false</bool>
@@ -140,6 +163,42 @@
           </widget>
          </item>
          <item>
+          <widget class="QPushButton" name="caImportButton">
+           <property name="toolTip">
+            <string>Press to import a certificate</string>
+           </property>
+           <property name="text">
+            <string>&amp;Import...</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="caExportButton">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="toolTip">
+            <string>Press to export the selected certificate</string>
+           </property>
+           <property name="text">
+            <string>&amp;Export...</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="caDeleteButton">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="toolTip">
+            <string>Press to delete the selected certificate</string>
+           </property>
+           <property name="text">
+            <string>&amp;Delete...</string>
+           </property>
+          </widget>
+         </item>
+         <item>
           <spacer name="horizontalSpacer_2">
            <property name="orientation">
             <enum>Qt::Horizontal</enum>
@@ -171,12 +230,17 @@
   </layout>
  </widget>
  <tabstops>
-  <tabstop>tabWidget</tabstop>
+  <tabstop>certificatesWidget</tabstop>
   <tabstop>serversCertificatesTree</tabstop>
   <tabstop>serversViewButton</tabstop>
+  <tabstop>serversImportButton</tabstop>
+  <tabstop>serversExportButton</tabstop>
   <tabstop>serversDeleteButton</tabstop>
   <tabstop>caCertificatesTree</tabstop>
   <tabstop>caViewButton</tabstop>
+  <tabstop>caImportButton</tabstop>
+  <tabstop>caExportButton</tabstop>
+  <tabstop>caDeleteButton</tabstop>
   <tabstop>buttonBox</tabstop>
  </tabstops>
  <resources/>
--- a/i18n/eric5_cs.ts	Sun Dec 19 15:26:00 2010 +0100
+++ b/i18n/eric5_cs.ts	Sun Dec 19 19:51:37 2010 +0100
@@ -4181,12 +4181,14 @@
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="956"/>
-        <source>The program has terminated with an exit status of {0}.</source>
+        <source>The program has terminated with an exit status of {0}.
+</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="960"/>
-        <source>&quot;{0}&quot; has terminated with an exit status of {1}.</source>
+        <source>&quot;{0}&quot; has terminated with an exit status of {1}.
+</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -30074,7 +30076,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="117"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="140"/>
         <source>Certificate name</source>
         <translation type="unfinished"></translation>
     </message>
@@ -30084,60 +30086,130 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="122"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="145"/>
         <source>Expiry Date</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="135"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="138"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="161"/>
         <source>&amp;View...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="77"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="194"/>
         <source>Press to delete the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="80"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="197"/>
         <source>&amp;Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="103"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="126"/>
         <source>Certificate &amp;Authorities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="109"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="132"/>
         <source>You have saved certificates identifying these certification authorities:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="176"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="251"/>
         <source>(Unknown)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="180"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="255"/>
         <source>(Unknown common name)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>Delete Server Certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>&lt;p&gt;Shall the server certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the server certificate is deleted, the normal security checks will be reinstantiated and the server has to present a valid certificate.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="168"/>
+        <source>Press to import a certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="171"/>
+        <source>&amp;Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="181"/>
+        <source>Press to export the selected certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="184"/>
+        <source>&amp;Export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Import Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="337"/>
+        <source>&lt;p&gt;The certificate &lt;b&gt;{0}&lt;/b&gt; already exists. Skipping.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>Delete CA Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>&lt;p&gt;Shall the CA certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the CA certificate is deleted, the browser will not trust any certificate issued by this CA.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>Export Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="374"/>
+        <source>Certificate File (PEM) (*.pem);;Certificate File (DER) (*.der)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="390"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished">&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; již existuje.&lt;/p&gt;&lt;p&gt;Má se přepsat?&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="400"/>
+        <source>&lt;p&gt;The certificate could not be written to file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Certificate Files (*.pem *.crt *.der *.cer *.ca);;All Files (*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>&lt;p&gt;The certificate could not be read from file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>SslInfoDialog</name>
Binary file i18n/eric5_de.qm has changed
--- a/i18n/eric5_de.ts	Sun Dec 19 15:26:00 2010 +0100
+++ b/i18n/eric5_de.ts	Sun Dec 19 19:51:37 2010 +0100
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.0" language="de">
+<!DOCTYPE TS><TS version="1.1" language="de">
 <context>
     <name>AboutDialog</name>
     <message>
@@ -1578,8 +1577,8 @@
     </message>
     <message>
         <location filename="Helpviewer/Bookmarks/BookmarksMenu.py" line="139"/>
-        <source>Open in New &amp;Tab	Ctrl+LMB</source>
-        <translation>In neuem &amp;Register öffnen	Strg+LMK</translation>
+        <source>Open in New &amp;Tab<byte value="x9"/>Ctrl+LMB</source>
+        <translation>In neuem &amp;Register öffnen<byte value="x9"/>Strg+LMK</translation>
     </message>
     <message>
         <location filename="Helpviewer/Bookmarks/BookmarksMenu.py" line="145"/>
@@ -1629,7 +1628,7 @@
     </message>
     <message>
         <location filename="Helpviewer/Bookmarks/BookmarksToolBar.py" line="72"/>
-        <source>Open in New &amp;Tab	Ctrl+LMB</source>
+        <source>Open in New &amp;Tab<byte value="x9"/>Ctrl+LMB</source>
         <translation>In neuem &amp;Register öffnen\tStrg+LMK</translation>
     </message>
 </context>
@@ -4178,13 +4177,17 @@
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="956"/>
-        <source>The program has terminated with an exit status of {0}.</source>
-        <translation>Das Programm wurde mit dem Status {0} beendet.</translation>
+        <source>The program has terminated with an exit status of {0}.
+</source>
+        <translation>Das Programm wurde mit dem Status {0} beendet.
+</translation>
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="960"/>
-        <source>&quot;{0}&quot; has terminated with an exit status of {1}.</source>
-        <translation>&quot;{0}&quot; wurde mit dem Status {1} beendet.</translation>
+        <source>&quot;{0}&quot; has terminated with an exit status of {1}.
+</source>
+        <translation>&quot;{0}&quot; wurde mit dem Status {1} beendet.
+</translation>
     </message>
 </context>
 <context>
@@ -11880,7 +11883,7 @@
     </message>
     <message>
         <location filename="Helpviewer/HelpBrowserWV.py" line="778"/>
-        <source>Open Link in New Tab	Ctrl+LMB</source>
+        <source>Open Link in New Tab<byte value="x9"/>Ctrl+LMB</source>
         <translation>Link in neuem Fenster öffnen\tStrg+LMK</translation>
     </message>
     <message>
@@ -29719,7 +29722,7 @@
         <translation>Sie habe Zertifikate für diese Server gespeichert:</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="117"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="140"/>
         <source>Certificate name</source>
         <translation>Zertifikatname</translation>
     </message>
@@ -29729,60 +29732,130 @@
         <translation>Server</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="122"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="145"/>
         <source>Expiry Date</source>
         <translation>Läuft ab am</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="135"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
         <translation>Drücken, um das ausgewählte Zertifikat anzusehen</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="138"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="161"/>
         <source>&amp;View...</source>
         <translation>&amp;Ansehen...</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="77"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="194"/>
         <source>Press to delete the selected certificate</source>
         <translation>Drücken, um das ausgewählte Zertifikat zu löschen</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="80"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="197"/>
         <source>&amp;Delete...</source>
         <translation>&amp;Löschen...</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="103"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="126"/>
         <source>Certificate &amp;Authorities</source>
         <translation>&amp;Zertifizierungsstellen</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="109"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="132"/>
         <source>You have saved certificates identifying these certification authorities:</source>
         <translation>Sie habe Zertifikate für diese Zertifizierungsstellen gespeichert:</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="176"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="251"/>
         <source>(Unknown)</source>
         <translation>(Unbekannt)</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="180"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="255"/>
         <source>(Unknown common name)</source>
         <translation>(Unbekannter allgemeiner Name)</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>Delete Server Certificate</source>
         <translation>Serverzertifikat löschen</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>&lt;p&gt;Shall the server certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the server certificate is deleted, the normal security checks will be reinstantiated and the server has to present a valid certificate.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soll das Serverzertifikat wirklich gelöscht werden?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;Wenn das Serverzertifikat gelöscht wird, werden die normalen Sicherheitsprüfungen reaktiviert und der Server muss ein gültiges Zertifikat vorweisen.&lt;/p&gt;</translation>
     </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="168"/>
+        <source>Press to import a certificate</source>
+        <translation>Drücken, um ein Zertifikat zu importieren</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="171"/>
+        <source>&amp;Import...</source>
+        <translation>&amp;Importieren...</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="181"/>
+        <source>Press to export the selected certificate</source>
+        <translation>Drücken, um das ausgewählte Zertifikat zu exportieren</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="184"/>
+        <source>&amp;Export...</source>
+        <translation>&amp;Exportieren...</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Import Certificate</source>
+        <translation>Zertifikat importieren</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="337"/>
+        <source>&lt;p&gt;The certificate &lt;b&gt;{0}&lt;/b&gt; already exists. Skipping.&lt;/p&gt;</source>
+        <translation>&lt;p&gt;Das Zertifikat &lt;b&gt;{0}&lt;/b&gt; existiert bereits. Überspringe es.&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>Delete CA Certificate</source>
+        <translation>Zertifikat einer Zertifizierungsstelle löschen</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>&lt;p&gt;Shall the CA certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the CA certificate is deleted, the browser will not trust any certificate issued by this CA.&lt;/p&gt;</source>
+        <translation>&lt;p&gt;Soll das Zertifikat der Zertifizierungsstelle wirklich gelöscht werden?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;Wenn das Zertifikat einer Zertifizierungsstelle gelöscht wird, vertraut der browser keinem Zertifikat, das von dieser Zertifizierungsstelle herausgegeben wurde.&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>Export Certificate</source>
+        <translation>Zertifikat exportieren</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="374"/>
+        <source>Certificate File (PEM) (*.pem);;Certificate File (DER) (*.der)</source>
+        <translation>Zertifikat Datei (PEM) (*.pem);;Zertifikat Datei (DER) (*.der)</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="390"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation>&lt;p&gt;Die Datei &lt;b&gt;{0}&lt;/b&gt; existiert bereits. Überschreiben?&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="400"/>
+        <source>&lt;p&gt;The certificate could not be written to file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation>&lt;p&gt;Das Zertifikat konnte nicht in die Datei &lt;b&gt;{0}&lt;/b&gt; geschrieben werden.&lt;/p&gt;&lt;p&gt;Fehler: {1}&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Certificate Files (*.pem *.crt *.der *.cer *.ca);;All Files (*)</source>
+        <translation>Zertifikat Dateien (*.pem *.crt *.der *.cer *.ca);;Alle Dateien (*)</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>&lt;p&gt;The certificate could not be read from file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation>&lt;p&gt;Das Zertifikat konnte nicht aus der Datei &lt;b&gt;{0}&lt;/b&gt; gelesen werden.&lt;/p&gt;&lt;p&gt;Fehler: {1}&lt;/p&gt;</translation>
+    </message>
 </context>
 <context>
     <name>SslInfoDialog</name>
--- a/i18n/eric5_en.ts	Sun Dec 19 15:26:00 2010 +0100
+++ b/i18n/eric5_en.ts	Sun Dec 19 19:51:37 2010 +0100
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.0" language="en">
+<!DOCTYPE TS><TS version="1.1" language="en">
 <context>
     <name>AboutDialog</name>
     <message>
@@ -1550,7 +1549,7 @@
     </message>
     <message>
         <location filename="Helpviewer/Bookmarks/BookmarksMenu.py" line="139"/>
-        <source>Open in New &amp;Tab	Ctrl+LMB</source>
+        <source>Open in New &amp;Tab<byte value="x9"/>Ctrl+LMB</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1586,7 +1585,7 @@
     </message>
     <message>
         <location filename="Helpviewer/Bookmarks/BookmarksToolBar.py" line="72"/>
-        <source>Open in New &amp;Tab	Ctrl+LMB</source>
+        <source>Open in New &amp;Tab<byte value="x9"/>Ctrl+LMB</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -4139,12 +4138,14 @@
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="956"/>
-        <source>The program has terminated with an exit status of {0}.</source>
+        <source>The program has terminated with an exit status of {0}.
+</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="960"/>
-        <source>&quot;{0}&quot; has terminated with an exit status of {1}.</source>
+        <source>&quot;{0}&quot; has terminated with an exit status of {1}.
+</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -11822,7 +11823,7 @@
     </message>
     <message>
         <location filename="Helpviewer/HelpBrowserWV.py" line="778"/>
-        <source>Open Link in New Tab	Ctrl+LMB</source>
+        <source>Open Link in New Tab<byte value="x9"/>Ctrl+LMB</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -29480,7 +29481,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="117"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="140"/>
         <source>Certificate name</source>
         <translation type="unfinished"></translation>
     </message>
@@ -29490,60 +29491,130 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="122"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="145"/>
         <source>Expiry Date</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="135"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="138"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="161"/>
         <source>&amp;View...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="77"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="194"/>
         <source>Press to delete the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="80"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="197"/>
         <source>&amp;Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="103"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="126"/>
         <source>Certificate &amp;Authorities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="109"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="132"/>
         <source>You have saved certificates identifying these certification authorities:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="176"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="251"/>
         <source>(Unknown)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="180"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="255"/>
         <source>(Unknown common name)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>Delete Server Certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>&lt;p&gt;Shall the server certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the server certificate is deleted, the normal security checks will be reinstantiated and the server has to present a valid certificate.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="168"/>
+        <source>Press to import a certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="171"/>
+        <source>&amp;Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="181"/>
+        <source>Press to export the selected certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="184"/>
+        <source>&amp;Export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Import Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="337"/>
+        <source>&lt;p&gt;The certificate &lt;b&gt;{0}&lt;/b&gt; already exists. Skipping.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>Delete CA Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>&lt;p&gt;Shall the CA certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the CA certificate is deleted, the browser will not trust any certificate issued by this CA.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>Export Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="374"/>
+        <source>Certificate File (PEM) (*.pem);;Certificate File (DER) (*.der)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="390"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="400"/>
+        <source>&lt;p&gt;The certificate could not be written to file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Certificate Files (*.pem *.crt *.der *.cer *.ca);;All Files (*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>&lt;p&gt;The certificate could not be read from file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>SslInfoDialog</name>
--- a/i18n/eric5_es.ts	Sun Dec 19 15:26:00 2010 +0100
+++ b/i18n/eric5_es.ts	Sun Dec 19 19:51:37 2010 +0100
@@ -4175,12 +4175,14 @@
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="956"/>
-        <source>The program has terminated with an exit status of {0}.</source>
+        <source>The program has terminated with an exit status of {0}.
+</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="960"/>
-        <source>&quot;{0}&quot; has terminated with an exit status of {1}.</source>
+        <source>&quot;{0}&quot; has terminated with an exit status of {1}.
+</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -29692,7 +29694,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="117"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="140"/>
         <source>Certificate name</source>
         <translation type="unfinished"></translation>
     </message>
@@ -29702,60 +29704,130 @@
         <translation type="unfinished">Servidor</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="122"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="145"/>
         <source>Expiry Date</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="135"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="138"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="161"/>
         <source>&amp;View...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="77"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="194"/>
         <source>Press to delete the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="80"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="197"/>
         <source>&amp;Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="103"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="126"/>
         <source>Certificate &amp;Authorities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="109"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="132"/>
         <source>You have saved certificates identifying these certification authorities:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="176"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="251"/>
         <source>(Unknown)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="180"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="255"/>
         <source>(Unknown common name)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>Delete Server Certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>&lt;p&gt;Shall the server certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the server certificate is deleted, the normal security checks will be reinstantiated and the server has to present a valid certificate.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="168"/>
+        <source>Press to import a certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="171"/>
+        <source>&amp;Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="181"/>
+        <source>Press to export the selected certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="184"/>
+        <source>&amp;Export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Import Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="337"/>
+        <source>&lt;p&gt;The certificate &lt;b&gt;{0}&lt;/b&gt; already exists. Skipping.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>Delete CA Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>&lt;p&gt;Shall the CA certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the CA certificate is deleted, the browser will not trust any certificate issued by this CA.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>Export Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="374"/>
+        <source>Certificate File (PEM) (*.pem);;Certificate File (DER) (*.der)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="390"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="400"/>
+        <source>&lt;p&gt;The certificate could not be written to file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Certificate Files (*.pem *.crt *.der *.cer *.ca);;All Files (*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>&lt;p&gt;The certificate could not be read from file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>SslInfoDialog</name>
--- a/i18n/eric5_fr.ts	Sun Dec 19 15:26:00 2010 +0100
+++ b/i18n/eric5_fr.ts	Sun Dec 19 19:51:37 2010 +0100
@@ -4551,12 +4551,14 @@
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="956"/>
-        <source>The program has terminated with an exit status of {0}.</source>
+        <source>The program has terminated with an exit status of {0}.
+</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="960"/>
-        <source>&quot;{0}&quot; has terminated with an exit status of {1}.</source>
+        <source>&quot;{0}&quot; has terminated with an exit status of {1}.
+</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -32900,7 +32902,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="117"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="140"/>
         <source>Certificate name</source>
         <translation type="unfinished"></translation>
     </message>
@@ -32910,60 +32912,130 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="122"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="145"/>
         <source>Expiry Date</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="135"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="138"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="161"/>
         <source>&amp;View...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="77"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="194"/>
         <source>Press to delete the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="80"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="197"/>
         <source>&amp;Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="103"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="126"/>
         <source>Certificate &amp;Authorities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="109"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="132"/>
         <source>You have saved certificates identifying these certification authorities:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="176"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="251"/>
         <source>(Unknown)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="180"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="255"/>
         <source>(Unknown common name)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>Delete Server Certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>&lt;p&gt;Shall the server certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the server certificate is deleted, the normal security checks will be reinstantiated and the server has to present a valid certificate.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="168"/>
+        <source>Press to import a certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="171"/>
+        <source>&amp;Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="181"/>
+        <source>Press to export the selected certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="184"/>
+        <source>&amp;Export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Import Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="337"/>
+        <source>&lt;p&gt;The certificate &lt;b&gt;{0}&lt;/b&gt; already exists. Skipping.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>Delete CA Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>&lt;p&gt;Shall the CA certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the CA certificate is deleted, the browser will not trust any certificate issued by this CA.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>Export Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="374"/>
+        <source>Certificate File (PEM) (*.pem);;Certificate File (DER) (*.der)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="390"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="400"/>
+        <source>&lt;p&gt;The certificate could not be written to file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Certificate Files (*.pem *.crt *.der *.cer *.ca);;All Files (*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>&lt;p&gt;The certificate could not be read from file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>SslInfoDialog</name>
--- a/i18n/eric5_it.ts	Sun Dec 19 15:26:00 2010 +0100
+++ b/i18n/eric5_it.ts	Sun Dec 19 19:51:37 2010 +0100
@@ -4185,12 +4185,14 @@
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="956"/>
-        <source>The program has terminated with an exit status of {0}.</source>
+        <source>The program has terminated with an exit status of {0}.
+</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="960"/>
-        <source>&quot;{0}&quot; has terminated with an exit status of {1}.</source>
+        <source>&quot;{0}&quot; has terminated with an exit status of {1}.
+</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -30171,7 +30173,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="117"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="140"/>
         <source>Certificate name</source>
         <translation type="unfinished"></translation>
     </message>
@@ -30181,60 +30183,130 @@
         <translation type="unfinished">Server</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="122"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="145"/>
         <source>Expiry Date</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="135"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="138"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="161"/>
         <source>&amp;View...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="77"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="194"/>
         <source>Press to delete the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="80"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="197"/>
         <source>&amp;Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="103"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="126"/>
         <source>Certificate &amp;Authorities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="109"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="132"/>
         <source>You have saved certificates identifying these certification authorities:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="176"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="251"/>
         <source>(Unknown)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="180"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="255"/>
         <source>(Unknown common name)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>Delete Server Certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>&lt;p&gt;Shall the server certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the server certificate is deleted, the normal security checks will be reinstantiated and the server has to present a valid certificate.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="168"/>
+        <source>Press to import a certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="171"/>
+        <source>&amp;Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="181"/>
+        <source>Press to export the selected certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="184"/>
+        <source>&amp;Export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Import Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="337"/>
+        <source>&lt;p&gt;The certificate &lt;b&gt;{0}&lt;/b&gt; already exists. Skipping.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>Delete CA Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>&lt;p&gt;Shall the CA certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the CA certificate is deleted, the browser will not trust any certificate issued by this CA.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>Export Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="374"/>
+        <source>Certificate File (PEM) (*.pem);;Certificate File (DER) (*.der)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="390"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished">&lt;p&gt;Il file &lt;b&gt;{0}&lt;/b&gt; esiste già. Sovrascriverlo ?&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="400"/>
+        <source>&lt;p&gt;The certificate could not be written to file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Certificate Files (*.pem *.crt *.der *.cer *.ca);;All Files (*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>&lt;p&gt;The certificate could not be read from file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>SslInfoDialog</name>
--- a/i18n/eric5_ru.ts	Sun Dec 19 15:26:00 2010 +0100
+++ b/i18n/eric5_ru.ts	Sun Dec 19 19:51:37 2010 +0100
@@ -4214,12 +4214,14 @@
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="956"/>
-        <source>The program has terminated with an exit status of {0}.</source>
+        <source>The program has terminated with an exit status of {0}.
+</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="960"/>
-        <source>&quot;{0}&quot; has terminated with an exit status of {1}.</source>
+        <source>&quot;{0}&quot; has terminated with an exit status of {1}.
+</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -30236,7 +30238,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="117"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="140"/>
         <source>Certificate name</source>
         <translation type="unfinished"></translation>
     </message>
@@ -30246,60 +30248,130 @@
         <translation type="unfinished">Сервер</translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="122"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="145"/>
         <source>Expiry Date</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="135"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="138"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="161"/>
         <source>&amp;View...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="77"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="194"/>
         <source>Press to delete the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="80"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="197"/>
         <source>&amp;Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="103"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="126"/>
         <source>Certificate &amp;Authorities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="109"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="132"/>
         <source>You have saved certificates identifying these certification authorities:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="176"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="251"/>
         <source>(Unknown)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="180"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="255"/>
         <source>(Unknown common name)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>Delete Server Certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>&lt;p&gt;Shall the server certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the server certificate is deleted, the normal security checks will be reinstantiated and the server has to present a valid certificate.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="168"/>
+        <source>Press to import a certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="171"/>
+        <source>&amp;Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="181"/>
+        <source>Press to export the selected certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="184"/>
+        <source>&amp;Export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Import Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="337"/>
+        <source>&lt;p&gt;The certificate &lt;b&gt;{0}&lt;/b&gt; already exists. Skipping.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>Delete CA Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>&lt;p&gt;Shall the CA certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the CA certificate is deleted, the browser will not trust any certificate issued by this CA.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>Export Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="374"/>
+        <source>Certificate File (PEM) (*.pem);;Certificate File (DER) (*.der)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="390"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished">&lt;p&gt;Файл &lt;b&gt;{0}&lt;/b&gt; уже сущеструет. Переписать?&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="400"/>
+        <source>&lt;p&gt;The certificate could not be written to file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Certificate Files (*.pem *.crt *.der *.cer *.ca);;All Files (*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>&lt;p&gt;The certificate could not be read from file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>SslInfoDialog</name>
--- a/i18n/eric5_tr.ts	Sun Dec 19 15:26:00 2010 +0100
+++ b/i18n/eric5_tr.ts	Sun Dec 19 19:51:37 2010 +0100
@@ -4513,12 +4513,14 @@
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="956"/>
-        <source>The program has terminated with an exit status of {0}.</source>
+        <source>The program has terminated with an exit status of {0}.
+</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="960"/>
-        <source>&quot;{0}&quot; has terminated with an exit status of {1}.</source>
+        <source>&quot;{0}&quot; has terminated with an exit status of {1}.
+</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -32362,7 +32364,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="117"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="140"/>
         <source>Certificate name</source>
         <translation type="unfinished"></translation>
     </message>
@@ -32372,60 +32374,130 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="122"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="145"/>
         <source>Expiry Date</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="135"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="138"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="161"/>
         <source>&amp;View...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="77"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="194"/>
         <source>Press to delete the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="80"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="197"/>
         <source>&amp;Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="103"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="126"/>
         <source>Certificate &amp;Authorities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="109"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="132"/>
         <source>You have saved certificates identifying these certification authorities:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="176"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="251"/>
         <source>(Unknown)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="180"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="255"/>
         <source>(Unknown common name)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>Delete Server Certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>&lt;p&gt;Shall the server certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the server certificate is deleted, the normal security checks will be reinstantiated and the server has to present a valid certificate.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="168"/>
+        <source>Press to import a certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="171"/>
+        <source>&amp;Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="181"/>
+        <source>Press to export the selected certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="184"/>
+        <source>&amp;Export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Import Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="337"/>
+        <source>&lt;p&gt;The certificate &lt;b&gt;{0}&lt;/b&gt; already exists. Skipping.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>Delete CA Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>&lt;p&gt;Shall the CA certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the CA certificate is deleted, the browser will not trust any certificate issued by this CA.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>Export Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="374"/>
+        <source>Certificate File (PEM) (*.pem);;Certificate File (DER) (*.der)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="390"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="400"/>
+        <source>&lt;p&gt;The certificate could not be written to file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Certificate Files (*.pem *.crt *.der *.cer *.ca);;All Files (*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>&lt;p&gt;The certificate could not be read from file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>SslInfoDialog</name>
--- a/i18n/eric5_zh_CN.GB2312.ts	Sun Dec 19 15:26:00 2010 +0100
+++ b/i18n/eric5_zh_CN.GB2312.ts	Sun Dec 19 19:51:37 2010 +0100
@@ -4545,12 +4545,14 @@
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="956"/>
-        <source>The program has terminated with an exit status of {0}.</source>
+        <source>The program has terminated with an exit status of {0}.
+</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="Debugger/DebugUI.py" line="960"/>
-        <source>&quot;{0}&quot; has terminated with an exit status of {1}.</source>
+        <source>&quot;{0}&quot; has terminated with an exit status of {1}.
+</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -32870,7 +32872,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="117"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="140"/>
         <source>Certificate name</source>
         <translation type="unfinished"></translation>
     </message>
@@ -32880,60 +32882,130 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="122"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="145"/>
         <source>Expiry Date</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="135"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="158"/>
         <source>Press to view the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="138"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="161"/>
         <source>&amp;View...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="77"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="194"/>
         <source>Press to delete the selected certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="80"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="197"/>
         <source>&amp;Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="103"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="126"/>
         <source>Certificate &amp;Authorities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.ui" line="109"/>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="132"/>
         <source>You have saved certificates identifying these certification authorities:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="176"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="251"/>
         <source>(Unknown)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="180"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="255"/>
         <source>(Unknown common name)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>Delete Server Certificate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/SslCertificatesDialog.py" line="115"/>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="116"/>
         <source>&lt;p&gt;Shall the server certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the server certificate is deleted, the normal security checks will be reinstantiated and the server has to present a valid certificate.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="168"/>
+        <source>Press to import a certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="171"/>
+        <source>&amp;Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="181"/>
+        <source>Press to export the selected certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.ui" line="184"/>
+        <source>&amp;Export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Import Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="337"/>
+        <source>&lt;p&gt;The certificate &lt;b&gt;{0}&lt;/b&gt; already exists. Skipping.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>Delete CA Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="298"/>
+        <source>&lt;p&gt;Shall the CA certificate really be deleted?&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;&lt;p&gt;If the CA certificate is deleted, the browser will not trust any certificate issued by this CA.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>Export Certificate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="374"/>
+        <source>Certificate File (PEM) (*.pem);;Certificate File (DER) (*.der)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="390"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="400"/>
+        <source>&lt;p&gt;The certificate could not be written to file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="420"/>
+        <source>Certificate Files (*.pem *.crt *.der *.cer *.ca);;All Files (*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/SslCertificatesDialog.py" line="431"/>
+        <source>&lt;p&gt;The certificate could not be read from file &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Error: {1}&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>SslInfoDialog</name>

eric ide

mercurial