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): |