Introduce announcements

Change-Id: I9511ca695b6bc56350343b81b0fad948ad9aa961
diff --git a/Changes b/Changes
index e98910f..30d50bc 100644
--- a/Changes
+++ b/Changes
@@ -1,8 +1,11 @@
-0.3.2 2025-9-29
+0.3.3 2026-01-29
+    - Introduce announcements (diewald)
+
+0.3.2 2025-09-29
     - Bugfix: export of queries containing curly brackets (closes #61 )(hebasta)
     - CI: Build docker image also on tag push (kupietz)
     - Upgrade Jersey to 4.0.0
-    - Upgrade other dependencies following dependabot 
+    - Upgrade other dependencies following dependabot
 
 0.3.1 2024-10-9
     - Produces export template as service (hebasta)
diff --git a/pom.xml b/pom.xml
index 595c3ab..0f0d407 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
   <groupId>de.ids_mannheim.korap</groupId>
   <artifactId>KalamarExportPlugin</artifactId>
   <packaging>jar</packaging>
-  <version>0.3.2</version>
+  <version>0.3.3</version>
   <name>KalamarExportPlugin</name>
   <url>https://korap.ids-mannheim.de/</url>
   
diff --git a/src/main/java/de/ids_mannheim/korap/plkexport/Service.java b/src/main/java/de/ids_mannheim/korap/plkexport/Service.java
index d6c6cf3..b88f8e0 100644
--- a/src/main/java/de/ids_mannheim/korap/plkexport/Service.java
+++ b/src/main/java/de/ids_mannheim/korap/plkexport/Service.java
@@ -720,6 +720,7 @@
         templateData.put("assetPath", uri.build());
         templateData.put("defaultHitc", defaultHitc);
         templateData.put("maxHitc", maxHitc);
+        templateData.put("announcement", prop.getProperty("announcement"));
 
         // There is an error code to pass
         if (code != null) {
diff --git a/src/main/resources/assets/templates/export.ftl b/src/main/resources/assets/templates/export.ftl
index eeed57d..e009892 100644
--- a/src/main/resources/assets/templates/export.ftl
+++ b/src/main/resources/assets/templates/export.ftl
@@ -57,6 +57,11 @@
       #export input[type=radio] {
         vertical-align: top;
       }
+
+      #announcement {
+        font-weight: bold;
+        color: red;
+      }
       
       .button-group.button-panel input[type="submit"]{
         min-width: 20em;
@@ -110,7 +115,11 @@
             </div>
           </fieldset>
 
-          <p>Depending on the settings and add-ons of your browser, it may not be possible to export corpus excerpts that require authentication.</p>
+          <#if announcement??>
+            <p id="announcement">${announcement}</p>
+          </#if>
+          
+          <p>${dict.info}</p>
           
           <fieldset class="form-line">
             <legend>${dict.hitc}</legend>
diff --git a/src/main/resources/locales/export.properties b/src/main/resources/locales/export.properties
index 9066039..49dcbc9 100644
--- a/src/main/resources/locales/export.properties
+++ b/src/main/resources/locales/export.properties
@@ -5,4 +5,5 @@
 export_button = Export
 banner = Experimental
 with_ql = with
-in_cq = in
\ No newline at end of file
+in_cq = in
+info = Depending on the settings and add-ons of your browser, it may not be possible to export corpus excerpts that require authentication.
\ No newline at end of file
diff --git a/src/main/resources/locales/export_de.properties b/src/main/resources/locales/export_de.properties
index 024bec5..4a3aee5 100644
--- a/src/main/resources/locales/export_de.properties
+++ b/src/main/resources/locales/export_de.properties
@@ -8,4 +8,5 @@
 export_button = Exportieren
 banner = Experimentell
 with_ql = mit
-in_cq = in
\ No newline at end of file
+in_cq = in
+info = Abh\u00e4ngig von Ihren Browser-Einstellungen und -Erweiterungen kann der Export von Korpusbelegen, die eine Authentifizierung ben\u00f6tigen, nicht m\u00f6glich sein.
diff --git a/src/test/java/de/ids_mannheim/korap/plkexport/AssetTest.java b/src/test/java/de/ids_mannheim/korap/plkexport/AssetTest.java
index 4a7794f..94599e7 100644
--- a/src/test/java/de/ids_mannheim/korap/plkexport/AssetTest.java
+++ b/src/test/java/de/ids_mannheim/korap/plkexport/AssetTest.java
@@ -139,12 +139,33 @@
         assertTrue("Assets", str.contains("<script src=\"https://ids-mannheim.example/instance/test/js"));
         assertTrue("Assets", str.contains("<link href=\"https://ids-mannheim.example/instance/test/css"));
         assertFalse("Errors", str.contains("dynCall("));
+        assertFalse("Announcement", str.contains("<p id=\"announcement\">"));
 
         properties.setProperty("asset.host", hostTemp);
         properties.setProperty("asset.path", pathTemp != null ? pathTemp : "");
     }
 
     @Test
+    public void testFormHtmlAnnouncements () {
+        ExWSConf.clearProp();
+        Properties properties = ExWSConf.properties(null);
+        String announceTemp = properties.getProperty("announcement");
+        properties.setProperty("announcement", "Test World");
+        
+        Response responsehtml = target("/export").request(MediaType.TEXT_HTML)
+                .get();
+        assertEquals("HTTP Code",
+                Status.OK.getStatusCode(), responsehtml.getStatus());
+        String str = responsehtml.readEntity(String.class);
+        assertTrue("HTTP Body", str.contains("<title>Export</title>"));
+        assertTrue("Announcement", str.contains("<p id=\"announcement\">Test World</p>"));
+        assertTrue("Note", str.contains("on the settings"));
+
+        properties.setProperty("announcement", announceTemp != null ? announceTemp : "");
+    }
+
+    
+    @Test
     public void testFormHtmlExporters () {
         Response responsehtml = target("/export").request(MediaType.TEXT_HTML)
                 .get();