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 - - icon Polski - + icon 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 @@ - icon Български - icon العربية - icon Català - icon 简体中文 - icon 繁體中文 - icon བོད་ཡིག - icon Azərbaycan Dili - icon Dansk - icon Deutsch + icon Български + icon العربية + icon Català + icon 简体中文 + icon 繁體中文 + icon བོད་ཡིག + icon Azərbaycan Dili + icon Dansk + icon Deutsch icon English (GB) - icon English (US) - icon Euskara - icon Español - icon Français - icon Indonesia - icon Irish - icon Italiano - icon Nederlands - icon پارسی - icon Polski - icon Português (BR) - icon Português (PT) - icon Romanian - icon Slovensky - icon Slovenian - icon Svenska - icon Türkçe - icon Русский - icon 한국어 - icon 日本語 - icon Ελληνικά - icon Hungarian - icon हिन्दी - icon Srpski - icon Українська - icon Česky - icon Hrvatski - icon Norsk - icon ไทย - icon Tiếng Việt + icon English (US) + icon Euskara + icon Español + icon Français + icon Indonesia + icon Irish + icon Italiano + icon Nederlands + icon پارسی + icon Polski + icon Português (BR) + icon Português (PT) + icon Romanian + icon Slovensky + icon Slovenian + icon Svenska + icon Türkçe + icon Русский + icon 한국어 + icon 日本語 + icon Ελληνικά + icon Hungarian + icon हिन्दी + icon Srpski + icon Українська + icon Česky + icon Hrvatski + icon Norsk + icon ไทย + icon Tiếng Việt