diff options
| -rw-r--r-- | data/leap_client.pro | 4 | ||||
| -rw-r--r-- | data/translations/de.ts | 218 | ||||
| -rw-r--r-- | data/ts/en_US.ts | 138 | ||||
| -rw-r--r-- | src/leap/baseapp/eip.py | 4 | ||||
| -rw-r--r-- | src/leap/baseapp/log.py | 4 | ||||
| -rw-r--r-- | src/leap/baseapp/systray.py | 56 | ||||
| -rw-r--r-- | src/leap/eip/exceptions.py | 55 | 
7 files changed, 432 insertions, 47 deletions
| diff --git a/data/leap_client.pro b/data/leap_client.pro index 3f76d6af..a9a9a932 100644 --- a/data/leap_client.pro +++ b/data/leap_client.pro @@ -3,6 +3,10 @@  # is not there a f*** way of expanding this? other to template with python I mean...  SOURCES += ../src/leap/base/exceptions.py +SOURCES += ../src/leap/eip/exceptions.py +SOURCES += ../src/leap/baseapp/eip.py +SOURCES += ../src/leap/baseapp/log.py +SOURCES += ../src/leap/baseapp/systray.py  SOURCES += ../src/leap/gui/firstrun/intro.py  SOURCES	+= ../src/leap/gui/firstrun/last.py  SOURCES	+= ../src/leap/gui/firstrun/login.py diff --git a/data/translations/de.ts b/data/translations/de.ts new file mode 100644 index 00000000..f2ab6fa4 --- /dev/null +++ b/data/translations/de.ts @@ -0,0 +1,218 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="de" version="2.0"> +<context> +    <name>IntroPage</name> +    <message> +        <location filename="../src/leap/gui/firstrun/intro.py" line="14"/> +        <source>First run wizard.</source> +        <translation>Assistent für erstmaligen Start</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/intro.py" line="24"/> +        <source>Now we will guide you through some configuration that is needed before you can connect for the first time.<br><br>If you ever need to modify these options again, you can find the wizard in the '<i>Settings</i>' menu from the main window.<br><br>Do you want to <b>sign up</b> for a new account, or <b>log in</b> with an already existing username?<br></source> +        <translation>Wir werden dich nun durch einige Konfigurationen führen, die du für den ersten Start benötigst.<br><br>Wenn du diese Konfigurationen jemals ändern musst, findest du den Assistenten im '<i>Einstellungen</i>'-Menü des Haupfensters.<br><br>Möchtest du dich für einen neuen Account <b>anmelden</b> oder mit einem bestehenden Usernamen <b>einloggen</b>?</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/intro.py" line="37"/> +        <source>Sign up for a new account.</source> +        <translation>Für einen neuen Account anmelden.</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/intro.py" line="40"/> +        <source>Log In with my credentials.</source> +        <translation>Mit bestehenden Daten einloggen.</translation> +    </message> +</context> +<context> +    <name>LogInPage</name> +    <message> +        <location filename="../src/leap/gui/firstrun/login.py" line="96"/> +        <source>Username must be in the username@provider form.</source> +        <translation>Der Username muss in der Form username@provider sein.</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/login.py" line="140"/> +        <source>Resolving domain name</source> +        <translation>Auflösen des Domain-Namens</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/login.py" line="163"/> +        <source>Authentication error: %s</source> +        <translation>Authentifizierungsfehler: %s</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/login.py" line="179"/> +        <source>Credentials validated.</source> +        <translation>Anmeldedaten korrekt.</translation> +    </message> +</context> +<context> +    <name>ProviderInfoPage</name> +    <message> +        <location filename="../src/leap/gui/firstrun/providerinfo.py" line="18"/> +        <source>Provider Info</source> +        <translation>Provider-info</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerinfo.py" line="19"/> +        <source>This is what provider says.</source> +        <translation>Das ist, was der Provider sagt.</translation> +    </message> +</context> +<context> +    <name>ProviderSetupValidationPage</name> +    <message> +        <location filename="../src/leap/gui/firstrun/providersetup.py" line="26"/> +        <source>Provider setup</source> +        <translation>Provider-Setup</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providersetup.py" line="27"/> +        <source>Doing autoconfig.</source> +        <translation>Führe autoconfig durch.</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providersetup.py" line="83"/> +        <source>Fetching CA certificate</source> +        <translation>Hole CA-Zertifikat</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providersetup.py" line="105"/> +        <source>Checking CA fingerprint</source> +        <translation>Überprüfe CA-Fingerprint</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providersetup.py" line="134"/> +        <source>Validating api certificate</source> +        <translation>Überprüfe API-Zertifikat</translation> +    </message> +</context> +<context> +    <name>RegisterUserPage</name> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="31"/> +        <source>Sign Up</source> +        <translation>Anmelden</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="208"/> +        <source>Registration succeeded!</source> +        <translation>Registrierung erfolgreich!</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="238"/> +        <source>Password does not match..</source> +        <translation>Passwort stimmt nicht überien.</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="242"/> +        <source>Password too short.</source> +        <translation>Passwort zu kurz</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="247"/> +        <source>Password too obvious.</source> +        <translation>Passwort zu simpel.</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="279"/> +        <source>Error connecting to provider (timeout)</source> +        <translation>Verbindungsfehler zu Provider (timeout)</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="284"/> +        <source>Error Connecting to provider (connerr).</source> +        <translation>Verbindungsfehler zu Provider (connerr)</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="292"/> +        <source>Error during registration (%s)</source> +        <translation>Fehler während der Registrierung (%s)</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="302"/> +        <source>Could not register (bad response)</source> +        <translation>Konnte nicht registrieren (bad response)</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="309"/> +        <source>Username not available.</source> +        <translation>Username nicht verfügbar.</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/register.py" line="375"/> +        <source>Register a new user with provider %s.</source> +        <translation>Registriere einen neuen User bei Provider %s</translation> +    </message> +</context> +<context> +    <name>RegisterUserValidationPage</name> +    <message> +        <location filename="../src/leap/gui/firstrun/regvalidation.py" line="95"/> +        <source>Fetching provider config...</source> +        <translation>Hole Provider-Konfiguration...</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/regvalidation.py" line="112"/> +        <source>Authentication error: %s</source> +        <translation>Authentifizierungsfehler: %s</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/regvalidation.py" line="117"/> +        <source>Fetching eip certificate</source> +        <translation>Hole EIP-Zertifikat</translation> +    </message> +</context> +<context> +    <name>SelectProviderPage</name> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="32"/> +        <source>Enter Provider</source> +        <translation>Gib Provider ein</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="33"/> +        <source>Please enter the domain of the provider you want to use for your connection.</source> +        <translation>Bitte gib die Domain des Providers an, den du für deine Verbindung nutzen möchtest.</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="87"/> +        <source>chec&k!</source> +        <translation type="unfinished"/> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="97"/> +        <source>Server certificate could not be verified.</source> +        <translation>Server-Zertifikat konnte nicht bestätigt werden.</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="136"/> +        <source>Certificate validation</source> +        <translation>Zertifikatsüberprüfung</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="222"/> +        <source>checking domain name</source> +        <translation>Prüfe Domain-Name</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="276"/> +        <source>checking https connection</source> +        <translation>Prüfe HTTPS-Verbindung</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="292"/> +        <source>Could not get info from provider.</source> +        <translation>Konnte keine Information vom Provider bekommen.</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="295"/> +        <source>Could not download provider info (refused conn.).</source> +        <translation>Konnte Provider-Info nicht herunterladen (refused conn.).</translation> +    </message> +    <message> +        <location filename="../src/leap/gui/firstrun/providerselect.py" line="305"/> +        <source>fetching provider info</source> +        <translation>Hole Provider-Info</translation> +    </message> +</context> +</TS>
\ No newline at end of file diff --git a/data/ts/en_US.ts b/data/ts/en_US.ts index a7e13dec..3fdb38da 100644 --- a/data/ts/en_US.ts +++ b/data/ts/en_US.ts @@ -1,6 +1,67 @@  <?xml version="1.0" encoding="utf-8"?>  <!DOCTYPE TS><TS version="2.0">  <context> +    <name>EIPConductorAppMixin</name> +    <message> +        <location filename="../src/leap/baseapp/eip.py" line="198"/> +        <source>&Disconnect</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/eip.py" line="212"/> +        <source>&Connect</source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context> +    <name>EIPErrors</name> +    <message> +        <location filename="../src/leap/eip/exceptions.py" line="66"/> +        <source>We could not find any authentication agent in your system.<br/>Make sure you have <b>polkit-gnome-authentication-agent-1</b> running and try again.</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/eip/exceptions.py" line="77"/> +        <source>We could not find <b>pkexec</b> in your system.<br/> Do you want to try <b>setuid workaround</b>? (<i>DOES NOTHING YET</i>)</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/eip/exceptions.py" line="88"/> +        <source>No suitable openvpn command found. <br/>(Might be a permissions problem)</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/eip/exceptions.py" line="97"/> +        <source>there is a problem with provider certificate</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/eip/exceptions.py" line="104"/> +        <source>an error occurred during configuratio of leap services</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/eip/exceptions.py" line="111"/> +        <source>Another OpenVPN Process has been detected.Please close it before starting leap-client</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/eip/exceptions.py" line="119"/> +        <source>Server does not allow secure connections</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/eip/exceptions.py" line="126"/> +        <source>Server certificate could not be verified</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/eip/exceptions.py" line="137"/> +        <source>We could not find your eip certs in the expected path</source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context>      <name>Errors</name>      <message>          <location filename="../src/leap/base/exceptions.py" line="57"/> @@ -29,7 +90,7 @@      </message>      <message>          <location filename="../src/leap/base/exceptions.py" line="95"/> -        <source>The Encrypted Connection was lost. Shutting down...</source> +        <source>The Encrypted Connection was lost.</source>          <translation type="unfinished"></translation>      </message>  </context> @@ -123,14 +184,27 @@      </message>  </context>  <context> +    <name>LogPaneMixin</name> +    <message> +        <location filename="../src/leap/baseapp/log.py" line="24"/> +        <source>&Connect</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/log.py" line="37"/> +        <source>Disconnected</source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context>      <name>ProviderInfoPage</name>      <message> -        <location filename="../src/leap/gui/firstrun/providerinfo.py" line="18"/> +        <location filename="../src/leap/gui/firstrun/providerinfo.py" line="19"/>          <source>Provider Info</source>          <translation type="unfinished"></translation>      </message>      <message> -        <location filename="../src/leap/gui/firstrun/providerinfo.py" line="19"/> +        <location filename="../src/leap/gui/firstrun/providerinfo.py" line="20"/>          <source>This is what provider says.</source>          <translation type="unfinished"></translation>      </message> @@ -337,4 +411,62 @@          <translation type="unfinished"></translation>      </message>  </context> +<context> +    <name>StatusAwareTrayIconMixin</name> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="78"/> +        <source>EIP Connection Status</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="87"/> +        <source><b>disconnected</b></source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="126"/> +        <source>Encryption ON     turn &off</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="131"/> +        <source>&Details...</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="135"/> +        <source>&About</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="138"/> +        <source>About Q&t</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="141"/> +        <source>&Quit</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="152"/> +        <source>Encryption ON    turn o&ff</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="157"/> +        <source>Encryption OFF   turn &on</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="162"/> +        <source>connecting...</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/baseapp/systray.py" line="185"/> +        <source>About</source> +        <translation type="unfinished"></translation> +    </message> +</context>  </TS> diff --git a/src/leap/baseapp/eip.py b/src/leap/baseapp/eip.py index 55ecfa79..41f4c541 100644 --- a/src/leap/baseapp/eip.py +++ b/src/leap/baseapp/eip.py @@ -195,7 +195,7 @@ class EIPConductorAppMixin(object):              else:                  # no errors, so go on.                  if self.debugmode: -                    self.startStopButton.setText('&Disconnect') +                    self.startStopButton.setText(self.tr('&Disconnect'))                  self.eip_service_started = True                  self.toggleEIPAct() @@ -209,7 +209,7 @@ class EIPConductorAppMixin(object):              self.network_checker.stop()              self.conductor.disconnect()              if self.debugmode: -                self.startStopButton.setText('&Connect') +                self.startStopButton.setText(self.tr('&Connect'))              self.eip_service_started = False              self.toggleEIPAct()              self.timer.stop() diff --git a/src/leap/baseapp/log.py b/src/leap/baseapp/log.py index 8a7f81c3..95cfc918 100644 --- a/src/leap/baseapp/log.py +++ b/src/leap/baseapp/log.py @@ -21,7 +21,7 @@ class LogPaneMixin(object):          logging_layout = QtGui.QVBoxLayout()          self.logbrowser = QtGui.QTextBrowser() -        startStopButton = QtGui.QPushButton("&Connect") +        startStopButton = QtGui.QPushButton(self.tr("&Connect"))          self.startStopButton = startStopButton          logging_layout.addWidget(self.logbrowser) @@ -34,7 +34,7 @@ class LogPaneMixin(object):          grid = QtGui.QGridLayout()          self.updateTS = QtGui.QLabel('') -        self.status_label = QtGui.QLabel('Disconnected') +        self.status_label = QtGui.QLabel(self.tr('Disconnected'))          self.ip_label = QtGui.QLabel('')          self.remote_label = QtGui.QLabel('') diff --git a/src/leap/baseapp/systray.py b/src/leap/baseapp/systray.py index 93fab716..77eb3fe9 100644 --- a/src/leap/baseapp/systray.py +++ b/src/leap/baseapp/systray.py @@ -75,7 +75,8 @@ class StatusAwareTrayIconMixin(object):                  self.iconpath['connected'])),          self.ConnectionWidgets = con_widgets -        self.statusIconBox = QtGui.QGroupBox("EIP Connection Status") +        self.statusIconBox = QtGui.QGroupBox( +            self.tr("EIP Connection Status"))          statusIconLayout = QtGui.QHBoxLayout()          statusIconLayout.addWidget(self.ConnectionWidgets['disconnected'])          statusIconLayout.addWidget(self.ConnectionWidgets['connecting']) @@ -83,7 +84,8 @@ class StatusAwareTrayIconMixin(object):          statusIconLayout.itemAt(1).widget().hide()          statusIconLayout.itemAt(2).widget().hide() -        self.leapConnStatus = QtGui.QLabel("<b>disconnected</b>") +        self.leapConnStatus = QtGui.QLabel( +            self.tr("<b>disconnected</b>"))          statusIconLayout.addWidget(self.leapConnStatus)          self.statusIconBox.setLayout(statusIconLayout) @@ -113,26 +115,32 @@ class StatusAwareTrayIconMixin(object):          #self.trayIconMenu.customContextMenuRequested.connect(              #self.on_context_menu) -    def bad(self): -        logger.error('this should not be called') +    #def bad(self): +        #logger.error('this should not be called')      def createActions(self):          """          creates actions to be binded to tray icon          """          # XXX change action name on (dis)connect -        self.connAct = QtGui.QAction("Encryption ON     turn &off", self, -                                     triggered=lambda: self.start_or_stopVPN()) - -        self.detailsAct = QtGui.QAction("&Details...", -                                        self, -                                        triggered=self.detailsWin) -        self.aboutAct = QtGui.QAction("&About", self, -                                      triggered=self.about) -        self.aboutQtAct = QtGui.QAction("About Q&t", self, -                                        triggered=QtGui.qApp.aboutQt) -        self.quitAction = QtGui.QAction("&Quit", self, -                                        triggered=self.cleanupAndQuit) +        self.connAct = QtGui.QAction( +            self.tr("Encryption ON     turn &off"), +            self, +            triggered=lambda: self.start_or_stopVPN()) + +        self.detailsAct = QtGui.QAction( +            self.tr("&Details..."), +            self, +            triggered=self.detailsWin) +        self.aboutAct = QtGui.QAction( +            self.tr("&About"), self, +            triggered=self.about) +        self.aboutQtAct = QtGui.QAction( +            self.tr("About Q&t"), self, +            triggered=QtGui.qApp.aboutQt) +        self.quitAction = QtGui.QAction( +            self.tr("&Quit"), self, +            triggered=self.cleanupAndQuit)      def toggleEIPAct(self):          # this is too simple by now. @@ -141,15 +149,17 @@ class StatusAwareTrayIconMixin(object):          icon_status = self.conductor.get_icon_name()          if icon_status == "connected":              self.connAct.setEnabled(True) -            self.connAct.setText('Encryption ON    turn o&ff') +            self.connAct.setText( +                self.tr('Encryption ON    turn o&ff'))              return          if icon_status == "disconnected":              self.connAct.setEnabled(True) -            self.connAct.setText('Encryption OFF   turn &on') +            self.connAct.setText( +                self.tr('Encryption OFF   turn &on'))              return          if icon_status == "connecting":              self.connAct.setDisabled(True) -            self.connAct.setText('connecting...') +            self.connAct.setText(self.tr('connecting...'))              return      def detailsWin(self): @@ -164,14 +174,15 @@ class StatusAwareTrayIconMixin(object):      def about(self):          # move to widget          flavor = BRANDING.get('short_name', None) -        content = ("LEAP client<br>" -                   "(version <b>%s</b>)<br>" % VERSION) +        content = self.tr( +            ("LEAP client<br>" +             "(version <b>%s</b>)<br>" % VERSION))          if flavor:              content = content + ('<br>Flavor: <i>%s</i><br>' % flavor)          content = content + (              "<br><a href='https://leap.se/'>"              "https://leap.se</a>") -        QtGui.QMessageBox.about(self, "About", content) +        QtGui.QMessageBox.about(self, self.tr("About"), content)      def setConnWidget(self, icon_name):          oldlayout = self.statusIconBox.layout() @@ -209,6 +220,7 @@ class StatusAwareTrayIconMixin(object):              # is failing in a way beyond my understanding.              # (not working the first time it's clicked).              # this works however. +            # XXX in osx it shows some glitches.              context_menu.exec_(self.trayIcon.geometry().center())      @QtCore.pyqtSlot() diff --git a/src/leap/eip/exceptions.py b/src/leap/eip/exceptions.py index 41eed77a..c127a58f 100644 --- a/src/leap/eip/exceptions.py +++ b/src/leap/eip/exceptions.py @@ -33,6 +33,7 @@ TODO:  """  from leap.base.exceptions import LeapException +from leap.util.translations import translate  # This should inherit from LeapException @@ -62,53 +63,69 @@ class Warning(EIPClientError):  class EIPNoPolkitAuthAgentAvailable(CriticalError):      message = "No polkit authentication agent could be found" -    usermessage = ("We could not find any authentication " -                   "agent in your system.<br/>" -                   "Make sure you have " -                   "<b>polkit-gnome-authentication-agent-1</b> " -                   "running and try again.") +    usermessage = translate( +        "EIPErrors", +        "We could not find any authentication " +        "agent in your system.<br/>" +        "Make sure you have " +        "<b>polkit-gnome-authentication-agent-1</b> " +        "running and try again.")  class EIPNoPkexecAvailable(Warning):      message = "No pkexec binary found" -    usermessage = ("We could not find <b>pkexec</b> in your " -                   "system.<br/> Do you want to try " -                   "<b>setuid workaround</b>? " -                   "(<i>DOES NOTHING YET</i>)") +    usermessage = translate( +        "EIPErrors", +        "We could not find <b>pkexec</b> in your " +        "system.<br/> Do you want to try " +        "<b>setuid workaround</b>? " +        "(<i>DOES NOTHING YET</i>)")      failfirst = True  class EIPNoCommandError(EIPClientError):      message = "no suitable openvpn command found" -    usermessage = ("No suitable openvpn command found. " -                   "<br/>(Might be a permissions problem)") +    usermessage = translate( +        "EIPErrors", +        "No suitable openvpn command found. " +        "<br/>(Might be a permissions problem)")  class EIPBadCertError(Warning):      # XXX this should be critical and fail close      message = "cert verification failed" -    usermessage = "there is a problem with provider certificate" +    usermessage = translate( +        "EIPErrors", +        "there is a problem with provider certificate")  class LeapBadConfigFetchedError(Warning):      message = "provider sent a malformed json file" -    usermessage = "an error occurred during configuratio of leap services" +    usermessage = translate( +        "EIPErrors", +        "an error occurred during configuratio of leap services")  class OpenVPNAlreadyRunning(EIPClientError):      message = "Another OpenVPN Process is already running." -    usermessage = ("Another OpenVPN Process has been detected." -                   "Please close it before starting leap-client") +    usermessage = translate( +        "EIPErrors", +        "Another OpenVPN Process has been detected." +        "Please close it before starting leap-client")  class HttpsNotSupported(LeapException):      message = "connection refused while accessing via https" -    usermessage = "Server does not allow secure connections." +    usermessage = translate( +        "EIPErrors", +        "Server does not allow secure connections")  class HttpsBadCertError(LeapException):      message = "verification error on cert" -    usermessage = "Server certificate could not be verified." +    usermessage = translate( +        "EIPErrors", +        "Server certificate could not be verified")  #  # errors still needing some love @@ -117,7 +134,9 @@ class HttpsBadCertError(LeapException):  class EIPInitNoKeyFileError(CriticalError):      message = "No vpn keys found in the expected path" -    usermessage = "We could not find your eip certs in the expected path" +    usermessage = translate( +        "EIPErrors", +        "We could not find your eip certs in the expected path")  class EIPInitBadKeyFilePermError(Warning): | 
