Compare commits

...

92 Commits

Author SHA1 Message Date
Stephan Richter 25e4e81d2e fixed Dockerfile for german language 1 month ago
Stephan Richter 25d3523451 Merge branch 'main' into lang_de 1 month ago
Stephan Richter 7cb23ec883 improved translations 1 month ago
Stephan Richter 70d32a9048 Merge branch 'main' into lang_de 1 month ago
Stephan Richter 0cb8b2a399 Merge branch 'main' into lang_de 1 month ago
Stephan Richter e35c31e74c Merge branch 'main' into lang_de 1 month ago
Stephan Richter baf9e2bda4 Merge branch 'main' into lang_de 1 month ago
Stephan Richter afc088ee35 Merge branch 'main' into lang_de 1 month ago
Stephan Richter 95bbbb29b4 Merge branch 'main' into lang_de 1 month ago
Stephan Richter 1695681064 Merge branch 'main' into lang_de 2 months ago
Stephan Richter 8a175c7f13 Merge branch 'main' into lang_de 2 months ago
Stephan Richter f4c475a3be fixed footer 2 months ago
Stephan Richter bf0001bc03 Fixed bugs: 2 months ago
Stephan Richter 72a9e9f3b9 Merge branch 'main' into lang_de 2 months ago
Stephan Richter 2680166a35 fixed typos 3 months ago
Stephan Richter 4c6087ec91 Merge branch 'main' into lang_de 3 months ago
Stephan Richter 99611fd654 Merge branch 'main' into lang_de 2 years ago
Stephan Richter f225a348a4 fixing translation-related bug 2 years ago
Stephan Richter ae661fc8dc Merge branch 'main' into lang_de 2 years ago
Stephan Richter 700f37d69a Merge branch 'main' into lang_de 2 years ago
Stephan Richter ab8fd66582 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 8492784c03 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 9177851150 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 6eb6fba6f2 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 36e3a8f166 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 0d2672bd63 translation work 2 years ago
Stephan Richter 6752479908 Merge branch 'main' into lang_de 2 years ago
Stephan Richter fad2c0ed52 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 3a7e42b12d fixed typo 2 years ago
Stephan Richter aa7b9ed54b tanslation work 2 years ago
Stephan Richter 19eba91952 Merge branch 'main' into lang_de 2 years ago
Stephan Richter bd68d90faf Merge branch 'main' into lang_de 2 years ago
Stephan Richter 9458b60ec7 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 1ebb64eeaa Merge branch 'main' into lang_de 2 years ago
Stephan Richter 691077bbb1 Merge branch 'main' into lang_de 2 years ago
Stephan Richter c1a5dc65c3 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 7231355117 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 834dc5c457 working on translation 2 years ago
Stephan Richter 0dacf8a697 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 54dd9b92a0 translated post.st 2 years ago
Stephan Richter 228e02b5c8 translated subscject text of confirmation mail 2 years ago
Stephan Richter e4fe5b3fa3 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 9aa7353e64 altered footer url for german branch 2 years ago
Stephan Richter e90bf2b5dd Merge branch 'main' into lang_de 2 years ago
Stephan Richter ec6ca7dad1 Merge branch 'main' into lang_de 2 years ago
Stephan Richter a329f1bb88 Merge branch 'main' into lang_de 2 years ago
Stephan Richter a983faaf5d Merge branch 'main' into lang_de 2 years ago
Stephan Richter a7b1fa5825 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 0e7ef745c4 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 5530f08892 Merge branch 'main' into lang_de 2 years ago
Stephan Richter fef9b78841 Merge branch 'main' into lang_de 2 years ago
Stephan Richter a71bace098 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 9544cd8f19 Merge branch 'main' into lang_de 2 years ago
Stephan Richter e854710031 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 1bb4f2aa17 Merge branch 'main' into lang_de 2 years ago
Stephan Richter f2d456c681 Merge branch 'main' into lang_de 2 years ago
Stephan Richter ac92e03792 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 5d5a1faecf fixed encoding problems on front page 2 years ago
Stephan Richter 49845a076a Merge branch 'main' into lang_de 2 years ago
Stephan Richter 4d2fea5083 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 6f3236a29e Übersetzung erweitert 2 years ago
Stephan Richter fc984007bc Merge branch 'main' into lang_de 2 years ago
Stephan Richter f79884baa0 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 492cbec41d fixed tests for german lang 2 years ago
Stephan Richter f0b54ea48f Merge branch 'main' into lang_de 2 years ago
Stephan Richter 578a748b68 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 05b58cc186 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 4a543b16f6 bugfix 2 years ago
Stephan Richter 42593fcb3c Merge branch 'main' into lang_de 2 years ago
Stephan Richter cb82609387 Merge branch 'main' into lang_de 2 years ago
Stephan Richter dd5a1290c7 Merge branch 'main' into lang_de 2 years ago
Stephan Richter f6417d1a6e Merge branch 'main' into lang_de 2 years ago
Stephan Richter a066e7be32 fixing Dockerfile for german language 2 years ago
Stephan Richter c25316d268 Merge branch 'main' into lang_de 2 years ago
Stephan Richter a909c1e6d6 bugfix 2 years ago
Stephan Richter 7f0d950fd3 Merge branch 'main' into lang_de 2 years ago
Stephan Richter d20a1b6f4b Merge branch 'main' into lang_de 2 years ago
Stephan Richter 74c4eb1b3e working on translation 2 years ago
Stephan Richter 782fcba6b0 updated translations 2 years ago
Stephan Richter ffeb1aa7c0 Merge branch 'main' into lang_de 2 years ago
Stephan Richter bdcbf1f7d1 Merge branch 'main' into lang_de 2 years ago
Stephan Richter d706eac6a7 Merge branch 'main' into lang_de 2 years ago
Stephan Richter 1e90ebc9a2 working on translation 2 years ago
Stephan Richter e3369c9266 working on translation 2 years ago
Stephan Richter de6a1440ae weiter an Übersetzungen gearbeitet 2 years ago
Stephan Richter 2f31d3bae9 Merge branch 'main' into lang_de 2 years ago
Stephan Richter b6e33c2119 Merge branch 'main' into lang_de, working on further translations 2 years ago
Stephan Richter 3ce5d8e8f3 working on german translation 2 years ago
Stephan Richter 37bce804fc Merge branch 'main' into lang_de 2 years ago
Stephan Richter 0f83ce7e82 an Übersetzung gearbeitet 2 years ago
Stephan Richter c74e66ed3c Merge branch 'main' into lang_de 2 years ago
Stephan Richter 5e45aca087 deutsche Übersetzung angefangen 2 years ago
  1. 4
      Dockerfile
  2. 8
      src/main/java/de/srsoftware/widerhall/mail/SmtpClient.java
  3. 115
      src/main/resources/Application.de.translation
  4. 10
      src/test/java/de/srsoftware/widerhall/data/ListMemberTest.java
  5. 22
      static/templates/archive.st
  6. 16
      static/templates/confirmation_mail.st
  7. 2
      static/templates/css.st
  8. 4
      static/templates/footer.st
  9. 33
      static/templates/frontpage.st
  10. 2
      static/templates/index.st
  11. 40
      static/templates/inspect.st
  12. 43
      static/templates/js.st
  13. 24
      static/templates/list_data_form.st
  14. 14
      static/templates/listadminlist.st
  15. 12
      static/templates/listlist.st
  16. 8
      static/templates/listmembers.st
  17. 10
      static/templates/login.st
  18. 2
      static/templates/navigation.st
  19. 10
      static/templates/post.st
  20. 14
      static/templates/register.st
  21. 22
      static/templates/subscribe.st
  22. 8
      static/templates/subscribe_mail.st
  23. 10
      static/templates/unsubscribe.st
  24. 2
      static/templates/userinfo.st
  25. 14
      static/templates/userlist.st

4
Dockerfile

@ -3,8 +3,10 @@ MAINTAINER Stephan Richter <s.richter@srsoftware.de> @@ -3,8 +3,10 @@ MAINTAINER Stephan Richter <s.richter@srsoftware.de>
RUN apk add --no-cache --update bash git maven openjdk17
ENV LC_ALL de_DE.UTF-8
# get the sources
RUN git clone https://git.srsoftware.de/StephanRichter/Widerhall.git
RUN git clone https://git.srsoftware.de/StephanRichter/Widerhall.git -b lang_de
WORKDIR Widerhall
# compile

8
src/main/java/de/srsoftware/widerhall/mail/SmtpClient.java

@ -41,18 +41,18 @@ public class SmtpClient { @@ -41,18 +41,18 @@ public class SmtpClient {
if (session == null) login();
MimeMessage forward = new MimeMessage(session);
var oldSender = message.getFrom()[0].toString();
{ // drop old (from ... comment)
var pos = subject.indexOf(" (from ");
{ // drop old (von ... comment)
var pos = subject.indexOf(" (von ");
while (pos > 0){
var end = subject.indexOf(')',pos);
if (end < pos) break;
subject = (subject.substring(0,pos)+subject.substring(end+1)).trim();
pos = subject.indexOf(" (from ");
pos = subject.indexOf(" (von ");
}
}
if (newSender != null){
forward.setFrom(newSender);
forward.setSubject(subject+" (from "+oldSender+")");
forward.setSubject(subject+" (von "+oldSender+")");
} else {
forward.setFrom(oldSender);
forward.setSubject(subject);

115
src/main/resources/Application.de.translation

@ -0,0 +1,115 @@ @@ -0,0 +1,115 @@
[{}] Please confirm your list subscription : [{}] Bitte bestätigen Sie Ihr Listen-Abonnement
[{}] Subscription complete! : [{}] Abonnement abgeschlossen!
[{}]\: test mail : [{}] Test-Mail
'{}' already in database, but with different password! : '{}' gibt es schon in der Datenbank, hat dort aber ein anderes Passwort!
{} is no member of {} : {} ist nicht Mitglied von {}!
{} is not a member of {} : {} ist nicht Mitglied von {}!
'{}' is not a proper port number! : '{}' ist keine gültige Port-Nummer!
'{}' is not a valid email address! : '{}' ist keine gültige Mailadresse!
{} is now a moderator of {} : {} ist nun ein Moderator der Liste {}
archive : Archiv
awaiting confirmation : erwartet Bestätigung
Confirmation of list membership failed! : Bestätigung des Listen-Abonnements fehlgeschlagen!
Confirmed list subscription! : Listen-Mitgliedschaft bestätigt!
enabled : aktiviert
disabled : deaktiviert
Editing list {} by {} failed : Bearbeiten der Liste {} durch {} fehlgeschlagen!
Email is required for list un-subscription! : Für das Abbestellen ist eine E-Mail-Adresse erforderlich!
Error reading user database! : Fehler beim Lesen der Nutzer-Datenbank!
Failed to access user database\: {} : Fehler beim Zugriff auf die Nutzer-Datenbank: {}
Failed to create list '{}'\: {} : Erzeugen der Liste '{}' fehlgeschlagen: {}
Failed to create new user\: {} : Erzeugen des neuen Nutzers fehlgeschlagen: {}
Failed to handle request\: {} : Konnte Anfrage nicht verarbeiten: {}
Failed to load file '{}'! : Laden der Datei '{}' fehlgeschlagen!
Failed to load list member for {}/{} : Laden der Mitgliedschaft zu {}/{} fehlgeschlagen!
Failed to load member list '{}' : Laden der Mitglieder-Liste von '{}' fehlgeschlagen!
Failed to load post from file! : Laden der Nachricht aus Datei fehlgeschlagen!
Failed to load template '{}' : Laden der Vorlage '{}' fehlgeschlagen!
Failed to load user for {} : Laden des Nutzers zu {} fehlgeschlagen!
Failed to load user for address {} : Laden des Nutzers für die Adresse {} fehlgeschlagen!
Failed to make {} a moderator of {} : Ernennen von {} zum Moderator von {} fehlgeschlagen!
Failed to make {} a subscriber of {} : Ernennen von {} zum regulären Abonnenten von {} fehlgeschlagen!
Failed to send email to {} : Senden der Email an {} fehlgeschlagen!
Failed to send request confirmation email\: {} : Senden der Bestätigungs-Email fehlgeschlagen: {}
Failed to send test email to {} : Senden der Test-Email an {} fehlgeschlagen!
Failed to (un)hide mailing list\: : Veröffentlichen/Verstekcen der Mailing-Liste fehlgeschlagen:
Failed to un-subscribe {} from {} : Abbestellen von {} / {} fehlgeschlagen!
Failed to unsubscribe! : Abbestellen der Mailin-Liste fehlgeschlagen!
Failed to update list '{}' : Aktualisieren der Liste '{}' fehlgeschlagen!
Failed to update MailingList! : Aktualisierung der Mailing-Liste fehlgeschlagen!
Fill all fields, please! : Bitte alle Felder ausfüllen!
File {} does not exist! : Datei {} existiert nicht!
Find the forwarded message in the attachment(s)!\n : Die weitergeleitete Nachricht findest du im Anhang dieser E-Mail!\n
forward_attached : als Anhang weiterleiten
hidden : versteckt
hide_receivers : Empfänger verbergen
If you received this mail, the SMTP settings of your mailing list are correct. : Wenn Sie diese Nachricht empfangen haben, sind die SMTP-Einstellungen Ihrer Mailing-Liste korrekt.
IMAP credentials are required! : IMAP-Zugangsdaten sind erforderlich!
Invalid or missing token : Ungültiger oder fehlender Token!
Invalid username/password : Ungültiger Nutzername oder ungültiges Passwort!
Invalid email/password combination! : Ungültige E-Mail-/Passwort-Kombination!
List '{}' requires attention! : Liste '{}' erfordert Aufmerksamkeit!
List {} disabled, closed for subscribers and hidden. Members have been removed. : Liste {} deaktiviert, Abonnement gesperrt, Liste de-publiziert. Mitglieder wurden entfernt.
List email ({}) is not a valid email address! : Listen-E-Mail-Adresse ({}) ist keine gültige E-Mail-Adresse!
List name and address are required! : Name und Adresse der Liste sind notwendige Felder!
made public : veröffentlicht
Mailing list '{}' was {}! : Mailing-Liste '{}' wurde {}!
Message deleted : Nachricht gelöscht
missing user email address! : E-Mail-Adresse des Listenmitglieds nicht angegeben!
Missing username or password! : Nutzername oder Passwort fehlen!
moderator : Moderator
Name and email are required fields for list subscription! : Name und E-Mail-Adresse sind für das Abonnieren der Mailingliste erforderlich!
no : nein
No handler for path {}! : Kein Handler für den Pfad '{}'!
no list email provided! : Keine Listen-Email übertragen!
No list provided by form data! : Formular-Daten enthalten keine Liste!
No such user\: {} : Kein solcher Nutzer: {}
No template for path '{}'! : Keine Vorlage für den Pfad '{}' vorhanden!
No valid mailing list provided! : Keine gültige MailingListe übermittelt!
no valid permissions provided! : Keine gültigen Berechtigungen übergeben!
Not logged in! : Nicht eingeloggt!
open_for_guests : Gästbeiträge erlaubt
open_for_subscribers : Selbstregistrierung
original_from : ursprünglicher Absender
owner : Besitzer
Passwords do not match! : Passworte stimmen nicht überein!
Password to short or to simple! : Passwort zu kurz oder zu einfach!
Problem during unscubsription of {} from {}\: : Es ist ein Problem beim Austragen von {} aus der Liste {} aufgetreten:
public : öffentlich
Query '{}' failed\: : Query '{}' fehlgeschlagen:
reply_to_list : Antwort an Liste
Sent confirmation mail to '{}. : Bestätigungs-Email wurde an '{} versendet.
SMTP credentials are required! : SMTP-Zugangsdaten sind erforderlich!
subscriber : Abonniert
Subscription failed\: {} : Abonnieren der Liste fehlgeschlagen: {}
Sucessfully updated MailingList! : Mailing-Liste aktualisiert!
Successfully subscribed '{}' to '{}'. : '{}' hat die Mailingliste '{}' erfolgreich abonniert.
Sucessfully un-subscribed from '{}'. : '{}' erfolgreich abbestellt.
Templates have been reloaded : Vorlagen wurden neu geladen!
The mailing list you are trying to view does not exist! : Die Mailingliste, auf die Sie zugreifen wollen, gibt es nicht!
This list received an email from {}, who is not member of the list.\nThe email has been moved to the '{}' folder.\nYou may manually forward this message or drop it. : Diese Liste hat eine E-Mail von {} empfangen. Der Absender ist nicht Mitglied der Liste.\nDie Email wurde in den '{}'-Ordner verschoben.\nSie können die Nachricht manuell weiterleiten oder verwerfen.
Unknown user or token : Nutzer oder Token unbekannt!
Updated user permissions : Nutzer-Berechtigungen aktualisiert
User database is empty. Create admin user first\: : Nutzer-Datenbank ist leer. Admin-Nutzer wird hiermit angelegt:
Was not able to check existence of table {}! : Konnte Existenz der Tabelle {} nicht prüfen!
Was not able to redirect to {} page\: {} : Weiterleitung nach {} fehlgeschlagen: {}
yes : ja
You already are member of this list! : Sie haben diese Liste bereits abonniert!
You are not allowed to access the archive of this list! : Du hast keine Berechtigung, das Archiv dieser Liste anzusehen!
You are not allowed to alter user permissions! : Sie haben nicht die Berechtigung, um Berechtigungen zu ändern!
You are not allowed to create new mailing lists! : Ihnen ist es nicht gestattet, neue Mailinglisten anzulegen!
You are not allowed to edit '{}' : Du bist nicht berechtigt, '{}' zu bearbeiten!
You are not allowed to edit mods of {} : Es ist dir nicht gestattet, die Moderatoren von {} zu verändern!
You are not allowed to join {}! : Ihnen ist es nicht gestattet, '{}' zu abonnieren!
You are not allowed to list members of '{}' : Es ist dir nicht gestattet, die Mitglieder von '{}' aufzulisten!
You are not allowed to nominate new mods for {} : Es ist dir nicht gestattet, neue Moderatoren für {} zu ernennen!
You are not allowed to remove members of {} : Es ist dir nicht erlaubt, Mitglieder von {} zu entfernen!
You are not allowed to remove the list owner! : Du kannst den Listen-Besitzer nicht entfernen!
You are not allowed to remove this list! : Es ist dir nicht gestattet, diese Liste zu löschen!
You are not allowed to subscribe to '{}'! : Es ist ihnen nicht gestattet, '{}' zu abonnieren!
You are not allowed to test '{}' : Es ist dir nicht gestattet, '{}' zu testen
You are not alter settings of this list! : Es ist Ihnen nicht gestattet, die Einselltungen dieser Mailingliste zu verändern!
You are trying to access a non-existing list! : Du versuchst auf eine nicht existierende Liste zuzugreifen!
You have tried to send a message to the list '{}', which failed. This is because you are not a (privileged) member of this list.\n : Sie haben versucht, eine Nachricht an die Liste '{}' zu senden. Das wurde verweigert, da Sie kein Mitglied der Liste (mit entsprechenden Berechtigungen) sind.\n
You may go to {} and subscribe to the list, then try again. : Sie können zu {} gehen und die Liste abonnieren. Versuchen Sie es danach erneut.
Your message to {} was rejected! : Ihre Nachricht an {} wurde zurückgewiesen!

10
src/test/java/de/srsoftware/widerhall/data/ListMemberTest.java

@ -112,7 +112,7 @@ public class ListMemberTest extends TestCase { @@ -112,7 +112,7 @@ public class ListMemberTest extends TestCase {
public void testSafeMap() {
var user = new User("email","name","salt","hash",0);
var lm = new ListMember(null,user,ListMember.STATE_AWAITING_CONFIRMATION,"token");
assertEquals(Map.of(EMAIL,"email",NAME,"name",STATE,"awaiting confirmation"),lm.safeMap());
assertEquals(Map.of(EMAIL,"email",NAME,"name",STATE,"erwartet Bestätigung"),lm.safeMap());
}
public void testStateText() {
@ -121,10 +121,10 @@ public class ListMemberTest extends TestCase { @@ -121,10 +121,10 @@ public class ListMemberTest extends TestCase {
var mod = new ListMember(null,null,ListMember.STATE_MODERATOR,null);
var await = new ListMember(null,null,ListMember.STATE_AWAITING_CONFIRMATION,null);
assertEquals("subscriber",guest.stateText());
assertEquals("moderator, owner, subscriber",owner.stateText());
assertEquals("moderator, subscriber",mod.stateText());
assertEquals("awaiting confirmation",await.stateText());
assertEquals("Abonniert",guest.stateText());
assertEquals("Abonniert, Besitzer, Moderator",owner.stateText());
assertEquals("Abonniert, Moderator",mod.stateText());
assertEquals("erwartet Bestätigung",await.stateText());
}
public void testToken() {

22
static/templates/archive.st

@ -5,21 +5,21 @@ @@ -5,21 +5,21 @@
«navigation()»
«userinfo()»
«messages()»
<h1>«data.list»&nbsp; &nbsp;List Archive</h1>
<h1>«data.list»&nbsp; &nbsp;Listen-Archiv</h1>
<fieldset>
<legend>Subscription</legend>
<a href="subscribe?list=«data.list»">subscribe</a>
<a href="unsubscribe?list=«data.list»">un-subscribe</a>
<legend>Abonnement</legend>
<a href="subscribe?list=«data.list»">abonnieren</a>
<a href="unsubscribe?list=«data.list»">abbestellen</a>
</fieldset>
«if(data.month)»
<table>
<tr>
<th>Date</th>
<th>From</th>
<th>Subject</th>
<th>Datum</th>
<th>Absender</th>
<th>Betreff</th>
«if (data.moderator)»
<th>Actions</th>
<th>Aktionen</th>
«endif»
</tr>
</table>
@ -29,8 +29,8 @@ @@ -29,8 +29,8 @@
«else»
<table>
<tr>
<th>Month</th>
<th>Number of messages</th>
<th>Monat</th>
<th>Zahl der Nachrichten</th>
</tr>
</table>
<script type="text/javascript">
@ -39,4 +39,4 @@ @@ -39,4 +39,4 @@
«endif»
«footer()»
</body>
</html>
</html>

16
static/templates/confirmation_mail.st

@ -1,17 +1,17 @@ @@ -1,17 +1,17 @@
Welcome, «data.user.name»!
Willkommen, «data.user.name»!
You successfully subscribed to the "«data.list.name»" Mailing list!
Du hast die «data.list.name»-Liste erfolgreich abonniert!
«if(data.open_list)»
This is an open list. This means you may, at any time, send emails to «data.list.email.prefix»@«data.list.email.domain» and we will forward your mail to the other subscribers.
Dabei handelt es sich um eine offene Liste. Das bedeutet, du kannst jederzeit E-Mails an «data.list.email.prefix»@«data.list.email.domain» senden, und wir werden diese an alle anderen Abonnenten weiterleiten.
«else»
This is a moderated list. This means, you (and all other subscribers) will receive any mails sent by a moderator. However, if you write (answer) messages to the list, only the moderators will receive your mail.
Dabei handelt es sich um eine moderierte Liste. Das bedeutet, du (und alle anderen Abonnenten) empfangen die Mails von den Moderatoren. Wenn du jedoch auf Mails von der Liste antwortest, wird deine Antwort auch nur an die Moderatoren zugestelt!
«endif»
If you want to answer exclusively to the author of an email you received via the list, you may find the respective address in the head of the received email.
Wenn du ausschließlich dem Absender einer Email, die über die Liste kam, antworten willst, findest du die entsprechende Adresse im Kopf der empfangenen E-Mail.
If you wish to leave the list, you may, at any time, go to «data.url» and un-subscribe.
Wenn du die Liste verlassen willst, kannst du jederzeit zu «data.url» gehen um dein Abonnement zu kündigen.
best wishes,
liebe Grüße,
Stephan Richter (the software author)
Stephan Richter (der Software-Autor)

2
static/templates/css.st

@ -21,7 +21,7 @@ form#list_data, @@ -21,7 +21,7 @@ form#list_data,
#login form,
#register form,
#subscribe form{
width: 450px;
width: 500px;
margin: 0 auto;
}

4
static/templates/footer.st

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
<div class="footer">
Widerhall Mail Distributor.
Widerhall Mail-Verteiler.
Version 1.0.2.
Get the sources at <a target="_blank" href="https://git.srsoftware.de/StephanRichter/Widerhall">git.srsoftware.de</a>
Hol dir den Quellcode auf <a target="_blank" href="https://git.srsoftware.de/StephanRichter/Widerhall/src/branch/lang_de">git.srsoftware.de</a>
</div>

33
static/templates/frontpage.st

@ -6,40 +6,41 @@ @@ -6,40 +6,41 @@
<link rel="stylesheet" href="web/css" />
</head>
<body>
<h1>Widerhall front page</h1>
If you are looking for you mailing lists, <a href="web/index">Go to the /web page</a>...
<h1>Widerhall Startseite</h1>
Falls du zu den Mailing-Listen willst, <a href="web/index">Gehe zur Seite /web</a>...
<fieldset>
<legend>What is <em>Widerhall</em>?</legend>
<legend>Was ist <em>Widerhall</em>?</legend>
<p>
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 erlaubt die Pflege von Mailverteilern mit der Option diese für Jedermann abonnierbar zu machen.
</p>
</fieldset>
<fieldset>
<legend>Why should I use <em>Widerhall</em>?</legend>
<legend>Warum sollte ich <em>Widerhall</em> nutzen?</legend>
<p>
Compared to other mailing list systems, Widerhall is very lightweight:
Im Vergleich mit anderen Mailing-Listen-Systemen ist <em>Widerhall</em> sehr schlank:
</p>
<p>
It contains no mailserver stack. It does not even require you to set up a mailserver!
Es enthält keinen eigenen Mailserver. Für <em>Widerhall</em> musst du nichtmal einen eigenen Mailserver aufsetzen!
</p>
</fieldset>
<fieldset>
<legend>How does it work?</legend>
<legend>Wie funktioniert das?</legend>
<p>
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.
</p>
<p>
That's it.
Das ist alles.
</p>
</fieldset>
<fieldset>
<legend>Credits</legend>
I`m very grateful to the people who supported me writing and testing this software:
Ich bin allen Leuten, die mich beim Schreiben und Testen der Software unterstützt haben sehr dankbar:
<ul>
<li>Erik Heinz for sharing his knowledge on email protocols and pitfalls</li>
<li>Stefanie Handke for pointing me to CSS issues</li>
<li>Erik Heinz dafür, dass er sein Wissen um das E-Mail-Protokoll und damit verbundene Fettnäpfchen mit mir geteilt hat</li>
<li>Stefanie Handke für Hinweise zum Design</li>
</ul>
</fieldset>
«footer()»

2
static/templates/index.st

@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
«navigation()»
«userinfo()»
«messages()»
<h1>Widerhall Index page</h1>
<h1>Widerhall Index-Seite</h1>
«listlist()»
«footer()»
</body>

40
static/templates/inspect.st

@ -5,62 +5,62 @@ @@ -5,62 +5,62 @@
«navigation()»
«userinfo()»
«messages()»
<h1>Widerhall '«data.list»' Details</h1>
<h1>Widerhall '«data.list»'-Details</h1>
<form method="POST">
<fieldset>
<legend>Settings</legend>
This page shows configuration options for the mailing list. To edit login credentials, goto <a href="edit_list?list=«data.list»">edit list</a>
<legend>Einstellungen</legend>
Diese Seite zeigt Konfigurations-Optionen für die Mailingliste. Um Login-Daten zu ändern, gehe zu <a href="edit_list?list=«data.list»">Listenbearbeitung</a>.
<fieldset>
<legend>Forward permissions</legend>
<legend>Weiterleitungs-Rechte</legend>
<p>
Who is allowed to distribute mails via «data.list»?
Wem ist es erlaubt, Nachrichten via «data.list» zu verteilen?
</p>
Oweners and Moderators
Besitzer und Moderatoren
<label>
<input type="checkbox" name="open_for_subscribers" />
All subscribers
Allen Abonnenten
</label>
<label>
<input type="checkbox" name="open_for_guests" />
Everyone (i.e. non members, DANGER!)
Allen (m.a.W.: auch Nicht-Abonnenten, GEFAHR!)
</label>
</fieldset>
<fieldset>
<legend>Forward options</legend>
<legend>Weiterleitungs-Optionen</legend>
<label>
<input type="checkbox" name="forward_from" />
Forward using original sender
<input type="checkbox" name="forward_from"/>
Ursprünglichen Absender beim Weiterleiten verwenden
</label>
<label>
<input type="checkbox" name="reply_to_list" />
Set list adddress in "ReplyTo" header
Listen-Adresse im ReplyTo-Header setzen
</label>
<label>
<input type="checkbox" name="forward_attached" />
Append original message as attachment
Ursprüngliche Nachricht beim Weiterleiten als Anhang versenden
</label>
<label>
<input type="checkbox" name="hide_receivers" />
Hide receivers (using BCC)
Emfänger voreinander verbergen (BCC benutzen)
</label>
</fieldset>
<fieldset>
<legend>Other options</legend>
<legend>andere Optionen</legend>
<label>
<input type="checkbox" name="archive" />
Collect messages in public archive
Nachrichten in öffentlichem Archiv sammeln
</label>
<label>
<input type="checkbox" name="edit_mods" />
Moderators may edit list of moderators
Moderatoren können die Liste der Moderatoren bearbeiten
</label>
<label>
<input type="checkbox" name="delete_messages" />
Delete messages after
<input type="number" name="hold_time" /> days.
Nachrichten nach
<input type="number" name="hold_time" /> Tagen löschen
</label>
</fieldset>
<button type="submit">Save</button>
<button type="submit">Speichern</button>
</fieldset>
</form>
«listmembers()»

43
static/templates/js.st

@ -3,7 +3,7 @@ function addMod(userEmail,listEmail){ @@ -3,7 +3,7 @@ function addMod(userEmail,listEmail){
}
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');
}
}
@ -30,7 +30,7 @@ function dropMod(userEmail,listEmail){ @@ -30,7 +30,7 @@ function dropMod(userEmail,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');
}
}
@ -93,7 +93,7 @@ function showListArchive(data){ @@ -93,7 +93,7 @@ function showListArchive(data){
$('<td/>').html('<a href="'+url+'">'+post.from_name+'</a>').appendTo(row);
$('<td/>').html('<a href="'+url+'">'+post.subject+'</a>').appendTo(row);
if (moderator){
$('<button/>',{onclick:"dropMail('"+post.id+"');"}).text('Delete').appendTo($('<td/>')).appendTo(row);
$('<button/>',{onclick:"dropMail('"+post.id+"');"}).text('Löschen').appendTo($('<td/>')).appendTo(row);
}
row.appendTo($('#archive table'));
}
@ -145,17 +145,18 @@ function showListOfModeratedLists(data){ @@ -145,17 +145,18 @@ function showListOfModeratedLists(data){
let action = selected.val();
let verb = selected.text();
let list = $(this).attr('name');
if (confirm("This will "+verb+" '"+list+"'. Are you sure?")) self[action+'List'](list);
if (confirm("Dies wird '"+list+"' "+verb+". Sind Sie sicher?")) self[action+'List'](list);
});
$('<option/>').text('Actions').appendTo(select);
$('<option/>').text('Aktionen').appendTo(select);
Object.entries({
'enable':'enable',
'disable':'disable',
'drop':'drop',
'hide':'hide',
'show':'show',
'test':'test'
'enable':'aktivieren',
'disable':'deaktivieren',
'drop':'löschen',
'hide':'verstecken',
'show':'veröffentlichen',
'test':'testen'
}).forEach(([k,v],i) => {
$('<option/>',{value:k}).text(v).appendTo(select)
});
@ -188,8 +189,8 @@ function showListList(data){ @@ -188,8 +189,8 @@ function showListList(data){
}
$('<td/>').text(states.toString()).appendTo(row);
let td = $('<td/>',{class:'actions'});
$('<button/>',{onclick:"subscribeTo('"+email+"');"}).text('subscribe').appendTo(td);
$('<button/>',{onclick:"unsubscribeFrom('"+email+"');"}).text('unsubcribe').appendTo(td);
$('<button/>',{onclick:"subscribeTo('"+email+"');"}).text('abonnieren').appendTo(td);
$('<button/>',{onclick:"unsubscribeFrom('"+email+"');"}).text('abbestellen').appendTo(td);
td.appendTo(row);
row.appendTo('#listlist');
@ -219,10 +220,10 @@ function showMembers(data){ @@ -219,10 +220,10 @@ function showMembers(data){
$('<td/>').text(member.state).appendTo(row);
let col = $('<td/>');
console.log("data",data);
if (member.state.includes("moderator")) {
if (!member.state.includes("owner")) $('<button/>',{onclick:'dropMod("'+member.email+'","'+list_mail+'")'}).text("- moderator").appendTo(col);
} else $('<button/>',{onclick:'addMod("'+member.email+'","'+list_mail+'")'}).text("+ moderator").appendTo(col);
if (!member.state.includes("owner")) $('<button/>',{onclick:'dropMember("'+member.email+'","'+list_mail+'")'}).text("remove").appendTo(col);
if (member.state.includes("Moderator")) {
if (!member.state.includes("Besitzer")) $('<button/>',{onclick:'dropMod("'+member.email+'","'+list_mail+'")'}).text("- Moderator").appendTo(col);
} else $('<button/>',{onclick:'addMod("'+member.email+'","'+list_mail+'")'}).text("+ Moderator").appendTo(col);
if (!member.state.includes("Besitzer")) $('<button/>',{onclick:'dropMember("'+member.email+'","'+list_mail+'")'}).text("entfernen").appendTo(col);
col.appendTo(row);
row.appendTo('#memberlist');
@ -241,14 +242,14 @@ function showUserList(data){ @@ -241,14 +242,14 @@ function showUserList(data){
let permissions = $('<span/>');
if (isAdmin){
if (user.permissions.includes('admin')){
$('<button/>').text("- admin").click(() => dropPermission(user.email,1)).appendTo(permissions);
$('<button/>').text("- Admin").click(() => dropPermission(user.email,1)).appendTo(permissions);
} else {
$('<button/>').text("+ admin").click(() => addPermission(user.email,1)).appendTo(permissions);
$('<button/>').text("+ Admin").click(() => addPermission(user.email,1)).appendTo(permissions);
}
if (user.permissions.includes('create lists')){
$('<button/>').text("- create lists").click(() => dropPermission(user.email,2)).appendTo(permissions);
$('<button/>').text("- Listen anlegen").click(() => dropPermission(user.email,2)).appendTo(permissions);
} else {
$('<button/>').text("+ create lists").click(() => addPermission(user.email,2)).appendTo(permissions);
$('<button/>').text("+ Listen anlegen").click(() => addPermission(user.email,2)).appendTo(permissions);
}
}
permissions.appendTo(row);

24
static/templates/list_data_form.st

@ -1,19 +1,19 @@ @@ -1,19 +1,19 @@
<form id="list_data" method="POST">
<fieldset>
<legend>List configuration</legend>
<legend>Listen-Konfiguration</legend>
<fieldset>
<legend>Basic data</legend>
<legend>Basisdaten</legend>
<label>
<input type="text" name="name" value="«if(data.name)»«data.name»«else»«data.list.name»«endif»" id="name" />
List name
Name der Mailing-Liste
</label>
<label>
<input type="text" name="email" value="«if(data.email)»«data.email»«else»«data.list.email.prefix»@«data.list.email.domain»«endif»" id="email" />
List E-Mail Address
Email-Adresse der ML
</label>
</fieldset>
<fieldset>
<legend>IMAP protocol</legend>
<legend>IMAP-Protocoll</legend>
<label>
<input type="text" name="imap_host" value="«if(data.imap_host)»«data.imap_host»«else»«data.list.imap_host»«endif»" id="imap_host" />
Hostname
@ -24,19 +24,19 @@ @@ -24,19 +24,19 @@
</label>
<label>
<input type="text" name="imap_user" value="«if(data.imap_user)»«data.imap_user»«else»«data.list.imap_user»«endif»" id="imap_user" />
Username
Benutzername
</label>
<label>
<input type="password" name="imap_pass" value="«data.imap_pass»" id="imap_pass" />
Password
Passwort
</label>
<label>
<input type="text" name="inbox" value="«if(data.inbox)»«data.inbox»«else»INBOX«endif»" id="imap_inbox" />
Inbox name
Name des Posteingangs-Ordners
</label>
</fieldset>
<fieldset>
<legend>SMTP protocol</legend>
<legend>SMTP-Protocoll</legend>
<label>
<input type="text" name="smtp_host" value="«if(data.smtp_host)»«data.smtp_host»«else»«data.list.smtp_host»«endif»" id="smtp_host" />
Hostname
@ -47,13 +47,13 @@ @@ -47,13 +47,13 @@
</label>
<label>
<input type="text" name="smtp_user" value="«if(data.smtp_user)»«data.smtp_user»«else»«data.list.smtp_user»«endif»" id="smtp_user" />
Username
Benutzername
</label>
<label>
<input type="password" name="smtp_pass" value="«data.smtp_pass»" id="smtp_pass" />
Password
Passwort
</label>
</fieldset>
<button type="submit">Save mailing list</button>
<button type="submit">Mailing-Liste speichern</button>
</fieldset>
</form>

14
static/templates/listadminlist.st

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
<fieldset>
<legend>List of (editable) mailinglists</legend>
<legend>Liste der (bearbeitbaren) Mailing-Listen</legend>
<table id="listlist">
<tr>
<th colspan="4">List</th>
@ -8,18 +8,18 @@ @@ -8,18 +8,18 @@
</tr>
<tr>
<th>Name</th>
<th>Address</th>
<th>State</th>
<th>Last error</th>
<th>Actions</th>
<th>Adresse</th>
<th>Status</th>
<th>Letzter Fehler</th>
<th>Aktionen</th>
<th>Host</th>
<th>Port</th>
<th>Inbox</th>
<th>Posteingang</th>
<th>Host</th>
<th>Port</th>
</tr>
</table>
<a href="add_list">Add new mailing list</a>
<a href="add_list">Neue Mailing-Liste anlegen</a>
<script type="text/javascript">
loadListOfModeratedLists();
</script>

12
static/templates/listlist.st

@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
<fieldset>
<legend>List of (public) mailinglists</legend>
<legend>Liste der (frei abonnierbaren) Mailing-Listen</legend>
<p>
Click on the name of a list, to see it`s archive (if enabled).
Klicke auf den Name einer Liste, um deren Archiv einzusehen (falls aktiviert).
</p>
<table id="listlist">
<tr>
<th>List Name</th>
<th>List Address</th>
<th>State</th>
<th>Actions</th>
<th>Listen-Name</th>
<th>Listen-Adresse</th>
<th>Status</th>
<th>Aktionen</th>
</tr>
</table>
<script type="text/javascript">

8
static/templates/listmembers.st

@ -1,11 +1,11 @@ @@ -1,11 +1,11 @@
<fieldset>
<legend>Members of «data.list»</legend>
<legend>Abonnenten von «data.list»</legend>
<table id="memberlist">
<tr>
<th>Name</th>
<th>Email</th>
<th>State</th>
<th>Actions</th>
<th>E-Mail</th>
<th>Status</th>
<th>Aktionen</th>
</tr>
</table>
<script type="text/javascript">

10
static/templates/login.st

@ -4,19 +4,19 @@ @@ -4,19 +4,19 @@
<body id="login">
«navigation()»
«messages()»
<h1>Widerhall login</h1>
<h1>Widerhall Login</h1>
<form method="POST">
<fieldset>
<legend>Login credentials</legend>
<legend>Zugangsdaten</legend>
<label>
<input type="text" name="email" value="«data.email»" id="email" />
Email address
E-Mail Adresse
</label>
<label>
<input type="password" name="pass" value="" id="password" />
Password
Passwort
</label>
<button type="submit">Login</button>
<button type="submit">Einloggen</button>
</fieldset>
</form>
</body>

2
static/templates/navigation.st

@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
<script type="text/javascript">
if ('«data.user.permissions»'.includes('admin')){
$('<a/>',{class:'button',href:'reload'}).text('Reload templates').appendTo($('nav'));
$('<a/>',{class:'button',href:'reload'}).text('Templates neu laden').appendTo($('nav'));
}
</script>
</nav>

10
static/templates/post.st

@ -5,22 +5,22 @@ @@ -5,22 +5,22 @@
«navigation()»
«userinfo()»
«messages()»
<h1>Widerhall Archive:</h1>
<h1>Widerhall-Archiv:</h1>
<table id="post">
<tr>
<th>Date</th>
<th>Datum</th>
<td>«data.date»</td>
</tr>
<tr>
<th>From</th>
<th>Absender</th>
<td>«data.from_name»</td>
</tr>
<tr>
<th>Subject</th>
<th>Betreff</th>
<td>«data.subject»</td>
</tr>
<tr>
<th>Content</th>
<th>Inhalt</th>
<td><pre>«data.text»</pre></td>
</tr>
</table>

14
static/templates/register.st

@ -4,28 +4,28 @@ @@ -4,28 +4,28 @@
<body id="register">
«navigation()»
«userinfo()»
<h1>Widerhall user registration</h1>
<h1>Widerhall Nutzer-Registrierung</h1>
«messages()»
<form method="POST" action="register">
<fieldset>
<legend>User credentials</legend>
<legend>Zugangsdaten</legend>
<label>
<input type="text" name="name" value="«data.name»" id="name" />
Your name
Ihr Name
</label>
<label>
<input type="text" name="email" value="«data.email»" id="email" />
E-Mail Address
E-Mail-Adresse
</label>
<label>
<input type="password" name="pass" value="" id="password" />
Password
Passwort
</label>
<label>
<input type="password" name="pass_repeat" value="" id="password_repeated" />
Password (repeat)
Passwort (wiederholen)
</label>
<button type="submit">Save new user</button>
<button type="submit">Neuen Nutzer speichern</button>
</fieldset>
</form>
«footer()»

22
static/templates/subscribe.st

@ -5,32 +5,32 @@ @@ -5,32 +5,32 @@
«navigation()»
«userinfo()»
«messages()»
<h1>Widerhall Subscription</h1>
<h1>Widerhall Abonnieren</h1>
<form method="POST">
<input type="hidden" name="list" value="«data.list»" />
<fieldset>
<legend>Suscribe to "«data.list»"</legend>
<legend>Abonnieren von "«data.list»"</legend>
<label>
<input type="text" name="name" value="«if(data.name)»«data.name»«else»«data.user.name»«endif»">
Name
</label>
<label>
<input type="text" name="email" value="«if(data.email)»«data.email»«else»«data.user.email»«endif»">
Email
E-Mail
</label>
<label>
<input type="password" name="password">
Password (optional)
Passwort (optional)
</label>
<button type="submit">Subscribe</button>
<button type="submit">Abonnieren</button>
</fieldset>
<fieldset>
<legend>Password or not?</legend>
<h3>pro password</h3>
You will need a password, if you don`t want anybody except you to un-subscribe you from the list.
Also, if you are about to receive a promotion to a list moderator, you will need a password.
<h3>contra password</h3>
If you won't get a promotion, and just don't want to remember another password, don`t set one.
<legend>Passwort oder nicht?</legend>
<h3>Pro Passwort</h3>
Du brauchst ein Passwort, wenn du verhindern willst, dass außer dir jemand dein Listen-Abo kündigt.
Auch wenn du vorhast, dich zum Listen-Moderator erheben zu lassen, wirst du ein Passwort brauchen.
<h3>Contra Passwort</h3>
Wenn du kein Moderator werden willst, und auch keine Lust hast dir noch ein Passwort zu merken, vergib keines!
</fieldset>
</form>
«footer()»

8
static/templates/subscribe_mail.st

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
Welcome to the "«list_name»" Mailing list subscription!
Willkommen beim Abo-Service der Mailing-Liste «list_name»!
Someone, probably you, tried to register your email address!
If that was you, go to «url» in order to complete your list subscription.
Jemand wahrscheinlich du selbst hat versucht deine E-Mail bei der Liste zu registrieren!
Falls du das warst, geh bitte zu «url» , um dein Abonnement abzuschließen!
If you did not wish to subscribe to the list, you may ignore this mail.
Falls du dich gar nicht bei dieser Liste eintragen wolltest, kannst du die Mail einfach ignorieren.

10
static/templates/unsubscribe.st

@ -5,19 +5,19 @@ @@ -5,19 +5,19 @@
«navigation()»
«userinfo()»
«messages()»
<h1>Widerhall Subscription</h1>
<h1>Widerhall Abonnieren</h1>
<form method="POST">
<fieldset>
<legend>Un-subscribe from "«data.list»"</legend>
<legend>"«data.list»" abbestellen</legend>
<label>
<input type="text" name="email" value="«if(data.email)»«data.email»«else»«data.user.email»«endif»">
Email
E-Mail
</label>
<label>
<input type="password" name="password">
Password (optional)
Passwort (optional)
</label>
<button type="submit">Un-subscribe</button>
<button type="submit">Abbestellen</button>
</fieldset>
</form>
«footer()»

2
static/templates/userinfo.st

@ -1,3 +1,3 @@ @@ -1,3 +1,3 @@
«if(data.user)»
<div class="user">Logged in as <em>«data.user.name»</em></div>
<div class="user">Als <em>«data.user.name»</em> angemeldet</em></div>
«endif»

14
static/templates/userlist.st

@ -1,15 +1,15 @@ @@ -1,15 +1,15 @@
<fieldset>
<legend>User list</legend>
<legend>Nutzer-Liste</legend>
<table id="userlist">
<tr>
<th>User name</th>
<th>Email</th>
<th>Password</th>
<th>Permissions</th>
<th>Actions</th>
<th>Benutzername</th>
<th>E-Mail</th>
<th>Passwort</th>
<th>Berechtigungen</th>
<th>Aktionen</th>
</tr>
</table>
<a href="register">Register new user</a>
<a href="register">neuen Nutzer anlegen</a>
<script type="text/javascript">
loadUserList();
</script>

Loading…
Cancel
Save