diff --git a/HowToAddNewLanguage.md b/HowToAddNewLanguage.md
index 50cb067e..16d457f7 100644
--- a/HowToAddNewLanguage.md
+++ b/HowToAddNewLanguage.md
@@ -18,9 +18,7 @@ Any SVG flags are fine; most of the current ones were sourced from [here](https:
For example, to add Polish, you would add:
```html
-
-
Polski
-
+
Polski
```
The `data-bs-language-code` is the code used to reference the file in the next step.
diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java
index 6597be25..a3379df3 100644
--- a/src/main/java/stirling/software/SPDF/config/AppConfig.java
+++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java
@@ -4,6 +4,7 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.List;
import java.util.Properties;
import java.util.function.Predicate;
@@ -74,6 +75,11 @@ public class AppConfig {
: "null";
}
+ @Bean(name = "languages")
+ public List languages() {
+ return applicationProperties.getUi().getLanguages();
+ }
+
@Bean(name = "navBarText")
public String navBarText() {
String defaultNavBar =
diff --git a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java
index 41e173c7..3b2026bf 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java
@@ -2,7 +2,9 @@ package stirling.software.SPDF.controller.api;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -26,11 +28,11 @@ public class AdditionalLanguageJsController {
@Hidden
@GetMapping(value = "/additionalLanguageCode.js", produces = "application/javascript")
public void generateAdditionalLanguageJs(HttpServletResponse response) throws IOException {
- List supportedLanguages = languageService.getSupportedLanguages();
+ Set supportedLanguages = languageService.getSupportedLanguages();
response.setContentType("application/javascript");
PrintWriter writer = response.getWriter();
// Erstelle das JavaScript dynamisch
- writer.println("const supportedLanguages = " + toJsonArray(supportedLanguages) + ";");
+ writer.println("const supportedLanguages = " + toJsonArray(new ArrayList<>(supportedLanguages)) + ";");
// Generiere die `getDetailedLanguageCode`-Funktion
writer.println(
"""
diff --git a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java
index 0aadc2d7..fefb096e 100644
--- a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java
+++ b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java
@@ -36,8 +36,9 @@ public class DatabaseWebController {
}
List backupList = databaseService.getBackupList();
model.addAttribute("backupFiles", backupList);
- model.addAttribute("databaseVersion", databaseService.getH2Version());
- if ("Unknown".equalsIgnoreCase(databaseService.getH2Version())) {
+ String dbVersion = databaseService.getH2Version();
+ model.addAttribute("databaseVersion", dbVersion);
+ if ("Unknown".equalsIgnoreCase(dbVersion)) {
model.addAttribute("infoMessage", "notSupported");
}
return "database";
diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java
index 1b0c1093..9906bec4 100644
--- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java
+++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java
@@ -265,7 +265,8 @@ public class ApplicationProperties {
return getKeycloak();
default:
throw new UnsupportedProviderException(
- "Logout from the provider is not supported? Report it at https://github.com/Stirling-Tools/Stirling-PDF/issues");
+ "Logout from the provider is not supported? Report it at"
+ + " https://github.com/Stirling-Tools/Stirling-PDF/issues");
}
}
}
@@ -313,10 +314,10 @@ public class ApplicationProperties {
@Override
public String toString() {
return """
- Driver {
- driverName='%s'
- }
- """
+ Driver {
+ driverName='%s'
+ }
+ """
.formatted(driverName);
}
}
@@ -326,6 +327,7 @@ public class ApplicationProperties {
private String appName;
private String homeDescription;
private String appNameNavbar;
+ private List languages;
public String getAppName() {
return appName != null && appName.trim().length() > 0 ? appName : null;
diff --git a/src/main/java/stirling/software/SPDF/service/LanguageService.java b/src/main/java/stirling/software/SPDF/service/LanguageService.java
index 2d4a47c6..9878d156 100644
--- a/src/main/java/stirling/software/SPDF/service/LanguageService.java
+++ b/src/main/java/stirling/software/SPDF/service/LanguageService.java
@@ -1,41 +1,57 @@
package stirling.software.SPDF.service;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.Arrays;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Service;
+import lombok.extern.slf4j.Slf4j;
+import stirling.software.SPDF.model.ApplicationProperties;
+
@Service
+@Slf4j
public class LanguageService {
+ private final ApplicationProperties applicationProperties;
private final PathMatchingResourcePatternResolver resourcePatternResolver =
new PathMatchingResourcePatternResolver();
- public List getSupportedLanguages() {
- List supportedLanguages = new ArrayList<>();
+ public LanguageService(
+ ApplicationProperties applicationProperties) {
+ this.applicationProperties = applicationProperties;
+ }
+ public Set getSupportedLanguages() {
try {
Resource[] resources =
resourcePatternResolver.getResources("classpath*:messages_*.properties");
- for (Resource resource : resources) {
- if (resource.exists() && resource.isReadable()) {
- String filename = resource.getFilename();
- if (filename != null
- && filename.startsWith("messages_")
- && filename.endsWith(".properties")) {
- String languageCode =
- filename.replace("messages_", "").replace(".properties", "");
- supportedLanguages.add(languageCode);
- }
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return supportedLanguages;
+ return Arrays.stream(resources)
+ .map(Resource::getFilename)
+ .filter(
+ filename ->
+ filename != null
+ && filename.startsWith("messages_")
+ && filename.endsWith(".properties"))
+ .map(filename -> filename.replace("messages_", "").replace(".properties", ""))
+ .filter(
+ languageCode -> {
+ Set allowedLanguages =
+ new HashSet<>(applicationProperties.getUi().getLanguages());
+ return allowedLanguages.isEmpty()
+ || allowedLanguages.contains(languageCode)
+ || "en_GB".equals(languageCode);
+ })
+ .collect(Collectors.toSet());
+
+ } catch (IOException e) {
+ log.error("Error retrieving supported languages", e);
+ return new HashSet<>();
+ }
}
}
diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template
index ca05742d..ff3821be 100644
--- a/src/main/resources/settings.yml.template
+++ b/src/main/resources/settings.yml.template
@@ -101,6 +101,7 @@ ui:
appName: '' # application's visible name
homeDescription: '' # short description or tagline shown on the homepage
appNameNavbar: '' # name displayed on the navigation bar
+ languages: [] # If empty, all languages are enabled. To display only German and Polish ["de_DE", "pl_PL"]. British English is always enabled.
endpoints:
toRemove: [] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html
index d56b4fcf..50d73f3a 100644
--- a/src/main/resources/templates/fragments/languages.html
+++ b/src/main/resources/templates/fragments/languages.html
@@ -1,42 +1,42 @@
-
Български
-
العربية
-
Català
-
简体中文
-
繁體中文
-
བོད་ཡིག
-
Azərbaycan Dili
-
Dansk
-
Deutsch
+
Български
+
العربية
+
Català
+
简体中文
+
繁體中文
+
བོད་ཡིག
+
Azərbaycan Dili
+
Dansk
+
Deutsch
English (GB)
-
English (US)
-
Euskara
-
Español
-
Français
-
Indonesia
-
Irish
-
Italiano
-
Nederlands
-
پارسی
-
Polski
-
Português (BR)
-
Português (PT)
-
Romanian
-
Slovensky
-
Slovenian
-
Svenska
-
Türkçe
-
Русский
-
한국어
-
日本語
-
Ελληνικά
-
Hungarian
-
हिन्दी
-
Srpski
-
Українська
-
Česky
-
Hrvatski
-
Norsk
-
ไทย
-
Tiếng Việt
+
English (US)
+
Euskara
+
Español
+
Français
+
Indonesia
+
Irish
+
Italiano
+
Nederlands
+
پارسی
+
Polski
+
Português (BR)
+
Português (PT)
+
Romanian
+
Slovensky
+
Slovenian
+
Svenska
+
Türkçe
+
Русский
+
한국어
+
日本語
+
Ελληνικά
+
Hungarian
+
हिन्दी
+
Srpski
+
Українська
+
Česky
+
Hrvatski
+
Norsk
+
ไทย
+
Tiếng Việt