diff --git a/pom.xml b/pom.xml index 8fa81bd..ec0c978 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.example Widerhall - 0.0.11 + 0.0.12 diff --git a/src/main/java/de/srsoftware/widerhall/Configuration.java b/src/main/java/de/srsoftware/widerhall/Configuration.java index dd234e7..240d716 100644 --- a/src/main/java/de/srsoftware/widerhall/Configuration.java +++ b/src/main/java/de/srsoftware/widerhall/Configuration.java @@ -36,7 +36,7 @@ public class Configuration { var newVals = (JSONObject) new JSONParser().parse(Files.readString(file.toPath())); data.putAll(newVals); } catch (ParseException | IOException e){ - LOG.warn("Was not able to load configuration from {}:",file,e); + LOG.warn("Konnte Konfiguration nicht aus {} laden:",file,e); } return this; } @@ -47,7 +47,7 @@ public class Configuration { } public Configuration save() throws IOException { - if (file == null) throw new NullPointerException("Cannot save configuration: file is null!"); + if (file == null) throw new NullPointerException("Konnte Konfiguration nicht speichern: Datei ist null!"); file.getParentFile().mkdirs(); Files.writeString(file.toPath(),data.toJSONString()); return this; diff --git a/src/main/java/de/srsoftware/widerhall/web/Rest.java b/src/main/java/de/srsoftware/widerhall/web/Rest.java index 7f96726..60a3676 100644 --- a/src/main/java/de/srsoftware/widerhall/web/Rest.java +++ b/src/main/java/de/srsoftware/widerhall/web/Rest.java @@ -213,35 +213,35 @@ public class Rest extends HttpServlet { return Map.of(SUCCESS,t("Mailing-List '{}' wurde {}!",listEmail,enable ? "aktiviert" : "inaktiviert")); } catch (SQLException e) { LOG.error("Aktivieren/Inaktivieren der Mailing-Liste fehlgeschlagen: ",e); - return Map.of("error",t("Failed to update list '{}'",listEmail)); + return Map.of(ERROR,t("Aktualisieren der Liste '{}' fehlgeschlagen!",listEmail)); } } - return Map.of("error",t("You are not allowed to edit '{}'",listEmail)); + return Map.of(ERROR,t("Sie haben nicht die Berechtigng, '{}' zu bearbeiten",listEmail)); } private Map hideList(String listEmail, User user, boolean hide) { - if (listEmail == null || listEmail.isBlank()) return Map.of(ERROR,"no list email provided!"); + if (listEmail == null || listEmail.isBlank()) return Map.of(ERROR,"Keine Listen-Email übergeben!"); if (user.hashPermission(User.PERMISSION_ADMIN) || ListMember.listsOwnedBy(user).contains(listEmail)){ try { MailingList.load(listEmail).hide(hide); - return Map.of(SUCCESS,t("Mailing list '{}' was {}!",listEmail,hide ? "hidden" : "made public")); + return Map.of(SUCCESS,t("Mailing-List '{}' wurde {}!",listEmail,hide ? "versteckt" : "veröffentlicht")); } catch (SQLException e) { - LOG.error("Failed to (un)hide mailing list: ",e); - return Map.of("error",t("Failed to update list '{}'",listEmail)); + LOG.error("Verstecken/Veröffentlichen der Mailinglist fehlgeschlagen: ",e); + return Map.of("error",t("Aktualisieren der Liste '{}' fehlgeschlagen",listEmail)); } } - return Map.of("error",t("You are not allowed to edit '{}'",listEmail)); + return Map.of(ERROR,t("Sie haben nicht die Berechtigng, '{}' zu bearbeiten",listEmail)); } private Map testList(String listEmail, User user) { - if (listEmail == null || listEmail.isBlank()) return Map.of(ERROR,"no list email provided!"); + if (listEmail == null || listEmail.isBlank()) return Map.of(ERROR,"Keine Listen-Email übergeben!"); try { MailingList.load(listEmail).test(user); - return Map.of(SUCCESS,t("Sent test email to {}",user.email())); + return Map.of(SUCCESS,t("Test-Email an {} gesendet",user.email())); } catch (Exception e) { - LOG.warn("Failed to send test email",e); - return Map.of(ERROR,t("Failed to send test email to {}",user.email())); + LOG.warn("Senden der Test-Email fehlgeschlagen",e); + return Map.of(ERROR,t("Senden der Test-Email an {} fehlgeschlagen",user.email())); } } } diff --git a/src/main/java/de/srsoftware/widerhall/web/TemplateServlet.java b/src/main/java/de/srsoftware/widerhall/web/TemplateServlet.java index 79b24a7..4a9081b 100644 --- a/src/main/java/de/srsoftware/widerhall/web/TemplateServlet.java +++ b/src/main/java/de/srsoftware/widerhall/web/TemplateServlet.java @@ -26,12 +26,12 @@ public abstract class TemplateServlet extends HttpServlet { protected String loadFile(String filename, HttpServletResponse resp) { var path = String.join(File.separator,baseDir,"static",filename); var file = new File(path); - if (!file.exists()) return t("File {} does not exist!",filename); + if (!file.exists()) return t("Datei {} existiert nicht!",filename); try { var content = Files.readString(file.toPath()); resp.getWriter().println(content); } catch (IOException e) { - return t("Failed to load file '{}'!",filename); + return t("Ladend der Datei '{}' fehlgeschlagen!",filename); } return null; } @@ -44,10 +44,10 @@ public abstract class TemplateServlet extends HttpServlet { resp.getWriter().println(template.render()); return null; } catch (IOException e) { - return t("Failed to load template '{}'",path); + return t("Laden der Vorlage '{}' fehlgeschlagen",path); } } - return t("No template for path '{}'!",path); + return t("Keine Vorlage für den Pfad '{}' vorhanden!",path); } protected void loadTemplates() { diff --git a/src/main/java/de/srsoftware/widerhall/web/Web.java b/src/main/java/de/srsoftware/widerhall/web/Web.java index 8d6b861..bfc5a38 100644 --- a/src/main/java/de/srsoftware/widerhall/web/Web.java +++ b/src/main/java/de/srsoftware/widerhall/web/Web.java @@ -60,7 +60,7 @@ public class Web extends TemplateServlet { data.put(USER, user); if (!user.hashPermission(User.PERMISSION_CREATE_LISTS)){ - data.put(ERROR,t("You are not allowed to create new mailing lists!")); + data.put(ERROR,t("Ihnen ist es nicht gestattet, neue Mailinglisten anzulegen!")); return loadTemplate(ADMIN,data,resp); } @@ -88,17 +88,17 @@ public class Web extends TemplateServlet { data.put(SMTP_PORT, smtpPort); if (name == null || name.isBlank() || email == null || email.isBlank()) { - data.put(ERROR, "List name and address are required!"); + data.put(ERROR, "Name und Adresse der Liste sind notwendige Felder!"); return loadTemplate(ADD_LIST, data, resp); } if (!Util.isEmail(email)) { - data.put(ERROR, t("List email ({}) is not a valid email address!", email)); + data.put(ERROR, t("Listen-E-Mail-Adresse ({}) ist keine gültige E-Mail-Adresse!", email)); return loadTemplate(ADD_LIST, data, resp); } if (imapHost == null || imapHost.isBlank() || imapUser == null || imapUser.isBlank() || imapPass == null || imapPass.isBlank()) { - data.put(ERROR, "IMAP credentials are required!"); + data.put(ERROR, "IMAP-Zugangsdaten sind erforderlich!"); return loadTemplate(ADD_LIST, data, resp); } @@ -107,12 +107,12 @@ public class Web extends TemplateServlet { imapPort = Integer.parseInt(req.getParameter(IMAP_PORT)); data.put(IMAP_PORT, imapPort); } catch (NumberFormatException nfe) { - data.put(ERROR, t("'{}' is not a proper port number!", req.getParameter(IMAP_PORT))); + data.put(ERROR, t("'{}' ist keine gültige Port-Nummer!", req.getParameter(IMAP_PORT))); return loadTemplate(ADD_LIST, data, resp); } if (smtpHost == null || smtpHost.isBlank() || smtpUser == null || smtpUser.isBlank() || smtpPass == null || smtpPass.isBlank()) { - data.put(ERROR, "SMTP credentials are required!"); + data.put(ERROR, "SMTP-Zugangsdaten sind erforderlich!"); return loadTemplate(ADD_LIST, data, resp); } @@ -120,7 +120,7 @@ public class Web extends TemplateServlet { smtpPort = Integer.parseInt(req.getParameter(SMTP_PORT)); data.put(SMTP_PORT, smtpPort); } catch (NumberFormatException nfe) { - data.put(ERROR, t("'{}' is not a proper port number!", req.getParameter(SMTP_PORT))); + data.put(ERROR, t("'{}' ist keine gültige Port-Nummer!", req.getParameter(SMTP_PORT))); return loadTemplate(ADD_LIST, data, resp); } @@ -129,20 +129,20 @@ public class Web extends TemplateServlet { ListMember.create(list, user, ListMember.STATE_OWNER); return redirectTo(INDEX, resp); } catch (SQLException e) { - return t("Failed to create list '{}': {}", name, e.getMessage()); + return t("Erzeugen der Liste '{}' fehlgeschlagen: {}", name, e.getMessage()); } } private String confirm(HttpServletRequest req, HttpServletResponse resp) { try { var token = req.getParameter(TOKEN); - if (token== null || token.isBlank()) return t("Invalid or missing token!"); + if (token== null || token.isBlank()) return t("Ungültiger oder fehlender Token!"); var user = ListMember.confirm(token); - if (user != null) return loadTemplate(INDEX,Map.of(USER,user.safeMap(),NOTES,"Confirmed list subscription!"),resp); - return t("Unknown user or token"); + if (user != null) return loadTemplate(INDEX,Map.of(USER,user.safeMap(),NOTES,"Listen-Mitgliedschaft bestätigt!"),resp); + return t("Nutzer oder Token unbekannt"); } catch (Exception e) { - LOG.debug("Failed to confirm list membership:",e); - return t("Confirmation of list membership failed!"); + LOG.debug("Bestätigung des Listen-Abonnements fehlgeschlagen:",e); + return t("Bestätigung des Listen-Abonnements fehlgeschlagen!"); } } @@ -188,7 +188,7 @@ public class Web extends TemplateServlet { return confirm(req,resp); case RELOAD: loadTemplates(); - data.put(NOTES,t("Templates have been reloaded")); + data.put(NOTES,t("Vorlagen wurden neu geladen")); path = INDEX; case "css": case INDEX: @@ -199,16 +199,16 @@ public class Web extends TemplateServlet { data.put(LIST,listEmail); return loadTemplate(path, data, resp); } - return t("You are not allowed to subscribe to '{}'!",list.email()); + return t("Es ist ihnen nicht gestattet, '{}' zu abonnieren!",list.email()); case "js": resp.setContentType("text/javascript"); return loadTemplate(path,data,resp); case LOGIN: try { - if (User.noUsers()) return loadTemplate(REGISTER, Map.of(NOTES,t("User database is empty. Create admin user first:")), resp); + if (User.noUsers()) return loadTemplate(REGISTER, Map.of(NOTES,t("Nutzer-Datenbank ist leer. Admin-Nutzer wird hiermit angelegt:")), resp); return loadTemplate(path,null,resp); } catch (SQLException e) { - return "Error reading user database!"; + return "Fehler beim Lesen der Datenbank!"; } case LOGOUT: req.getSession().invalidate(); @@ -231,8 +231,8 @@ public class Web extends TemplateServlet { private String handleLogin(HttpServletRequest req, HttpServletResponse resp) { var email = req.getParameter("email"); var pass = req.getParameter("pass"); - if (email == null || pass == null) return loadTemplate("login", Map.of("error",t("Missing username or password!")), resp); - if (!Util.isEmail(email)) return loadTemplate("login", Map.of("error",t("'{}' is not a valid email address!",email)), resp); + if (email == null || pass == null) return loadTemplate("login", Map.of("error",t("Nutzername oder Passwort fehlen!")), resp); + if (!Util.isEmail(email)) return loadTemplate("login", Map.of("error",t("'{}' ist keine gültige Mailadresse!",email)), resp); try { var user = User.loadUser(email,pass); req.getSession().setAttribute("user",user); @@ -240,10 +240,10 @@ public class Web extends TemplateServlet { resp.sendRedirect(String.join("/",WEB_ROOT,"admin")); } catch (Exception e) { try { - LOG.warn("Static.handleLogin failed:",e); + LOG.warn("Static.handleLogin fehlgeschlagen:",e); Thread.sleep(10000); } finally { - return loadTemplate("login", Map.of(ERROR,t("Invalid username/password"),EMAIL,email), resp); + return loadTemplate("login", Map.of(ERROR,t("Ungültiger Nutzername oder ungültiges Passwort!"),EMAIL,email), resp); } } return null; @@ -265,7 +265,7 @@ public class Web extends TemplateServlet { return unsubscribe(req,resp); } - return t("No handler for path {}!",path); + return t("Kein Handler für den Pfad '{}'!",path); } @@ -277,7 +277,7 @@ public class Web extends TemplateServlet { resp.sendRedirect(String.join("/",WEB_ROOT,page)); return null; } catch (IOException e) { - return t("Was not able to redirect to {} page: {}", page, e.getMessage()); + return t("Weiterleitung nach {} fehlgeschlagen: {}", page, e.getMessage()); } } @@ -293,15 +293,15 @@ public class Web extends TemplateServlet { if (email == null || email.isBlank() || name == null || name.isBlank() || pass == null || pass.isBlank() || - pass_repeat == null || pass_repeat.isBlank()) return loadTemplate(REGISTER,Map.of(ERROR,"Fill all fields, please!",NAME,name,EMAIL,email),resp); - if (!pass.equals(pass_repeat)) return loadTemplate(REGISTER,Map.of(ERROR,"Passwords do not match!",NAME,name,EMAIL,email),resp); - if (Util.simplePassword(pass)) return loadTemplate(REGISTER,Map.of(ERROR,"Password to short or to simple!",NAME,name,EMAIL,email),resp); + pass_repeat == null || pass_repeat.isBlank()) return loadTemplate(REGISTER,Map.of(ERROR,"Bitte alle Felder ausfüllen!",NAME,name,EMAIL,email),resp); + if (!pass.equals(pass_repeat)) return loadTemplate(REGISTER,Map.of(ERROR,"Passworte stimmen nicht überein!",NAME,name,EMAIL,email),resp); + if (Util.simplePassword(pass)) return loadTemplate(REGISTER,Map.of(ERROR,"Passwort zu kurz oder zu einfach!",NAME,name,EMAIL,email),resp); var firstUser = false; try { firstUser = User.noUsers(); } catch (SQLException e) { - return t("Failed to access user database: {}",e.getMessage()); + return t("Fehler beim Zugriff auf die Nutzer-Datenbank: {}",e.getMessage()); } @@ -311,8 +311,8 @@ public class Web extends TemplateServlet { req.getSession().setAttribute("user",user); return redirectTo(INDEX,resp); } catch (SQLException e) { - LOG.warn("Failed to create new user:",e); - return t("Failed to create new user: {}",e.getMessage()); + LOG.warn("Erzeugen des neuen Nutzers fehlgeschlagen:",e); + return t("Erzeugen des neuen Nutzers fehlgeschlagen: {}",e.getMessage()); } } @@ -330,12 +330,12 @@ public class Web extends TemplateServlet { var list = MailingList.load(listEmail); if (list == null){ - data.put(ERROR,"No list provided by form data!"); + data.put(ERROR,"Formular-Daten enthalten keine Liste!"); return loadTemplate(SUBSCRIBE,data,resp); } if (name == null || name.isBlank() || email == null || email.isBlank()){ - data.put(ERROR,"Name and email are required fields for list subscription!"); + data.put(ERROR,"Name und E-Mail-Adresse sind für das Abonnieren der Mailingliste erforderlich!"); return loadTemplate(SUBSCRIBE,data,resp); } if (pass != null && pass.isBlank()) pass = null; @@ -352,36 +352,36 @@ public class Web extends TemplateServlet { // success → subscribe } catch (InvalidKeyException | SQLException e) { // invalid credentials - data.put(ERROR,t("'{}' already in database, but with different password!",email)); + data.put(ERROR,t("'{}' gibt es schon in der Datenbank, hat dort aber ein anderes Passwort!",email)); return loadTemplate(SUBSCRIBE,data,resp); } } data.put(USER,user.safeMap()); if (!list.isOpenFor(user)){ - data.put(ERROR,t("You are not allowed to join {}!",list.email())); + data.put(ERROR,t("Ihnen ist es nicht gestattet, '{}' zu abonnieren!",list.email())); return loadTemplate(SUBSCRIBE,data,resp); } try { list.requestSubscription(user,skipConfirmation); if (skipConfirmation) { - data.put(NOTES, t("Successfully subscribed '{}' to '{}'.", user.email(), list.email())); + data.put(NOTES, t("'{}' hat die Mailingliste '{}' erfolgreich abonniert.", user.email(), list.email())); } else { - data.put(NOTES, t("Sent confirmation mail to '{}.", user.email())); + data.put(NOTES, t("Bestätigungs-Email wurde an '{} versendet.", user.email())); } return loadTemplate(INDEX,data,resp); } catch (SQLException sqle) { - LOG.debug("List subscription failed: ",sqle); + LOG.debug("Abonnieren der Liste fehlgeschlagen: ",sqle); var cause = getCausingException(sqle); int code = cause.getErrorCode(); if (code == PRIMARY_KEY_CONSTRAINT) {// user already exists - data.put(ERROR,t("You already are member of this list!",sqle.getMessage())); - } else data.put(ERROR,t("Subscription failed: {}",sqle.getMessage())); + data.put(ERROR,t("Sie haben diese Liste bereits abonniert!",sqle.getMessage())); + } else data.put(ERROR,t("Abonnieren der Liste fehlgeschlagen: {}",sqle.getMessage())); return loadTemplate(SUBSCRIBE,data,resp); } catch (MessagingException e) { - LOG.warn("Failed to send request confirmation email:",e); - data.put(ERROR,t("Failed to send request confirmation email: {}",e.getMessage())); + LOG.warn("Senden der Bestätigungs-Email fehlgeschlagen:",e); + data.put(ERROR,t("Senden der Bestätigungs-Email fehlgeschlagen: {}",e.getMessage())); return loadTemplate(SUBSCRIBE,data,resp); } } diff --git a/src/test/java/de/srsoftware/widerhall/data/DatabaseTest.java b/src/test/java/de/srsoftware/widerhall/data/DatabaseTest.java index 5ba1279..d51484c 100644 --- a/src/test/java/de/srsoftware/widerhall/data/DatabaseTest.java +++ b/src/test/java/de/srsoftware/widerhall/data/DatabaseTest.java @@ -50,8 +50,8 @@ public class DatabaseTest extends TestCase { } public void testUpdate(){ - assertEquals("UPDATE Test",Database.open().update("Test").sql()); - assertEquals("UPDATE Test SET x = 5",Database.open().update("Test").set("x",5).sql()); - assertEquals("UPDATE Test SET x = 5, y = 6",Database.open().update("Test").set("x",5).set("y",6).sql()); + assertEquals("UPDATE Test",Database.open().update("Test").compile().toString()); + assertEquals("UPDATE Test SET x = 5",Database.open().update("Test").set("x",5).compile().toString()); + assertEquals("UPDATE Test SET x = 5, y = 6",Database.open().update("Test").set("x",5).set("y",6).compile().toString()); } } \ No newline at end of file diff --git a/static/templates/add_list.st b/static/templates/add_list.st index f855957..9cf85aa 100644 --- a/static/templates/add_list.st +++ b/static/templates/add_list.st @@ -9,24 +9,24 @@ «navigation()» «userinfo()» -

Widerhall List Creation

+

Widerhall Listen-Erzeugung

«messages()»
- List configuration + Listen-Konfiguration
- Basic data + Basis-Daten
- IMAP protocol + IMAP-Protokoll
- SMTP protocol + SMTP-Protokoll
- +
diff --git a/static/templates/footer.st b/static/templates/footer.st index 4193584..2ba1ac7 100644 --- a/static/templates/footer.st +++ b/static/templates/footer.st @@ -1,3 +1,3 @@ \ No newline at end of file diff --git a/static/templates/frontpage.st b/static/templates/frontpage.st index 2f7cbe6..6a06383 100644 --- a/static/templates/frontpage.st +++ b/static/templates/frontpage.st @@ -1,39 +1,38 @@ - -

Widerhall front page

- If you are looking for you mailing lists, Go to the /web page... +

Widerhall Startseite

+ Falls du zu den Mailing-Listen willst, Gehe zur Seite /web...
- What is Widerhall? + Was ist Widerhall?

- Widerhall is a mailing list system written in Java. - It allows to maintain a set of mailing lists with the option to make (some of) them publicy subscribable. + Widerhall ist ein in Java geschriebenes Mailing-List-System. + Es erlaubd die Pflege con Mailverteilern mit der Option diese für Jedermann abonnierbar zu machen.

- Widerhall is very lightweight, as does not include a full email server stack. + Widerhall ist sehr leichtgewichtig, da es keinen vollständigen Mailserver enthält.

- Why should I use Widerhall? + Warum sollte ich Widerhall nutzen?

- Compared to other mailing list systems, widerhall is very lightweight: + Im Vergleich mit anderen Mailing-Listen-Systemen ist Widerhall sehr schlank:

- It contains not mailserver stack. It does not even require you to set up a mailserver! + Es enthält keinen eigenen Mailserver. Für Widerhall musst du nichtmal einen eigenen Mailserver aufsetzen!

- How does it work? + Wie funktioniert das?

- Widerhall works by just letting you set up any IMAP/SMTP enabled email address with a provider of your choice. - It then connects to the inbox of you selected email address and watches for incoming messages. - Upon message reception, it forwards the message to all subscribers of the mailing list. + Bei Widerhall kannst du einfach eine IMAP/SMTP-fähige Emailadresse bei einem beliebigen Anbierter anlegen. + Danach verbindet sich Widerhall mit dem Posteingang der entsprechenden Email-Adresse und wartet auf dort eingehende Nachrichten. + Sobald eine Nachricht empfangen wird, wird diese an alle Abonnenten der Mailing-Liste weitergeleitet.

- That's it. + Das ist alles.

diff --git a/static/templates/index.st b/static/templates/index.st index 38f65a1..7ca6276 100644 --- a/static/templates/index.st +++ b/static/templates/index.st @@ -10,7 +10,7 @@ «navigation()» «userinfo()» «messages()» -

Widerhall Index page

+

Widerhall Index-Seite

«listlist()» «footer()» diff --git a/static/templates/inspect.st b/static/templates/inspect.st index c4a3c82..2e5fdf2 100644 --- a/static/templates/inspect.st +++ b/static/templates/inspect.st @@ -10,7 +10,7 @@ «navigation()» «userinfo()» «messages()» -

Widerhall '«data.list»' Details

+

Widerhall '«data.list»'-Details

«listmembers()» \ No newline at end of file diff --git a/static/templates/js.st b/static/templates/js.st index 2f3a2b1..c23546b 100644 --- a/static/templates/js.st +++ b/static/templates/js.st @@ -1,5 +1,5 @@ function addPermission(userEmail,permission){ - if (confirm("Really give permission to "+userEmail+"?")){ + if (confirm("Wirklich Berechtigung an "+userEmail+" geben?")){ $.post('/api/user/addpermission',{email:userEmail,permissions:permission},reload,'json'); } } @@ -13,7 +13,7 @@ function dropList(listEmail){ } function dropPermission(userEmail,permission){ - if (confirm("Really withdraw permission from "+userEmail+"?")){ + if (confirm("Wirklich Berechtigung von "+userEmail+" wegnehmen?")){ $.post('/api/user/droppermission',{email:userEmail,permissions:permission},reload,'json'); } } diff --git a/static/templates/listadminlist.st b/static/templates/listadminlist.st index 3a687b6..1375d90 100644 --- a/static/templates/listadminlist.st +++ b/static/templates/listadminlist.st @@ -1,5 +1,5 @@
- List of (editable) mailinglists + Liste der (bearbeitbaren) Mailing-Listen @@ -19,7 +19,7 @@
ListUser
- Add new mailing list + Neue Mailing-Liste anlegen diff --git a/static/templates/listlist.st b/static/templates/listlist.st index 44b32e5..1a3c1c5 100644 --- a/static/templates/listlist.st +++ b/static/templates/listlist.st @@ -1,11 +1,11 @@
- List of (public) mailinglists + Liste der (frei abonnierbaren) Mailing-Listen - - - - + + + +
List NameList AddressStateActionsListen-NameListen-AdresseStatusAktionen