From be05db22f5c1777ef7fb2bf9204f93f6b61146d6 Mon Sep 17 00:00:00 2001 From: Ludy Date: Fri, 5 Jul 2024 21:48:33 +0200 Subject: [PATCH 001/231] Preparation for Switching to a New Database Version (#1521) * preparing to switch to a new database version * add PreAuthorize --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- build.gradle | 3 + .../SPDF/config/CleanUrlInterceptor.java | 3 +- .../SPDF/config/DatabaseBackupInterface.java | 16 ++ .../config/security/InitialSecuritySetup.java | 30 +-- .../SPDF/config/security/UserService.java | 33 ++- .../database/DatabaseBackupHelper.java | 202 ++++++++++++++++++ .../security/database/ScheduledTasks.java | 18 ++ .../controller/api/DatabaseController.java | 144 +++++++++++++ .../SPDF/controller/api/UserController.java | 19 +- .../controller/web/DatabaseWebController.java | 41 ++++ .../software/SPDF/utils/FileInfo.java | 50 +++++ src/main/resources/messages_ar_AR.properties | 17 ++ src/main/resources/messages_bg_BG.properties | 17 ++ src/main/resources/messages_ca_CA.properties | 17 ++ src/main/resources/messages_cs_CZ.properties | 17 ++ src/main/resources/messages_de_DE.properties | 17 ++ src/main/resources/messages_el_GR.properties | 17 ++ src/main/resources/messages_en_GB.properties | 17 ++ src/main/resources/messages_en_US.properties | 17 ++ src/main/resources/messages_es_ES.properties | 17 ++ src/main/resources/messages_eu_ES.properties | 17 ++ src/main/resources/messages_fr_FR.properties | 17 ++ src/main/resources/messages_hi_IN.properties | 17 ++ src/main/resources/messages_hr_HR.properties | 17 ++ src/main/resources/messages_hu_HU.properties | 17 ++ src/main/resources/messages_id_ID.properties | 17 ++ src/main/resources/messages_it_IT.properties | 17 ++ src/main/resources/messages_ja_JP.properties | 17 ++ src/main/resources/messages_ko_KR.properties | 17 ++ src/main/resources/messages_nl_NL.properties | 17 ++ src/main/resources/messages_no_NB.properties | 17 ++ src/main/resources/messages_pl_PL.properties | 17 ++ src/main/resources/messages_pt_BR.properties | 17 ++ src/main/resources/messages_pt_PT.properties | 17 ++ src/main/resources/messages_ro_RO.properties | 17 ++ src/main/resources/messages_ru_RU.properties | 17 ++ src/main/resources/messages_sk_SK.properties | 17 ++ .../resources/messages_sr_LATN_RS.properties | 17 ++ src/main/resources/messages_sv_SE.properties | 17 ++ src/main/resources/messages_tr_TR.properties | 17 ++ src/main/resources/messages_uk_UA.properties | 17 ++ src/main/resources/messages_zh_CN.properties | 17 ++ src/main/resources/messages_zh_TW.properties | 17 ++ src/main/resources/templates/database.html | 71 ++++++ 44 files changed, 1145 insertions(+), 29 deletions(-) create mode 100644 src/main/java/stirling/software/SPDF/config/DatabaseBackupInterface.java create mode 100644 src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java create mode 100644 src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java create mode 100644 src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java create mode 100644 src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java create mode 100644 src/main/java/stirling/software/SPDF/utils/FileInfo.java create mode 100644 src/main/resources/templates/database.html diff --git a/build.gradle b/build.gradle index 1c04334b..90e130f6 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,9 @@ sourceSets { if (System.getenv("DOCKER_ENABLE_SECURITY") == "false") { exclude "stirling/software/SPDF/config/security/**" exclude "stirling/software/SPDF/controller/api/UserController.java" + exclude "stirling/software/SPDF/controller/api/DatabaseController.java" exclude "stirling/software/SPDF/controller/web/AccountWebController.java" + exclude "stirling/software/SPDF/controller/web/DatabaseWebController.java" exclude "stirling/software/SPDF/model/ApiKeyAuthenticationToken.java" exclude "stirling/software/SPDF/model/Authority.java" exclude "stirling/software/SPDF/model/PersistentLogin.java" @@ -120,6 +122,7 @@ dependencies { //2.2.x requires rebuild of DB file.. need migration path implementation "com.h2database:h2:2.1.214" + // implementation "com.h2database:h2:2.2.224" } testImplementation "org.springframework.boot:spring-boot-starter-test:$springBootVersion" diff --git a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java b/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java index e568b327..8c1ed05f 100644 --- a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java +++ b/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java @@ -22,7 +22,8 @@ public class CleanUrlInterceptor implements HandlerInterceptor { "error", "erroroauth", "file", - "messageType"); + "messageType", + "infoMessage"); @Override public boolean preHandle( diff --git a/src/main/java/stirling/software/SPDF/config/DatabaseBackupInterface.java b/src/main/java/stirling/software/SPDF/config/DatabaseBackupInterface.java new file mode 100644 index 00000000..267981d1 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/DatabaseBackupInterface.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.config; + +import java.io.IOException; +import java.util.List; + +import stirling.software.SPDF.utils.FileInfo; + +public interface DatabaseBackupInterface { + void exportDatabase() throws IOException; + + boolean importDatabase(); + + boolean hasBackup(); + + List getBackupList(); +} diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java index e696c6bc..689b5df0 100644 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java +++ b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java @@ -6,28 +6,33 @@ import java.nio.file.Paths; import java.util.UUID; import org.simpleyaml.configuration.file.YamlFile; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.config.DatabaseBackupInterface; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.Role; @Component +@Slf4j public class InitialSecuritySetup { @Autowired private UserService userService; @Autowired private ApplicationProperties applicationProperties; - private static final Logger logger = LoggerFactory.getLogger(InitialSecuritySetup.class); + @Autowired private DatabaseBackupInterface databaseBackupHelper; @PostConstruct - public void init() { - if (!userService.hasUsers()) { + public void init() throws IllegalArgumentException, IOException { + if (databaseBackupHelper.hasBackup() && !userService.hasUsers()) { + databaseBackupHelper.importDatabase(); + } else if (!userService.hasUsers()) { initializeAdminUser(); + } else { + databaseBackupHelper.exportDatabase(); } initializeInternalApiUser(); } @@ -41,12 +46,11 @@ public class InitialSecuritySetup { } } - private void initializeAdminUser() { + private void initializeAdminUser() throws IOException { String initialUsername = applicationProperties.getSecurity().getInitialLogin().getUsername(); String initialPassword = applicationProperties.getSecurity().getInitialLogin().getPassword(); - if (initialUsername != null && !initialUsername.isEmpty() && initialPassword != null @@ -54,9 +58,9 @@ public class InitialSecuritySetup { && !userService.findByUsernameIgnoreCase(initialUsername).isPresent()) { try { userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId()); - logger.info("Admin user created: " + initialUsername); + log.info("Admin user created: " + initialUsername); } catch (IllegalArgumentException e) { - logger.error("Failed to initialize security setup", e); + log.error("Failed to initialize security setup", e); System.exit(1); } } else { @@ -64,23 +68,23 @@ public class InitialSecuritySetup { } } - private void createDefaultAdminUser() { + private void createDefaultAdminUser() throws IllegalArgumentException, IOException { String defaultUsername = "admin"; String defaultPassword = "stirling"; if (!userService.findByUsernameIgnoreCase(defaultUsername).isPresent()) { userService.saveUser(defaultUsername, defaultPassword, Role.ADMIN.getRoleId(), true); - logger.info("Default admin user created: " + defaultUsername); + log.info("Default admin user created: " + defaultUsername); } } - private void initializeInternalApiUser() { + private void initializeInternalApiUser() throws IllegalArgumentException, IOException { if (!userService.usernameExistsIgnoreCase(Role.INTERNAL_API_USER.getRoleId())) { userService.saveUser( Role.INTERNAL_API_USER.getRoleId(), UUID.randomUUID().toString(), Role.INTERNAL_API_USER.getRoleId()); userService.addApiKeyToUser(Role.INTERNAL_API_USER.getRoleId()); - logger.info("Internal API user created: " + Role.INTERNAL_API_USER.getRoleId()); + log.info("Internal API user created: " + Role.INTERNAL_API_USER.getRoleId()); } } diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index 0a6898f8..f6cdfb91 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.config.security; +import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -19,6 +20,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import stirling.software.SPDF.config.DatabaseBackupInterface; import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; import stirling.software.SPDF.model.AuthenticationType; import stirling.software.SPDF.model.Authority; @@ -38,8 +40,11 @@ public class UserService implements UserServiceInterface { @Autowired private MessageSource messageSource; + @Autowired DatabaseBackupInterface databaseBackupHelper; + // Handle OAUTH2 login and user auto creation. - public boolean processOAuth2PostLogin(String username, boolean autoCreateUser) { + public boolean processOAuth2PostLogin(String username, boolean autoCreateUser) + throws IllegalArgumentException, IOException { if (!isUsernameValid(username)) { return false; } @@ -131,7 +136,7 @@ public class UserService implements UserServiceInterface { } public void saveUser(String username, AuthenticationType authenticationType) - throws IllegalArgumentException { + throws IllegalArgumentException, IOException { if (!isUsernameValid(username)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } @@ -142,9 +147,11 @@ public class UserService implements UserServiceInterface { user.addAuthority(new Authority(Role.USER.getRoleId(), user)); user.setAuthenticationType(authenticationType); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } - public void saveUser(String username, String password) throws IllegalArgumentException { + public void saveUser(String username, String password) + throws IllegalArgumentException, IOException { if (!isUsernameValid(username)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } @@ -154,10 +161,11 @@ public class UserService implements UserServiceInterface { user.setEnabled(true); user.setAuthenticationType(AuthenticationType.WEB); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } public void saveUser(String username, String password, String role, boolean firstLogin) - throws IllegalArgumentException { + throws IllegalArgumentException, IOException { if (!isUsernameValid(username)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } @@ -169,10 +177,11 @@ public class UserService implements UserServiceInterface { user.setAuthenticationType(AuthenticationType.WEB); user.setFirstLogin(firstLogin); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } public void saveUser(String username, String password, String role) - throws IllegalArgumentException { + throws IllegalArgumentException, IOException { saveUser(username, password, role, false); } @@ -206,7 +215,8 @@ public class UserService implements UserServiceInterface { return userCount > 0; } - public void updateUserSettings(String username, Map updates) { + public void updateUserSettings(String username, Map updates) + throws IOException { Optional userOpt = userRepository.findByUsernameIgnoreCase(username); if (userOpt.isPresent()) { User user = userOpt.get(); @@ -220,6 +230,7 @@ public class UserService implements UserServiceInterface { user.setSettings(settingsMap); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } } @@ -235,22 +246,26 @@ public class UserService implements UserServiceInterface { return authorityRepository.findByUserId(user.getId()); } - public void changeUsername(User user, String newUsername) throws IllegalArgumentException { + public void changeUsername(User user, String newUsername) + throws IllegalArgumentException, IOException { if (!isUsernameValid(newUsername)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } user.setUsername(newUsername); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } - public void changePassword(User user, String newPassword) { + public void changePassword(User user, String newPassword) throws IOException { user.setPassword(passwordEncoder.encode(newPassword)); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } - public void changeFirstUse(User user, boolean firstUse) { + public void changeFirstUse(User user, boolean firstUse) throws IOException { user.setFirstLogin(firstUse); userRepository.save(user); + databaseBackupHelper.exportDatabase(); } public void changeRole(User user, String newRole) { diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java new file mode 100644 index 00000000..026a9684 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java @@ -0,0 +1,202 @@ +package stirling.software.SPDF.config.security.database; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.BasicFileAttributes; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.config.DatabaseBackupInterface; +import stirling.software.SPDF.utils.FileInfo; + +@Slf4j +@Configuration +public class DatabaseBackupHelper implements DatabaseBackupInterface { + + @Value("${spring.datasource.url}") + private String url; + + private Path backupPath = Paths.get("configs/db/backup/"); + + @Override + public boolean hasBackup() { + // Check if there is at least one backup + return !getBackupList().isEmpty(); + } + + @Override + public List getBackupList() { + // Check if the backup directory exists, and create it if it does not + ensureBackupDirectoryExists(); + + List backupFiles = new ArrayList<>(); + + // Read the backup directory and filter for files with the prefix "backup_" and suffix + // ".sql" + try (DirectoryStream stream = + Files.newDirectoryStream( + backupPath, + path -> + path.getFileName().toString().startsWith("backup_") + && path.getFileName().toString().endsWith(".sql"))) { + for (Path entry : stream) { + BasicFileAttributes attrs = Files.readAttributes(entry, BasicFileAttributes.class); + LocalDateTime modificationDate = + LocalDateTime.ofInstant( + attrs.lastModifiedTime().toInstant(), ZoneId.systemDefault()); + LocalDateTime creationDate = + LocalDateTime.ofInstant( + attrs.creationTime().toInstant(), ZoneId.systemDefault()); + long fileSize = attrs.size(); + backupFiles.add( + new FileInfo( + entry.getFileName().toString(), + entry.toString(), + modificationDate, + fileSize, + creationDate)); + } + } catch (IOException e) { + log.error("Error reading backup directory: {}", e.getMessage(), e); + } + return backupFiles; + } + + // Imports a database backup from the specified file. + public boolean importDatabaseFromUI(String fileName) throws IOException { + return this.importDatabaseFromUI(getBackupFilePath(fileName)); + } + + // Imports a database backup from the specified path. + public boolean importDatabaseFromUI(Path tempTemplatePath) throws IOException { + boolean success = executeDatabaseScript(tempTemplatePath); + if (success) { + LocalDateTime dateNow = LocalDateTime.now(); + DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyyMMddHHmm"); + Path insertOutputFilePath = + this.getBackupFilePath("backup_user_" + dateNow.format(myFormatObj) + ".sql"); + Files.copy(tempTemplatePath, insertOutputFilePath); + Files.deleteIfExists(tempTemplatePath); + } + return success; + } + + @Override + public boolean importDatabase() { + if (!this.hasBackup()) return false; + + List backupList = this.getBackupList(); + backupList.sort(Comparator.comparing(FileInfo::getModificationDate).reversed()); + + return executeDatabaseScript(Paths.get(backupList.get(0).getFilePath())); + } + + @Override + public void exportDatabase() throws IOException { + // Check if the backup directory exists, and create it if it does not + ensureBackupDirectoryExists(); + + // Filter and delete old backups if there are more than 5 + List filteredBackupList = + this.getBackupList().stream() + .filter(backup -> !backup.getFileName().startsWith("backup_user_")) + .collect(Collectors.toList()); + + if (filteredBackupList.size() > 5) { + filteredBackupList.sort( + Comparator.comparing( + p -> p.getFileName().substring(7, p.getFileName().length() - 4))); + Files.deleteIfExists(Paths.get(filteredBackupList.get(0).getFilePath())); + log.info("Deleted oldest backup: {}", filteredBackupList.get(0).getFileName()); + } + + LocalDateTime dateNow = LocalDateTime.now(); + DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyyMMddHHmm"); + Path insertOutputFilePath = + this.getBackupFilePath("backup_" + dateNow.format(myFormatObj) + ".sql"); + String query = "SCRIPT SIMPLE COLUMNS DROP to '" + insertOutputFilePath.toString() + "';"; + + try (Connection conn = DriverManager.getConnection(url, "sa", ""); + Statement stmt = conn.createStatement()) { + stmt.execute(query); + log.info("Database export completed: {}", insertOutputFilePath); + } catch (SQLException e) { + log.error("Error during database export: {}", e.getMessage(), e); + } + } + + // Retrieves the H2 database version. + public String getH2Version() { + String version = "Unknown"; + try (Connection conn = DriverManager.getConnection(url, "sa", "")) { + try (Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT H2VERSION() AS version")) { + if (rs.next()) { + version = rs.getString("version"); + log.info("H2 Database Version: {}", version); + } + } + } catch (SQLException e) { + log.error("Error retrieving H2 version: {}", e.getMessage(), e); + } + return version; + } + + // Deletes a backup file. + public boolean deleteBackupFile(String fileName) throws IOException { + Path filePath = this.getBackupFilePath(fileName); + if (Files.deleteIfExists(filePath)) { + log.info("Deleted backup file: {}", fileName); + return true; + } else { + log.error("File not found or could not be deleted: {}", fileName); + return false; + } + } + + // Gets the Path object for a given backup file name. + public Path getBackupFilePath(String fileName) { + return Paths.get(backupPath.toString(), fileName); + } + + private boolean executeDatabaseScript(Path scriptPath) { + try (Connection conn = DriverManager.getConnection(url, "sa", ""); + Statement stmt = conn.createStatement()) { + + String query = "RUNSCRIPT from '" + scriptPath.toString() + "';"; + stmt.execute(query); + log.info("Database import completed: {}", scriptPath); + return true; + } catch (SQLException e) { + log.error("Error during database import: {}", e.getMessage(), e); + return false; + } + } + + private void ensureBackupDirectoryExists() { + if (Files.notExists(backupPath)) { + try { + Files.createDirectories(backupPath); + } catch (IOException e) { + log.error("Error creating directories: {}", e.getMessage()); + } + } + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java b/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java new file mode 100644 index 00000000..2ddc47e1 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java @@ -0,0 +1,18 @@ +package stirling.software.SPDF.config.security.database; + +import java.io.IOException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +public class ScheduledTasks { + + @Autowired private DatabaseBackupHelper databaseBackupService; + + @Scheduled(cron = "0 0 0 * * ?") + public void performBackup() throws IOException { + databaseBackupService.exportDatabase(); + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java new file mode 100644 index 00000000..2f7e207b --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java @@ -0,0 +1,144 @@ +package stirling.software.SPDF.controller.api; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + +import org.eclipse.jetty.http.HttpStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.config.security.database.DatabaseBackupHelper; + +@Slf4j +@Controller +@RequestMapping("/api/v1/database") +@PreAuthorize("hasRole('ROLE_ADMIN')") +@Tag(name = "Database", description = "Database APIs") +public class DatabaseController { + + @Autowired DatabaseBackupHelper databaseBackupHelper; + + @Hidden + @PostMapping(consumes = "multipart/form-data", value = "import-database") + @Operation( + summary = "Import database backup", + description = "This endpoint imports a database backup from a SQL file.") + public String importDatabase( + @RequestParam("fileInput") MultipartFile file, RedirectAttributes redirectAttributes) + throws IllegalArgumentException, IOException { + if (file == null || file.isEmpty()) { + redirectAttributes.addAttribute("error", "fileNullOrEmpty"); + return "redirect:/database"; + } + log.info("Received file: {}", file.getOriginalFilename()); + Path tempTemplatePath = Files.createTempFile("backup_", ".sql"); + try (InputStream in = file.getInputStream()) { + Files.copy(in, tempTemplatePath, StandardCopyOption.REPLACE_EXISTING); + boolean importSuccess = databaseBackupHelper.importDatabaseFromUI(tempTemplatePath); + if (importSuccess) { + redirectAttributes.addAttribute("infoMessage", "importIntoDatabaseSuccessed"); + } else { + redirectAttributes.addAttribute("error", "failedImportFile"); + } + } catch (Exception e) { + log.error("Error importing database: {}", e.getMessage()); + redirectAttributes.addAttribute("error", "failedImportFile"); + } + return "redirect:/database"; + } + + @Hidden + @GetMapping("/import-database-file/{fileName}") + public String importDatabaseFromBackupUI(@PathVariable String fileName) + throws IllegalArgumentException, IOException { + if (fileName == null || fileName.isEmpty()) { + return "redirect:/database?error=fileNullOrEmpty"; + } + + // Check if the file exists in the backup list + boolean fileExists = + databaseBackupHelper.getBackupList().stream() + .anyMatch(backup -> backup.getFileName().equals(fileName)); + if (!fileExists) { + log.error("File {} not found in backup list", fileName); + return "redirect:/database?error=fileNotFound"; + } + log.info("Received file: {}", fileName); + if (databaseBackupHelper.importDatabaseFromUI(fileName)) { + log.info("File {} imported to database", fileName); + return "redirect:/database?infoMessage=importIntoDatabaseSuccessed"; + } + return "redirect:/database?error=failedImportFile"; + } + + @Hidden + @GetMapping("/delete/{fileName}") + @Operation( + summary = "Delete a database backup file", + description = + "This endpoint deletes a database backup file with the specified file name.") + public String deleteFile(@PathVariable String fileName) { + if (fileName == null || fileName.isEmpty()) { + throw new IllegalArgumentException("File must not be null or empty"); + } + try { + if (databaseBackupHelper.deleteBackupFile(fileName)) { + log.info("Deleted file: {}", fileName); + } else { + log.error("Failed to delete file: {}", fileName); + return "redirect:/database?error=failedToDeleteFile"; + } + } catch (IOException e) { + log.error("Error deleting file: {}", e.getMessage()); + return "redirect:/database?error=" + e.getMessage(); + } + return "redirect:/database"; + } + + @Hidden + @GetMapping("/download/{fileName}") + @Operation( + summary = "Download a database backup file", + description = + "This endpoint downloads a database backup file with the specified file name.") + public ResponseEntity downloadFile(@PathVariable String fileName) { + if (fileName == null || fileName.isEmpty()) { + throw new IllegalArgumentException("File must not be null or empty"); + } + try { + Path filePath = databaseBackupHelper.getBackupFilePath(fileName); + InputStreamResource resource = new InputStreamResource(Files.newInputStream(filePath)); + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + fileName) + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .contentLength(Files.size(filePath)) + .body(resource); + } catch (IOException e) { + log.error("Error downloading file: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.SEE_OTHER_303) + .location(URI.create("/database?error=downloadFailed")) + .build(); + } + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index ec316fbc..b0deefa0 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import java.io.IOException; import java.security.Principal; import java.util.HashMap; import java.util.Map; @@ -42,7 +43,8 @@ public class UserController { @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/register") - public String register(@ModelAttribute UsernameAndPass requestModel, Model model) { + public String register(@ModelAttribute UsernameAndPass requestModel, Model model) + throws IOException { if (userService.usernameExistsIgnoreCase(requestModel.getUsername())) { model.addAttribute("error", "Username already exists"); return "register"; @@ -63,7 +65,8 @@ public class UserController { @RequestParam(name = "newUsername") String newUsername, HttpServletRequest request, HttpServletResponse response, - RedirectAttributes redirectAttributes) { + RedirectAttributes redirectAttributes) + throws IOException { if (!userService.isUsernameValid(newUsername)) { return new RedirectView("/account?messageType=invalidUsername", true); @@ -116,7 +119,8 @@ public class UserController { @RequestParam(name = "newPassword") String newPassword, HttpServletRequest request, HttpServletResponse response, - RedirectAttributes redirectAttributes) { + RedirectAttributes redirectAttributes) + throws IOException { if (principal == null) { return new RedirectView("/change-creds?messageType=notAuthenticated", true); } @@ -149,7 +153,8 @@ public class UserController { @RequestParam(name = "newPassword") String newPassword, HttpServletRequest request, HttpServletResponse response, - RedirectAttributes redirectAttributes) { + RedirectAttributes redirectAttributes) + throws IOException { if (principal == null) { return new RedirectView("/account?messageType=notAuthenticated", true); } @@ -176,7 +181,8 @@ public class UserController { @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/updateUserSettings") - public String updateUserSettings(HttpServletRequest request, Principal principal) { + public String updateUserSettings(HttpServletRequest request, Principal principal) + throws IOException { Map paramMap = request.getParameterMap(); Map updates = new HashMap<>(); @@ -201,7 +207,8 @@ public class UserController { @RequestParam(name = "password") String password, @RequestParam(name = "role") String role, @RequestParam(name = "forceChange", required = false, defaultValue = "false") - boolean forceChange) { + boolean forceChange) + throws IllegalArgumentException, IOException { if (!userService.isUsernameValid(username)) { return new RedirectView("/addUsers?messageType=invalidUsername", true); diff --git a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java new file mode 100644 index 00000000..3fd68ad5 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java @@ -0,0 +1,41 @@ +package stirling.software.SPDF.controller.web; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +import io.swagger.v3.oas.annotations.tags.Tag; + +import jakarta.servlet.http.HttpServletRequest; +import stirling.software.SPDF.config.security.database.DatabaseBackupHelper; +import stirling.software.SPDF.utils.FileInfo; + +@Controller +@Tag(name = "Database Management", description = "Database management and security APIs") +public class DatabaseWebController { + + @Autowired private DatabaseBackupHelper databaseBackupHelper; + + @PreAuthorize("hasRole('ROLE_ADMIN')") + @GetMapping("/database") + public String database(HttpServletRequest request, Model model, Authentication authentication) { + String error = request.getParameter("error"); + String confirmed = request.getParameter("infoMessage"); + + if (error != null) { + model.addAttribute("error", error); + } else if (confirmed != null) { + model.addAttribute("infoMessage", confirmed); + } + + List backupList = databaseBackupHelper.getBackupList(); + model.addAttribute("systemUpdate", backupList); + + return "database"; + } +} diff --git a/src/main/java/stirling/software/SPDF/utils/FileInfo.java b/src/main/java/stirling/software/SPDF/utils/FileInfo.java new file mode 100644 index 00000000..4e236756 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/utils/FileInfo.java @@ -0,0 +1,50 @@ +package stirling.software.SPDF.utils; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class FileInfo { + private String fileName; + private String filePath; + private LocalDateTime modificationDate; + private long fileSize; + private LocalDateTime creationDate; + + private static final DateTimeFormatter DATE_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + // Converts the file path string to a Path object. + public Path getFilePathAsPath() { + return Paths.get(filePath); + } + + // Formats the file size into a human-readable string. + public String getFormattedFileSize() { + if (fileSize >= 1024 * 1024 * 1024) { + return String.format("%.2f GB", fileSize / (1024.0 * 1024 * 1024)); + } else if (fileSize >= 1024 * 1024) { + return String.format("%.2f MB", fileSize / (1024.0 * 1024)); + } else if (fileSize >= 1024) { + return String.format("%.2f KB", fileSize / 1024.0); + } else { + return String.format("%d Bytes", fileSize); + } + } + + // Formats the modification date to a string. + public String getFormattedModificationDate() { + return modificationDate.format(DATE_FORMATTER); + } + + // Formats the creation date to a string. + public String getFormattedCreationDate() { + return creationDate.format(DATE_FORMATTER); + } +} diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 66902b18..4633c9f6 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=تغيير دور المستخدم adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index ac4971de..3ab9cb47 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Съхранете потребителя adminUserSettings.changeUserRole=Промяна на ролята на потребителя adminUserSettings.authenticated=Удостоверен + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index f6003fba..ce4b3c96 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Desar Usuari adminUserSettings.changeUserRole=Canvia el rol de l'usuari adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 9df08b56..64774be0 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Uložit Uživatele adminUserSettings.changeUserRole=Zmenit Roli Uživatele adminUserSettings.authenticated=Ověřeno + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index e685e7f5..20825992 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Benutzer speichern adminUserSettings.changeUserRole=Benutzerrolle ändern adminUserSettings.authenticated=Authentifiziert + +database.title=Datenbank Import/Export +database.header=Datenbank Import/Export +database.fileName=Dateiname +database.creationDate=Erstellungsdatum +database.fileSize=Dateigröße +database.deleteBackupFile=Sicherungsdatei löschen +database.importBackupFile=Sicherungsdatei importieren +database.downloadBackupFile=Sicherungsdatei herunterladen +database.info_1=Beim Importieren der Daten ist es von größter Bedeutung, die korrekte Struktur zu gewährleisten. Wenn Sie nicht sicher sind, was Sie tun, suchen Sie Rat und Unterstützung von einem Fachmann. Ein Fehler in der Struktur kann zu Fehlfunktionen der Anwendung führen, bis hin zur vollständigen Nicht-Lauffähigkeit der Anwendung. +database.info_2=Der Dateiname spielt beim Hochladen keine Rolle. Dieser wird nachträglich in das Format backup_user_yyyyMMddHHmm.sql geändert, um eine einheitliche Benennung zu gewährleisten. +database.submit=Sicherungsdatei importieren +database.importIntoDatabaseSuccessed=Import in die Datenbank erfolgreich +database.fileNotFound=Datei nicht gefunden +database.fileNullOrEmpty=Datei darf nicht null oder leer sein +database.failedImportFile=Dateiimport fehlgeschlagen + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index c140c12c..b7bfabdb 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Αποθήκευση Χρήστη adminUserSettings.changeUserRole=Αλλαγή ρόλου χρήστη adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 744cbbd7..7add06f6 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed to import file + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 6717272b..5f20e450 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 0c050460..94e66877 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Guardar Usuario adminUserSettings.changeUserRole=Cambiar rol de usuario adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 45bdb032..3cd8fbb4 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Gorde Erabiltzailea adminUserSettings.changeUserRole=Erabiltzailearen rola aldatu adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 7ff1c61b..a1c44958 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Ajouter adminUserSettings.changeUserRole=Changer le rôle de l'utilisateur adminUserSettings.authenticated=Authentifié + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 080d9bb3..e8dea135 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=उपयोगकर्ता को सहेजे adminUserSettings.changeUserRole=यूज़र की भूमिका बदलें adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index a98e8ef7..fc26615b 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Spremi korisnika adminUserSettings.changeUserRole=Promijenite korisničku ulogu adminUserSettings.authenticated=Autentificirano + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 759fae66..895ef840 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Felhasználó mentése adminUserSettings.changeUserRole=Felhasználó szerepkörének módosítása adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 4ffaec2f..e8f4f3c1 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Simpan Pengguna adminUserSettings.changeUserRole=Ubah Peran Pengguna adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 7589e4c5..b9117019 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Salva utente adminUserSettings.changeUserRole=Cambia il ruolo dell'utente adminUserSettings.authenticated=Autenticato + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index bab67998..648f1633 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=ユーザーの保存 adminUserSettings.changeUserRole=ユーザーの役割を変更する adminUserSettings.authenticated=認証済 + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 2a9d3461..40c48a21 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=사용자 저장 adminUserSettings.changeUserRole=사용자의 역할 변경 adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 02718c3a..e0b8aa2f 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Gebruiker opslaan adminUserSettings.changeUserRole=De rol van de gebruiker wijzigen adminUserSettings.authenticated=Geauthenticeerd + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 8597ebd8..84ed25f4 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Lagre Bruker adminUserSettings.changeUserRole=Endre Brukerens Rolle adminUserSettings.authenticated=Autentisert + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 519cc59f..18017dba 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Zapisz użytkownika adminUserSettings.changeUserRole=Zmień rolę użytkownika adminUserSettings.authenticated=Zalogowany + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index cc7fe4e8..c1a41ff2 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Alterar Função de Usuário adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 74246eb6..f7905ea0 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Alterar usuário adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 836bfc43..b186c4c7 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Schimbați rolul utilizatorului adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index ab7a1ac9..cbd5c285 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Сохранить пользователя adminUserSettings.changeUserRole=Изменить роль пользователя adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 6ca3173d..599ef7ba 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Uložiť používateľa adminUserSettings.changeUserRole=Zmeniť rolu používateľa adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 5e0e7ec3..102fee73 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Sačuvaj korisnika adminUserSettings.changeUserRole=Promenite ulogu korisnika adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 00381ee8..ecbd13ba 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Ändra användarens roll adminUserSettings.authenticated=Authenticated + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 4dfe0e19..16e4b5ae 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Kullanıcıyı Kaydet adminUserSettings.changeUserRole=Kullanıcı rolünü değiştir adminUserSettings.authenticated=Onaylandı + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 2f9356c7..ebe2d989 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=Зберегти користувача adminUserSettings.changeUserRole=Змінити роль користувача adminUserSettings.authenticated=Автентифіковано + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index ce70cb86..46e46fbc 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=保存用户 adminUserSettings.changeUserRole=更改用户角色 adminUserSettings.authenticated=已验证 + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 8bcc59ee..ead961d0 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -191,6 +191,23 @@ adminUserSettings.submit=儲存 adminUserSettings.changeUserRole=更改使用者身份 adminUserSettings.authenticated=已驗證 + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not Found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed Import File + ############# # HOME-PAGE # ############# diff --git a/src/main/resources/templates/database.html b/src/main/resources/templates/database.html new file mode 100644 index 00000000..4f6f8a86 --- /dev/null +++ b/src/main/resources/templates/database.html @@ -0,0 +1,71 @@ + + + + + + + +
+
+ +

+
+
+
+
+ database + Database Im-/Export +
+

+

+
+ + + + + + + + + + + + + + + + + + + + + +
File NameCreation DateFile Size
deletebackupdownload
+
+
+
+
+

+

+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+ + \ No newline at end of file -- 2.46.1 From 31ce5b1221f0f8fc19e4e065e8d37694a9210765 Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Fri, 5 Jul 2024 21:50:22 +0200 Subject: [PATCH 002/231] Update messages_it_IT.properties (#1526) Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- src/main/resources/messages_it_IT.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index b9117019..af37da44 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -116,7 +116,7 @@ navbar.multiTool=Strumenti multipli navbar.sections.organize=Organizza navbar.sections.convertTo=Converti in PDF navbar.sections.convertFrom=Converti da PDF -navbar.sections.security=Firma Firma & Sicurezza +navbar.sections.security=Firma & Sicurezza navbar.sections.advance=Avanzate navbar.sections.edit=Visualizza & Modifica -- 2.46.1 From 4088208fc8137c2bbc51e39a4407c1fad179584f Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 6 Jul 2024 14:24:32 +0200 Subject: [PATCH 003/231] adding documentation for database import and export (#1528) * adding documentation for database import and export * Update DATABASE.md --- DATABASE.md | 40 +++++++++++++++++++++++++++++++ README.md | 68 +++++++++++++++++++++++++++-------------------------- 2 files changed, 75 insertions(+), 33 deletions(-) create mode 100644 DATABASE.md diff --git a/DATABASE.md b/DATABASE.md new file mode 100644 index 00000000..efc1e467 --- /dev/null +++ b/DATABASE.md @@ -0,0 +1,40 @@ +# New Database Backup and Import Functionality + +**Full activation will take place on approximately January 5th, 2025!** + +Why is the waiting time six months? + +There are users who only install updates sporadically; if they skip the preparation, it can/will lead to data loss in the database. + +## Functionality Overview + +The newly introduced feature enhances the application with robust database backup and import capabilities. This feature is designed to ensure data integrity and provide a straightforward way to manage database backups. Here's how it works: + +1. Automatic Backup Creation + - The system automatically creates a database backup every day at midnight. This ensures that there is always a recent backup available, minimizing the risk of data loss. +2. Manual Backup Export + - Admin actions that modify the user database trigger a manual export of the database. This keeps the backup up-to-date with the latest changes and provides an extra layer of data security. +3. Importing Database Backups + - Admin users can import a database backup either via the web interface or API endpoints. This allows for easy restoration of the database to a previous state in case of data corruption or other issues. + - The import process ensures that the database structure and data are correctly restored, maintaining the integrity of the application. +4. Managing Backup Files + - Admins can view a list of all existing backup files, along with their creation dates and sizes. This helps in managing storage and identifying the most recent or relevant backups. + - Backup files can be downloaded for offline storage or transferred to other environments, providing flexibility in database management. + - Unnecessary backup files can be deleted through the interface to free up storage space and maintain an organized backup directory. + +## User Interface + +### Web Interface + +1. Upload SQL files to import database backups. +2. View details of existing backups, such as file names, creation dates, and sizes. +3. Download backup files for offline storage. +4. Delete outdated or unnecessary backup files. + +### API Endpoints + +1. Import database backups by uploading SQL files. +2. Download backup files. +3. Delete backup files. + +This new functionality streamlines database management, ensuring that backups are always available and easy to manage, thus improving the reliability and resilience of the application. diff --git a/README.md b/README.md index 595c1155..a60a66dc 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ All files and PDFs exist either exclusively on the client side, reside in server - Parallel file processing and downloads - API for integration with external scripts - Optional Login and Authentication support (see [here](https://github.com/Stirling-Tools/Stirling-PDF/tree/main#login-authentication) for documentation) +- Database Backup and Import (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DATABASE.md) for documentation) ## **PDF Features** @@ -234,35 +235,36 @@ security: csrfDisabled: true # Set to 'true' to disable CSRF protection (not recommended for production) loginAttemptCount: 5 # lock user account after 5 tries loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts -# initialLogin: -# username: "admin" # Initial username for the first login -# password: "stirling" # Initial password for the first login -# oauth2: -# enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work) -# issuer: "" # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point -# clientId: "" # Client ID from your provider -# clientSecret: "" # Client Secret from your provider -# autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users -# useAsUsername: "email" # Default is 'email'; custom fields can be used as the username -# scopes: "openid, profile, email" # Specify the scopes for which the application will request permissions -# provider: "google" # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' -# client: -# google: -# clientId: "" # Client ID for Google OAuth2 -# clientSecret: "" # Client Secret for Google OAuth2 -# scopes: "https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile" # Scopes for Google OAuth2 -# useAsUsername: "email" # Field to use as the username for Google OAuth2 -# github: -# clientId: "" # Client ID for GitHub OAuth2 -# clientSecret: "" # Client Secret for GitHub OAuth2 -# scopes: "read:user" # Scope for GitHub OAuth2 -# useAsUsername: "login" # Field to use as the username for GitHub OAuth2 -# keycloak: -# issuer: "http://192.168.0.123:8888/realms/stirling-pdf" # URL of the Keycloak realm's OpenID Connect Discovery endpoint -# clientId: "stirling-pdf" # Client ID for Keycloak OAuth2 -# clientSecret: "" # Client Secret for Keycloak OAuth2 -# scopes: "openid, profile, email" # Scopes for Keycloak OAuth2 -# useAsUsername: "email" # Field to use as the username for Keycloak OAuth2 + loginMethod: all # 'all' (Login Username/Password and OAuth2[must be enabled and configured]), 'normal'(only Login with Username/Password) or 'oauth2'(only Login with OAuth2) + initialLogin: + username: '' # Initial username for the first login + password: '' # Initial password for the first login + oauth2: + enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work) + client: + keycloak: + issuer: '' # URL of the Keycloak realm's OpenID Connect Discovery endpoint + clientId: '' # Client ID for Keycloak OAuth2 + clientSecret: '' # Client Secret for Keycloak OAuth2 + scopes: openid, profile, email # Scopes for Keycloak OAuth2 + useAsUsername: preferred_username # Field to use as the username for Keycloak OAuth2 + google: + clientId: '' # Client ID for Google OAuth2 + clientSecret: '' # Client Secret for Google OAuth2 + scopes: https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile # Scopes for Google OAuth2 + useAsUsername: email # Field to use as the username for Google OAuth2 + github: + clientId: '' # Client ID for GitHub OAuth2 + clientSecret: '' # Client Secret for GitHub OAuth2 + scopes: read:user # Scope for GitHub OAuth2 + useAsUsername: login # Field to use as the username for GitHub OAuth2 + issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point + clientId: '' # Client ID from your provider + clientSecret: '' # Client Secret from your provider + autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users + useAsUsername: email # Default is 'email'; custom fields can be used as the username + scopes: openid, profile, email # Specify the scopes for which the application will request permissions + provider: google # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' system: defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) @@ -273,9 +275,9 @@ system: customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files ui: - appName: null # Application's visible name - homeDescription: null # Short description or tagline shown on homepage. - appNameNavbar: null # Name displayed on the navigation bar + appName: '' # Application's visible name + homeDescription: '' # Short description or tagline shown on homepage. + appNameNavbar: '' # Name displayed on the navigation bar endpoints: toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) @@ -309,7 +311,7 @@ For those wanting to use Stirling-PDFs backend API to link with their own custom ![stirling-login](images/login-light.png) -### Prerequisites: +### Prerequisites - User must have the folder ./configs volumed within docker so that it is retained during updates. - Docker users must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables. -- 2.46.1 From e426d991457c4f293efdd7d717cb6534e2c05ea8 Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Sat, 6 Jul 2024 14:27:19 +0200 Subject: [PATCH 004/231] Update messages_it_IT.properties (#1527) --- src/main/resources/messages_it_IT.properties | 34 ++++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index af37da44..88635b9d 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -35,7 +35,7 @@ sizes.large=Largo sizes.x-large=Extra-Large error.pdfPassword=Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta delete=Elimina -username=Username +username=Nome utente password=Password welcome=Benvenuto property=Proprietà @@ -192,21 +192,21 @@ adminUserSettings.changeUserRole=Cambia il ruolo dell'utente adminUserSettings.authenticated=Autenticato -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Importazione/Esportazione database +database.header=Importazione/esportazione database +database.fileName=Nome file +database.creationDate=Data di creazione +database.fileSize=Dimensione +database.deleteBackupFile=Elimina file di backup +database.importBackupFile=Importa file di backup +database.downloadBackupFile=Scarica il file di backup +database.info_1=Quando si importano i dati, è fondamentale garantire la struttura corretta. Se non sei sicuro di quello che stai facendo, chiedi consiglio e supporto a un professionista. Un errore nella struttura può causare malfunzionamenti dell'applicazione, fino alla completa impossibilità di eseguire l'applicazione. +database.info_2=Il nome del file non ha importanza durante il caricamento. Verrà rinominato in seguito per seguire il formato backup_user__yyyyMMddHHmm.sql,garantendo una convenzione di denominazione coerente. +database.submit=Importa Backup +database.importIntoDatabaseSuccessed=L'importazione nel database è avvenuta con successo +database.fileNotFound=File non trovato +database.fileNullOrEmpty=Il file non deve essere nullo o vuoto +database.failedImportFile=Importazione file non riuscita ############# # HOME-PAGE # @@ -251,7 +251,7 @@ pdfOrganiser.tags=duplex,pari,dispari,ordinamento,spostamento home.addImage.title=Aggiungi Immagine home.addImage.desc=Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso) -addImage.tags=img,jpg,immagine,photo +addImage.tags=img,jpg,immagine,foto home.watermark.title=Aggiungi Filigrana home.watermark.desc=Aggiungi una filigrana al tuo PDF. -- 2.46.1 From 19831c050cbd2b8760fd2132d4e0cc0d6c4c53a9 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 6 Jul 2024 16:43:53 +0200 Subject: [PATCH 005/231] Add labeler action for pull requests (#1529) * Automatically label PRs * Update labeler-config.yml --- .github/labeler-config.yml | 20 ++++++++++++++++++++ .github/workflows/labeler.yml | 17 +++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 .github/labeler-config.yml create mode 100644 .github/workflows/labeler.yml diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml new file mode 100644 index 00000000..029aa318 --- /dev/null +++ b/.github/labeler-config.yml @@ -0,0 +1,20 @@ +translation: + - changed-files: + - any-glob-to-any-file: 'src/main/resources/messages_*_*.properties' + +Front End: + - changed-files: + - any-glob-to-any-file: 'src/main/resources/templates/**' + +java: + - changed-files: + - any-glob-to-any-file: 'src/main/java/**/*.java' + +documentation: + - changed-files: + - any-glob-to-any-file: '**/*.md' + +docker: + - changed-files: + - any-glob-to-any-file: 'Dockerfile' + - any-glob-to-any-file: 'Dockerfile-*' \ No newline at end of file diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 00000000..f2aa28c0 --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,17 @@ +name: "Pull Request Labeler" +on: + pull_request: + types: [opened, synchronize] + +jobs: + labeler: + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@v5 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + configuration-path: .github/labeler-config.yml + sync-labels: true -- 2.46.1 From 5189708d253a981b8c67c729964bcf77490cecb3 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 6 Jul 2024 18:48:06 +0200 Subject: [PATCH 006/231] Fix labeler (#1533) * Update labeler.yml * Update labeler.yml --- .github/workflows/labeler.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index f2aa28c0..15ea84df 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -10,6 +10,7 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: + - uses: actions/checkout@v4 - uses: actions/labeler@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} -- 2.46.1 From ab62a93a0db28d0deb5377198a2bfa5fd66dab89 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 6 Jul 2024 20:15:19 +0200 Subject: [PATCH 007/231] Fix labeler 2 (#1534) --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 15ea84df..6ade1de4 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,6 +1,6 @@ name: "Pull Request Labeler" on: - pull_request: + pull_request_target: types: [opened, synchronize] jobs: -- 2.46.1 From 3c0d2b908f88c3ae97202f340f84cbc493e7ad7b Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 6 Jul 2024 20:17:30 +0200 Subject: [PATCH 008/231] Update messages_de_DE.properties (#1532) Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- src/main/resources/messages_de_DE.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 20825992..aa17b39a 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -86,7 +86,7 @@ pipeline.defaultOption=Benutzerdefiniert pipeline.submitButton=Speichern pipeline.help=Hilfe für Pipeline pipeline.scanHelp=Hilfe zum Ordnerscan -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=Möchten Sie die Pipeline wirklich löschen? ###################### # Pipeline Options # @@ -1101,13 +1101,13 @@ licenses.version=Version licenses.license=Lizenz #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Umfrage +survey.title=Stirling-PDF-Umfrage +survey.description=Stirling-PDF hat kein Tracking, daher möchten wir von unseren Benutzern hören, wie wir Stirling-PDF verbessern können! +survey.please=Bitte nehmen Sie an unserer Umfrage teil! +survey.disabled=(Das Umfrage-Popup wird in folgenden Updates deaktiviert, ist aber am Fuß der Seite verfügbar.) +survey.button=Umfrage durchführen +survey.dontShowAgain=Nicht mehr anzeigen #error -- 2.46.1 From 32ac38e93f9705e5db06cfbc1f01e2ee64bebad1 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 6 Jul 2024 20:48:39 +0200 Subject: [PATCH 009/231] Add missing translations strings (#1535) * Add missing translations strings * Update messages_de_DE.properties --- src/main/resources/messages_ar_AR.properties | 2 ++ src/main/resources/messages_bg_BG.properties | 2 ++ src/main/resources/messages_ca_CA.properties | 2 ++ src/main/resources/messages_cs_CZ.properties | 2 ++ src/main/resources/messages_de_DE.properties | 2 ++ src/main/resources/messages_el_GR.properties | 2 ++ src/main/resources/messages_es_ES.properties | 2 ++ src/main/resources/messages_eu_ES.properties | 2 ++ src/main/resources/messages_fr_FR.properties | 2 ++ src/main/resources/messages_hi_IN.properties | 2 ++ src/main/resources/messages_hr_HR.properties | 2 ++ src/main/resources/messages_hu_HU.properties | 2 ++ src/main/resources/messages_id_ID.properties | 2 ++ src/main/resources/messages_it_IT.properties | 2 ++ src/main/resources/messages_ja_JP.properties | 2 ++ src/main/resources/messages_ko_KR.properties | 2 ++ src/main/resources/messages_nl_NL.properties | 2 ++ src/main/resources/messages_no_NB.properties | 2 ++ src/main/resources/messages_pl_PL.properties | 2 ++ src/main/resources/messages_pt_BR.properties | 2 ++ src/main/resources/messages_pt_PT.properties | 2 ++ src/main/resources/messages_ro_RO.properties | 2 ++ src/main/resources/messages_ru_RU.properties | 2 ++ src/main/resources/messages_sk_SK.properties | 2 ++ src/main/resources/messages_sr_LATN_RS.properties | 2 ++ src/main/resources/messages_sv_SE.properties | 2 ++ src/main/resources/messages_tr_TR.properties | 2 ++ src/main/resources/messages_uk_UA.properties | 2 ++ src/main/resources/messages_zh_CN.properties | 2 ++ src/main/resources/messages_zh_TW.properties | 2 ++ 30 files changed, 60 insertions(+) diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 4633c9f6..f97377d8 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=إزالة #compare compare.title=يقارن compare.header=قارن ملفات PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=المستند 1 compare.document.2=المستند 2 compare.submit=يقارن diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 3ab9cb47..0895f5f9 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Премахване #compare compare.title=Сравнявай compare.header=Сравнявай PDF-и +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Сравнявай diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index ce4b3c96..4a37930d 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Comparar compare.header=Compara PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Comparar diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 64774be0..36634d3a 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Odebrat #compare compare.title=Porovnat compare.header=Porovnat PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Porovnat diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index aa17b39a..b135d510 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Entfernen #compare compare.title=Vergleichen compare.header=PDFs vergleichen +compare.highlightColor.1=Highlight-Farbe 1: +compare.highlightColor.2=Highlight-Farbe 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Vergleichen diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index b7bfabdb..7db7e274 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Κατάργηση #compare compare.title=Σύγκριση compare.header=Σύγκριση PDFs +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Έγγραφο 1 compare.document.2=Έγγραφο 2 compare.submit=Σύγκριση diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 94e66877..daf1172f 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Eliminar #compare compare.title=Comparar compare.header=Comparar archivos PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 3cd8fbb4..29dcc44b 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Konparatu compare.header=Konparatu PDF fitxategiak +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=1. dokumentua compare.document.2=2. dokumentua compare.submit=Konparatu diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index a1c44958..62731ae6 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Supprimer #compare compare.title=Comparer compare.header=Comparer +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Comparer diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index e8dea135..000e2779 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=हटाएं #compare compare.title=तुलना करें compare.header=पीडीएफ़ तुलना करें +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=दस्तावेज़ 1 compare.document.2=दस्तावेज़ 2 compare.submit=तुलना करें diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index fc26615b..9901e13f 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Ukloni #compare compare.title=Uporedite compare.header=Usporedite PDF-ove +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Uporedi diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 895ef840..b9b77e5f 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Összehasonlítás compare.header=PDF-ek összehasonlítása +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokumentum 1 compare.document.2=Dokumentum 2 compare.submit=Összehasonlítás diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index e8f4f3c1..38d4dee4 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Hapus #compare compare.title=Bandingkan compare.header=Bandingkan PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokumen 1 compare.document.2=Dokumen 2 compare.submit=Bandingkan diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 88635b9d..dca16d02 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Rimuovi #compare compare.title=Compara compare.header=Compara PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Compara diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 648f1633..2ac0cf76 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=削除 #compare compare.title=比較 compare.header=PDFの比較 +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=ドキュメント 1 compare.document.2=ドキュメント 2 compare.submit=比較 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 40c48a21..b86dca72 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=제거하다 #compare compare.title=비교 compare.header=PDF 문서 비교 +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=문서 1 compare.document.2=문서 2 compare.submit=비교 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index e0b8aa2f..ed204678 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Verwijderen #compare compare.title=Vergelijken compare.header=PDF's vergelijken +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Vergelijken diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 84ed25f4..584cabf1 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Fjern #compare compare.title=Sammenlign compare.header=Sammenlign PDF-er +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Sammenlign diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 18017dba..63dd95e3 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Usuń #compare compare.title=Porównaj compare.header=Porównaj PDF(y) +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Porównaj diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index c1a41ff2..bf87d427 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Comparar compare.header=Comparar PDFs +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index f7905ea0..a0df21cd 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Remover #compare compare.title=Comparar compare.header=Comparar PDFs +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index b186c4c7..1786a47d 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Compară compare.header=Compară PDF-uri +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Compară diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index cbd5c285..d632969f 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Удалить #compare compare.title=Сравнение compare.header=Сравнение PDFы +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Сравнить diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 599ef7ba..f6f0cc1c 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Odstrániť #compare compare.title=Porovnať compare.header=Porovnať PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Porovnať diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 102fee73..c20ac0d4 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Ukloni #compare compare.title=Uporedi compare.header=Uporedi PDF fajlove +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Uporedi diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index ecbd13ba..c67574c6 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Jämför compare.header=Jämför PDF-filer +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Jämför diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 16e4b5ae..321d048f 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Kaldır #compare compare.title=Karşılaştır compare.header=PDF'leri Karşılaştır +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Belge 1 compare.document.2=Belge 2 compare.submit=Karşılaştır diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index ebe2d989..2f68967e 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=Видалити #compare compare.title=Порівняння compare.header=Порівняння PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Порівняти diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 46e46fbc..f24f092e 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=删除 #compare compare.title=比较 compare.header=比较PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=文档 1 compare.document.2=文档 2 compare.submit=比较 diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index ead961d0..6a4b3ac0 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -706,6 +706,8 @@ removeAnnotations.submit=移除 #compare compare.title=比較 compare.header=比較 PDF +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=文件 1 compare.document.2=文件 2 compare.submit=比較 -- 2.46.1 From a17105e650e93527273669971b07a9a11351e1ed Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 6 Jul 2024 22:25:38 +0200 Subject: [PATCH 010/231] Create stale.yml (#1530) * Create stale.yml * Update stale.yml --- .github/workflows/stale.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 00000000..485eefb3 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,32 @@ +name: Close stale issues + +on: + schedule: + - cron: "30 0 * * *" + workflow_dispatch: + +jobs: + stale: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - name: 30 days stale issues + uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + days-before-stale: 30 + days-before-close: 7 + stale-issue-message: > + This issue has been automatically marked as stale because it has had no recent activity. + It will be closed if no further activity occurs. Thank you for your contributions. + close-issue-message: > + This issue has been automatically closed because it has had no recent activity after being marked as stale. + Please reopen if you need further assistance. + stale-issue-label: "Stale" + remove-stale-when-updated: true + only-issue-labels: "more-info-needed" + days-before-pr-stale: -1 # Prevents PRs from being marked as stale + days-before-pr-close: -1 # Prevents PRs from being closed + start-date: '2024-07-06T00:00:00Z' # ISO 8601 Format -- 2.46.1 From 695fbb015010ada624874afaba118065f4dc8aaf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 21:48:53 +0000 Subject: [PATCH 011/231] :memo: Update README: Translation Progress Table (#1536) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 56 +++++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index a60a66dc..6be4482b 100644 --- a/README.md +++ b/README.md @@ -171,36 +171,36 @@ Stirling PDF currently supports 32! | ------------------------------------------- | -------------------------------------- | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| Arabic (العربية) (ar_AR) | ![46%](https://geps.dev/progress/46) | -| German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | -| French (Français) (fr_FR) | ![93%](https://geps.dev/progress/93) | -| Spanish (Español) (es_ES) | ![93%](https://geps.dev/progress/93) | -| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | -| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | -| Catalan (Català) (ca_CA) | ![49%](https://geps.dev/progress/49) | +| Arabic (العربية) (ar_AR) | ![45%](https://geps.dev/progress/45) | +| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | +| French (Français) (fr_FR) | ![91%](https://geps.dev/progress/91) | +| Spanish (Español) (es_ES) | ![92%](https://geps.dev/progress/92) | +| Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) | +| Traditional Chinese (繁體中文) (zh_TW) | ![96%](https://geps.dev/progress/96) | +| Catalan (Català) (ca_CA) | ![48%](https://geps.dev/progress/48) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Swedish (Svenska) (sv_SE) | ![40%](https://geps.dev/progress/40) | -| Polish (Polski) (pl_PL) | ![92%](https://geps.dev/progress/92) | +| Swedish (Svenska) (sv_SE) | ![39%](https://geps.dev/progress/39) | +| Polish (Polski) (pl_PL) | ![90%](https://geps.dev/progress/90) | | Romanian (Română) (ro_RO) | ![39%](https://geps.dev/progress/39) | -| Korean (한국어) (ko_KR) | ![86%](https://geps.dev/progress/86) | -| Portuguese Brazilian (Português) (pt_BR) | ![61%](https://geps.dev/progress/61) | -| Portuguese (Português) (pt_PT) | ![80%](https://geps.dev/progress/80) | -| Russian (Русский) (ru_RU) | ![86%](https://geps.dev/progress/86) | -| Basque (Euskara) (eu_ES) | ![63%](https://geps.dev/progress/63) | -| Japanese (日本語) (ja_JP) | ![92%](https://geps.dev/progress/92) | -| Dutch (Nederlands) (nl_NL) | ![98%](https://geps.dev/progress/98) | -| Greek (Ελληνικά) (el_GR) | ![84%](https://geps.dev/progress/84) | -| Turkish (Türkçe) (tr_TR) | ![96%](https://geps.dev/progress/96) | -| Indonesia (Bahasa Indonesia) (id_ID) | ![78%](https://geps.dev/progress/78) | -| Hindi (हिंदी) (hi_IN) | ![78%](https://geps.dev/progress/78) | -| Hungarian (Magyar) (hu_HU) | ![77%](https://geps.dev/progress/77) | -| Bulgarian (Български) (bg_BG) | ![96%](https://geps.dev/progress/96) | -| Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![80%](https://geps.dev/progress/80) | -| Ukrainian (Українська) (uk_UA) | ![92%](https://geps.dev/progress/92) | -| Slovakian (Slovensky) (sk_SK) | ![93%](https://geps.dev/progress/93) | -| Czech (Česky) (cs_CZ) | ![92%](https://geps.dev/progress/92) | -| Croatian (Hrvatski) (hr_HR) | ![97%](https://geps.dev/progress/97) | -| Norwegian (Norsk) (no_NB) | ![97%](https://geps.dev/progress/97) | +| Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | +| Portuguese Brazilian (Português) (pt_BR) | ![60%](https://geps.dev/progress/60) | +| Portuguese (Português) (pt_PT) | ![78%](https://geps.dev/progress/78) | +| Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | +| Basque (Euskara) (eu_ES) | ![62%](https://geps.dev/progress/62) | +| Japanese (日本語) (ja_JP) | ![90%](https://geps.dev/progress/90) | +| Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | +| Greek (Ελληνικά) (el_GR) | ![82%](https://geps.dev/progress/82) | +| Turkish (Türkçe) (tr_TR) | ![94%](https://geps.dev/progress/94) | +| Indonesia (Bahasa Indonesia) (id_ID) | ![76%](https://geps.dev/progress/76) | +| Hindi (हिंदी) (hi_IN) | ![77%](https://geps.dev/progress/77) | +| Hungarian (Magyar) (hu_HU) | ![76%](https://geps.dev/progress/76) | +| Bulgarian (Български) (bg_BG) | ![94%](https://geps.dev/progress/94) | +| Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![78%](https://geps.dev/progress/78) | +| Ukrainian (Українська) (uk_UA) | ![90%](https://geps.dev/progress/90) | +| Slovakian (Slovensky) (sk_SK) | ![92%](https://geps.dev/progress/92) | +| Czech (Česky) (cs_CZ) | ![90%](https://geps.dev/progress/90) | +| Croatian (Hrvatski) (hr_HR) | ![95%](https://geps.dev/progress/95) | +| Norwegian (Norsk) (no_NB) | ![96%](https://geps.dev/progress/96) | ## Contributing (creating issues, translations, fixing bugs, etc.) -- 2.46.1 From 422264a28813ca2cf86df3ee146fc8d4127cc9fd Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 6 Jul 2024 23:54:04 +0200 Subject: [PATCH 012/231] added non-translatable strings (#1537) Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- scripts/ignore_translation.toml | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index 682b4b4c..d55e820a 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -10,7 +10,11 @@ ignore = [ [ca_CA] ignore = [ + 'PDFToText.tags', + 'adminUserSettings.admin', 'language.direction', + 'survey.button', + 'watermark.type.1', ] [cs_CZ] @@ -48,6 +52,7 @@ ignore = [ ignore = [ 'adminUserSettings.roles', 'color', + 'error', 'language.direction', 'no', 'showJS.tags', @@ -60,8 +65,26 @@ ignore = [ [fr_FR] ignore = [ + 'AddStampRequest.alphabet', + 'AddStampRequest.position', + 'AddStampRequest.rotation', + 'PDFToBook.selectText.1', + 'addPageNumbers.selectText.3', + 'adminUserSettings.actions', + 'alphabet', + 'compare.document.1', + 'compare.document.2', + 'info', 'language.direction', + 'licenses.license', + 'licenses.module', + 'licenses.nav', + 'licenses.version', + 'pdfOrganiser.mode', + 'pipeline.title', + 'pipelineOptions.pipelineHeader', 'sponsor', + 'watermark.type.2', ] [hi_IN] @@ -71,6 +94,7 @@ ignore = [ [hr_HR] ignore = [ + 'PDFToBook.selectText.1', 'font', 'home.pipeline.title', 'info', @@ -115,6 +139,7 @@ ignore = [ [nl_NL] ignore = [ 'HTMLToPDF.print', + 'adjustContrast.contrast', 'compare.document.1', 'compare.document.2', 'error', @@ -130,11 +155,17 @@ ignore = [ [no_NB] ignore = [ + 'PDFToBook.selectText.1', + 'adminUserSettings.admin', + 'info', 'language.direction', + 'oops', + 'sponsor', ] [pl_PL] ignore = [ + 'PDFToBook.selectText.1', 'language.direction', ] @@ -160,12 +191,20 @@ ignore = [ [sk_SK] ignore = [ + 'adminUserSettings.admin', + 'home.multiTool.title', + 'info', 'language.direction', + 'navbar.sections.security', + 'text', + 'watermark.type.1', ] [sr_LATN_RS] ignore = [ 'language.direction', + 'licenses.version', + 'poweredBy', ] [sv_SE] -- 2.46.1 From 2a65fd08257c3128d9518496d6578ae5ca626272 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Jul 2024 11:45:50 +0100 Subject: [PATCH 013/231] :memo: Update README: Translation Progress Table (#1538) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6be4482b..15c9a24f 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ Stirling PDF currently supports 32! | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | Arabic (العربية) (ar_AR) | ![45%](https://geps.dev/progress/45) | | German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | -| French (Français) (fr_FR) | ![91%](https://geps.dev/progress/91) | +| French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | | Spanish (Español) (es_ES) | ![92%](https://geps.dev/progress/92) | | Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) | | Traditional Chinese (繁體中文) (zh_TW) | ![96%](https://geps.dev/progress/96) | -- 2.46.1 From b7d37deb85aa80f8cc19755082da682c99c9600c Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <104101892+pixeebot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 21:18:32 +0100 Subject: [PATCH 014/231] Refactored to use parameterized SQL APIs (#1545) Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com> --- .../config/security/database/DatabaseBackupHelper.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java index 026a9684..0cf1e612 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java @@ -8,6 +8,7 @@ import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -131,11 +132,12 @@ public class DatabaseBackupHelper implements DatabaseBackupInterface { DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyyMMddHHmm"); Path insertOutputFilePath = this.getBackupFilePath("backup_" + dateNow.format(myFormatObj) + ".sql"); - String query = "SCRIPT SIMPLE COLUMNS DROP to '" + insertOutputFilePath.toString() + "';"; + String query = "SCRIPT SIMPLE COLUMNS DROP to ?;"; try (Connection conn = DriverManager.getConnection(url, "sa", ""); - Statement stmt = conn.createStatement()) { - stmt.execute(query); + PreparedStatement stmt = conn.prepareStatement(query)) { + stmt.setString(1, insertOutputFilePath.toString()); + stmt.execute(); log.info("Database export completed: {}", insertOutputFilePath); } catch (SQLException e) { log.error("Error during database export: {}", e.getMessage(), e); -- 2.46.1 From 4bf78ffd5d551c2b7af005ec940e92fe26a551d7 Mon Sep 17 00:00:00 2001 From: taesaeng28 <85404654+taesaeng28@users.noreply.github.com> Date: Thu, 11 Jul 2024 01:05:29 +0700 Subject: [PATCH 015/231] Added support for Thai language (#1551) * Added support for Thai language * Correct Thai national flag proportions in SVG * Remove th_TH from env.LANGS causer Failed tests: Stirling-PDF-Regression Some tests failed. Error: Process completed with exit code 1. * fix incorrect syntax --- src/main/resources/messages_th_TH.properties | 1127 +++++++++++++++++ src/main/resources/static/images/flags/th.svg | 1 + .../templates/fragments/languages.html | 1 + 3 files changed, 1129 insertions(+) create mode 100644 src/main/resources/messages_th_TH.properties create mode 100644 src/main/resources/static/images/flags/th.svg diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties new file mode 100644 index 00000000..a40ac939 --- /dev/null +++ b/src/main/resources/messages_th_TH.properties @@ -0,0 +1,1127 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr=left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=เลือก PDF +multiPdfPrompt=เลือก PDF หลายไฟล์ (2 ขึ้นไป) +multiPdfDropPrompt=เลือก (หรือลากและวาง) PDF ทั้งหมดที่คุณต้องการ +imgPrompt=เลือกภาพ +genericSubmit=ส่ง +processTimeWarning=คำเตือน: กระบวนการนี้อาจใช้เวลาสูงสุดหนึ่งนาทีขึ้นอยู่กับขนาดไฟล์ +pageOrderPrompt=เรียงลำดับหน้าตามความต้องการ (ป้อนหมายเลขหน้าแยกด้วยเครื่องหมายจุลภาคหรือฟังก์ชัน เช่น 2n+1) : +pageSelectionPrompt=เลือกหน้าตามความต้องการ (ป้อนหมายเลขหน้าแยกด้วยเครื่องหมายจุลภาค เช่น 1,5,6 หรือฟังก์ชัน เช่น 2n+1) : +goToPage=ไปที่หน้า +true=จริง +false=เท็จ +unknown=ไม่ทราบ +save=บันทึก +saveToBrowser=บันทึกในเบราว์เซอร์ +close=ปิด +filesSelected=ไฟล์ที่เลือก +noFavourites=ไม่มีรายการโปรดที่เพิ่ม +downloadComplete=การดาวน์โหลดเสร็จสมบูรณ์ +bored=เบื่อรอหรือยัง? +alphabet=ตัวอักษร +downloadPdf=ดาวน์โหลด PDF +text=ข้อความ +font=ฟอนต์ +selectFillter=-- เลือก -- +pageNum=หมายเลขหน้า +sizes.small=เล็ก +sizes.medium=กลาง +sizes.large=ใหญ่ +sizes.x-large=ใหญ่มาก +error.pdfPassword=เอกสาร PDF มีรหัสผ่าน และไม่ได้ระบุรหัสผ่านหรือรหัสผ่านไม่ถูกต้อง +delete=ลบ +username=ชื่อผู้ใช้ +password=รหัสผ่าน +welcome=ยินดีต้อนรับ +property=คุณสมบัติ +black=ดำ +white=ขาว +red=แดง +green=เขียว +blue=น้ำเงิน +custom=ปรับแต่ง... +WorkInProgess=กำลังดำเนินการ อาจไม่ทำงานหรือมีบั๊ก โปรดรายงานปัญหาใด ๆ! +poweredBy=ขับเคลื่อนโดย +yes=ใช่ +no=ไม่ +changedCredsMessage=ข้อมูลรับรองเปลี่ยนแปลงแล้ว! +notAuthenticatedMessage=ผู้ใช้ไม่ได้รับการยืนยัน +userNotFoundMessage=ไม่พบผู้ใช้ +incorrectPasswordMessage=รหัสผ่านปัจจุบันไม่ถูกต้อง +usernameExistsMessage=ชื่อผู้ใช้ใหม่มีอยู่แล้ว +invalidUsernameMessage=ชื่อผู้ใช้ไม่ถูกต้อง ชื่อผู้ใช้สามารถประกอบด้วยตัวอักษร ตัวเลข และอักขระพิเศษต่อไปนี้ @._+- หรือจะต้องเป็นที่อยู่อีเมลที่ถูกต้อง +confirmPasswordErrorMessage=รหัสผ่านใหม่และยืนยันรหัสผ่านใหม่ต้องตรงกัน +deleteCurrentUserMessage=ไม่สามารถลบผู้ใช้ที่เข้าสู่ระบบในปัจจุบันได้ +deleteUsernameExistsMessage=ชื่อผู้ใช้ไม่ปรากฏและไม่สามารถลบได้ +downgradeCurrentUserMessage=ไม่สามารถลดระดับบทบาทของผู้ใช้ปัจจุบันได้ +downgradeCurrentUserLongMessage=ไม่สามารถลดระดับบทบาทของผู้ใช้ปัจจุบันได้ ดังนั้นผู้ใช้ปัจจุบันจะไม่ปรากฏ +userAlreadyExistsOAuthMessage=ผู้ใช้มีอยู่แล้วในฐานะผู้ใช้ OAuth2 +userAlreadyExistsWebMessage=ผู้ใช้มีอยู่แล้วในฐานะผู้ใช้เว็บ +error=ข้อผิดพลาด +oops=อุ๊ย! +help=ช่วยเหลือ +goHomepage=ไปที่หน้าหลัก +joinDiscord=เข้าร่วมเซิร์ฟเวอร์ Discord ของเรา +seeDockerHub=ดู Docker Hub +visitGithub=เยี่ยมชมที่เก็บ Github +donate=บริจาค +color=สี +sponsor=ผู้สนับสนุน +info=ข้อมูล + + + +############### +# Pipeline # +############### +pipeline.header=เมนู Pipeline (เบต้า) +pipeline.uploadButton=อัปโหลดแบบกำหนดเอง +pipeline.configureButton=กำหนดค่า +pipeline.defaultOption=กำหนดเอง +pipeline.submitButton=ส่ง +pipeline.help=ความช่วยเหลือ Pipeline +pipeline.scanHelp=ความช่วยเหลือการสแกนโฟลเดอร์ +pipeline.deletePrompt=คุณแน่ใจว่าต้องการลบ pipeline ใช่ไหม + +###################### +# Pipeline Options # +###################### +pipelineOptions.header=การกำหนดค่า Pipeline +pipelineOptions.pipelineNameLabel=ชื่อ Pipeline +pipelineOptions.saveSettings=บันทึกการตั้งค่าการดำเนินการ +pipelineOptions.pipelineNamePrompt=ใส่ชื่อ pipeline ที่นี่ +pipelineOptions.selectOperation=เลือกการดำเนินการ +pipelineOptions.addOperationButton=เพิ่มการดำเนินการ +pipelineOptions.pipelineHeader=Pipeline: +pipelineOptions.saveButton=ดาวน์โหลด +pipelineOptions.validateButton=ตรวจสอบความถูกต้อง + + + + +############# +# NAVBAR # +############# +navbar.favorite=รายการโปรด +navbar.darkmode=โหมดมืด +navbar.language=ภาษา +navbar.settings=การตั้งค่า +navbar.allTools=เครื่องมือทั้งหมด +navbar.multiTool=เครื่องมือหลายตัว +navbar.sections.organize=จัดระเบียบ +navbar.sections.convertTo=แปลงเป็น PDF +navbar.sections.convertFrom=แปลงจาก PDF +navbar.sections.security=ลงนามและความปลอดภัย +navbar.sections.advance=ขั้นสูง +navbar.sections.edit=ดูและแก้ไข + +############# +# SETTINGS # +############# +settings.title=การตั้งค่า +settings.update=มีการอัปเดต +settings.updateAvailable={0} คือเวอร์ชันที่ติดตั้งในปัจจุบัน มีเวอร์ชันใหม่ ({1}) พร้อมให้บริการ +settings.appVersion=เวอร์ชันแอป: +settings.downloadOption.title=เลือกตัวเลือกการดาวน์โหลด (สำหรับการดาวน์โหลดไฟล์เดียวที่ไม่ใช่ zip): +settings.downloadOption.1=เปิดในหน้าต่างเดียวกัน +settings.downloadOption.2=เปิดในหน้าต่างใหม่ +settings.downloadOption.3=ดาวน์โหลดไฟล์ +settings.zipThreshold=บีบอัดไฟล์เมื่อจำนวนไฟล์ที่ดาวน์โหลดเกิน +settings.signOut=ออกจากระบบ +settings.accountSettings=การตั้งค่าบัญชี +settings.bored.help=เปิดใช้งานเกม easter egg +settings.cacheInputs.name=บันทึกการป้อนฟอร์ม +settings.cacheInputs.help=เปิดใช้งานเพื่อบันทึกการป้อนข้อมูลที่ใช้ก่อนหน้านี้สำหรับการรันในอนาคต + +changeCreds.title=เปลี่ยนข้อมูลรับรอง +changeCreds.header=อัปเดตรายละเอียดบัญชีของคุณ +changeCreds.changePassword=คุณกำลังใช้ข้อมูลรับรองการเข้าสู่ระบบเริ่มต้น กรุณาใส่รหัสผ่านใหม่ +changeCreds.newUsername=ชื่อผู้ใช้ใหม่ +changeCreds.oldPassword=รหัสผ่านปัจจุบัน +changeCreds.newPassword=รหัสผ่านใหม่ +changeCreds.confirmNewPassword=ยืนยันรหัสผ่านใหม่ +changeCreds.submit=ส่งการเปลี่ยนแปลง + + + +account.title=การตั้งค่าบัญชี +account.accountSettings=การตั้งค่าบัญชี +account.adminSettings=การตั้งค่าผู้ดูแลระบบ - ดูและเพิ่มผู้ใช้ +account.userControlSettings=การควบคุมผู้ใช้ +account.changeUsername=เปลี่ยนชื่อผู้ใช้ +account.newUsername=ชื่อผู้ใช้ใหม่ +account.password=รหัสผ่านยืนยัน +account.oldPassword=รหัสผ่านเก่า +account.newPassword=รหัสผ่านใหม่ +account.changePassword=เปลี่ยนรหัสผ่าน +account.confirmNewPassword=ยืนยันรหัสผ่านใหม่ +account.signOut=ออกจากระบบ +account.yourApiKey=คีย์ API ของคุณ +account.syncTitle=ซิงค์การตั้งค่าเบราว์เซอร์กับบัญชี +account.settingsCompare=การเปรียบเทียบการตั้งค่า: +account.property=คุณสมบัติ +account.webBrowserSettings=การตั้งค่าเบราว์เซอร์เว็บ +account.syncToBrowser=ซิงค์บัญชี -> เบราว์เซอร์ +account.syncToAccount=ซิงค์บัญชี <- เบราว์เซอร์ + + +adminUserSettings.title=การควบคุมผู้ใช้ +adminUserSettings.header=การควบคุมผู้ใช้ +adminUserSettings.admin=ผู้ดูแลระบบ +adminUserSettings.user=ผู้ใช้ +adminUserSettings.addUser=เพิ่มผู้ใช้ใหม่ +adminUserSettings.deleteUser=ลบผู้ใช้ +adminUserSettings.confirmDeleteUser=ควรลบผู้ใช้นี้หรือไม่? +adminUserSettings.usernameInfo=ชื่อผู้ใช้สามารถประกอบด้วยตัวอักษร ตัวเลข และอักขระพิเศษต่อไปนี้ @._+- หรือจะต้องเป็นที่อยู่อีเมลที่ถูกต้อง +adminUserSettings.roles=บทบาท +adminUserSettings.role=บทบาท +adminUserSettings.actions=การดำเนินการ +adminUserSettings.apiUser=ผู้ใช้ API จำกัด +adminUserSettings.extraApiUser=ผู้ใช้ API เพิ่มเติม +adminUserSettings.webOnlyUser=ผู้ใช้เว็บเท่านั้น +adminUserSettings.demoUser=ผู้ใช้ทดลอง (ไม่มีการตั้งค่าปรับแต่ง) +adminUserSettings.internalApiUser=ผู้ใช้ API ภายใน +adminUserSettings.forceChange=บังคับให้ผู้ใช้เปลี่ยนรหัสผ่านในการเข้าสู่ระบบ +adminUserSettings.submit=บันทึกผู้ใช้ +adminUserSettings.changeUserRole=เปลี่ยนบทบาทของผู้ใช้ +adminUserSettings.authenticated=ได้รับการยืนยันแล้ว + + +database.title=การนำเข้า/ส่งออกฐานข้อมูล +database.header=การนำเข้า/ส่งออกฐานข้อมูล +database.fileName=ชื่อไฟล์ +database.creationDate=วันที่สร้าง +database.fileSize=ขนาดไฟล์ +database.deleteBackupFile=ลบไฟล์สำรอง +database.importBackupFile=นำเข้าไฟล์สำรอง +database.downloadBackupFile=ดาวน์โหลดไฟล์สำรอง +database.info_1=เมื่อนำเข้าข้อมูล จำเป็นต้องแน่ใจว่าโครงสร้างถูกต้อง หากไม่แน่ใจว่ากำลังทำอะไรอยู่ ควรขอคำแนะนำและความช่วยเหลือจากมืออาชีพ ความผิดพลาดในโครงสร้างอาจทำให้เกิดข้อบกพร่องในการทำงานของแอปพลิเคชันจนถึงขั้นไม่สามารถรันแอปพลิเคชันได้เลย +database.info_2=ชื่อไฟล์ไม่สำคัญเมื่ออัปโหลด จะถูกเปลี่ยนชื่อภายหลังให้เป็นรูปแบบ backup_user_yyyyMMddHHmm.sql เพื่อให้มีการตั้งชื่อที่สอดคล้องกัน +database.submit=นำเข้าสำรอง +database.importIntoDatabaseSuccessed=การนำเข้าในฐานข้อมูลสำเร็จ +database.fileNotFound=ไม่พบไฟล์ +database.fileNullOrEmpty=ไฟล์ต้องไม่ว่างเปล่าหรือไม่มีข้อมูล +database.failedImportFile=การนำเข้าไฟล์ล้มเหลว + +############# +# HOME-PAGE # +############# +home.desc=ศูนย์รวมทุกความต้องการของคุณเกี่ยวกับ PDF ที่โฮสต์ในท้องถิ่นของคุณ +home.searchBar=ค้นหาคุณสมบัติ... + + +home.viewPdf.title=ดู PDF +home.viewPdf.desc=ดู เพิ่มคำอธิบาย เพิ่มข้อความหรือรูปภาพ +viewPdf.tags=ดู, อ่าน, เพิ่มคำอธิบาย, ข้อความ, รูปภาพ + +home.multiTool.title=เครื่องมือ PDF หลายตัว +home.multiTool.desc=รวม หมุน จัดเรียง และลบหน้าต่างๆ +multiTool.tags=เครื่องมือหลายตัว, หลายการดำเนินการ, UI, คลิกและลาก, ส่วนหน้า, ฝั่งไคลเอนต์, อินเตอร์แอคทีฟ, เคลื่อนย้าย + +home.merge.title=รวมไฟล์ PDF +home.merge.desc=รวม PDF หลายไฟล์เป็นหนึ่งเดียวได้อย่างง่ายดาย +merge.tags=รวม, การดำเนินการหน้า, ฝั่งเซิร์ฟเวอร์ + +home.split.title=แยกไฟล์ PDF +home.split.desc=แยก PDF เป็นหลายเอกสาร +split.tags=การดำเนินการหน้า, แบ่ง, หลายหน้า, ตัด, ฝั่งเซิร์ฟเวอร์ + +home.rotate.title=หมุน +home.rotate.desc=หมุน PDF ของคุณได้อย่างง่ายดาย +rotate.tags=ฝั่งเซิร์ฟเวอร์ + + +home.imageToPdf.title=รูปภาพเป็น PDF +home.imageToPdf.desc=แปลงรูปภาพ (PNG, JPEG, GIF) เป็น PDF +imageToPdf.tags=การแปลง, รูปภาพ, JPG, ภาพ, รูปถ่าย + +home.pdfToImage.title=PDF เป็นรูปภาพ +home.pdfToImage.desc=แปลง PDF เป็นรูปภาพ (PNG, JPEG, GIF) +pdfToImage.tags=การแปลง, รูปภาพ, JPG, ภาพ, รูปถ่าย + +home.pdfOrganiser.title=จัดระเบียบ +home.pdfOrganiser.desc=ลบ/จัดเรียงหน้าต่างๆ ในลำดับที่ต้องการ +pdfOrganiser.tags=สองหน้า, คู่ขนาน, เรียงลำดับ, เคลื่อนย้าย + + +home.addImage.title=เพิ่มรูปภาพ +home.addImage.desc=เพิ่มรูปภาพไปยังตำแหน่งที่กำหนดใน PDF +addImage.tags=รูปภาพ, JPG, ภาพ, รูปถ่าย + +home.watermark.title=เพิ่มลายน้ำ +home.watermark.desc=เพิ่มลายน้ำที่กำหนดเองลงในเอกสาร PDF ของคุณ +watermark.tags=ข้อความ, ซ้ำ, ป้าย, ของคุณเอง, ลิขสิทธิ์, เครื่องหมายการค้า, รูปภาพ, JPG, ภาพ, รูปถ่าย + +home.permissions.title=เปลี่ยนสิทธิ์ +home.permissions.desc=เปลี่ยนสิทธิ์ของเอกสาร PDF ของคุณ +permissions.tags=อ่าน, เขียน, แก้ไข, พิมพ์ + + +home.removePages.title=ลบ +home.removePages.desc=ลบหน้าที่ไม่ต้องการจากเอกสาร PDF ของคุณ +removePages.tags=ลบหน้า, ลบหน้า + +home.addPassword.title=เพิ่มรหัสผ่าน +home.addPassword.desc=เข้ารหัสเอกสาร PDF ของคุณด้วยรหัสผ่าน +addPassword.tags=ปลอดภัย, ความปลอดภัย + +home.removePassword.title=ลบรหัสผ่าน +home.removePassword.desc=ลบรหัสผ่านจากการป้องกันเอกสาร PDF ของคุณ +removePassword.tags=ปลอดภัย, ถอดรหัส, ความปลอดภัย, ลบรหัสผ่าน + +home.compressPdfs.title=บีบอัด +home.compressPdfs.desc=บีบอัด PDF เพื่อลดขนาดไฟล์ +compressPdfs.tags=ย่อ, เล็ก, จิ๋ว + + +home.changeMetadata.title=เปลี่ยนข้อมูลเมตา +home.changeMetadata.desc=เปลี่ยน/ลบ/เพิ่มข้อมูลเมตาจากเอกสาร PDF +changeMetadata.tags=ชื่อ, ผู้แต่ง, วันที่, สร้าง, เวลา, ผู้เผยแพร่, ผู้ผลิต, สถิติ + +home.fileToPDF.title=แปลงไฟล์เป็น PDF +home.fileToPDF.desc=แปลงไฟล์เกือบทุกประเภทเป็น PDF (DOCX, PNG, XLS, PPT, TXT และอื่น ๆ) +fileToPDF.tags=การแปลง, รูปแบบ, เอกสาร, รูปภาพ, สไลด์, ข้อความ, การแปลง, สำนักงาน, เอกสาร, Word, Excel, PowerPoint + +home.ocr.title=OCR / ทำความสะอาดการสแกน +home.ocr.desc=ทำความสะอาดการสแกนและตรวจจับข้อความจากภาพภายใน PDF และเพิ่มเป็นข้อความอีกครั้ง +ocr.tags=การรู้จำ, ข้อความ, รูปภาพ, การสแกน, อ่าน, ระบุ, ตรวจจับ, แก้ไขได้ + + +home.extractImages.title=แยกรูปภาพ +home.extractImages.desc=แยกรูปภาพทั้งหมดจาก PDF และบันทึกในรูปแบบ zip +extractImages.tags=รูปภาพ, ภาพ, บันทึก, เก็บถาวร, zip, จับ, รับ + +home.pdfToPDFA.title=PDF เป็น PDF/A +home.pdfToPDFA.desc=แปลง PDF เป็น PDF/A สำหรับการจัดเก็บระยะยาว +pdfToPDFA.tags=การจัดเก็บ, ระยะยาว, มาตรฐาน, การแปลง, การเก็บรักษา + +home.PDFToWord.title=PDF เป็น Word +home.PDFToWord.desc=แปลง PDF เป็นรูปแบบ Word (DOC, DOCX และ ODT) +PDFToWord.tags=doc, docx, odt, word, การแปลง, รูปแบบ, การแปลง, สำนักงาน, microsoft, docfile + +home.PDFToPresentation.title=PDF เป็น Presentation +home.PDFToPresentation.desc=แปลง PDF เป็นรูปแบบ Presentation (PPT, PPTX และ ODP) +PDFToPresentation.tags=สไลด์, โชว์, สำนักงาน, microsoft + +home.PDFToText.title=PDF เป็น RTF (Text) +home.PDFToText.desc=แปลง PDF เป็นรูปแบบข้อความหรือ RTF +PDFToText.tags=รูปแบบข้อความที่มีคุณภาพ, rich text format + +home.PDFToHTML.title=PDF เป็น HTML +home.PDFToHTML.desc=แปลง PDF เป็นรูปแบบ HTML +PDFToHTML.tags=เนื้อหาเว็บ, เป็นมิตรกับเบราว์เซอร์ + + +home.PDFToXML.title=PDF เป็น XML +home.PDFToXML.desc=แปลง PDF เป็นรูปแบบ XML +PDFToXML.tags=การแยกข้อมูล, เนื้อหาโครงสร้าง, การทำงานร่วมกัน, การแปลง + +home.ScannerImageSplit.title=ตรวจจับ/แยกรูปภาพสแกน +home.ScannerImageSplit.desc=แยกรูปภาพหลายรูปจากภาพ/ PDF +ScannerImageSplit.tags=แยก, ตรวจจับอัตโนมัติ, การสแกน, รูปภาพหลายรูป, จัดระเบียบ + +home.sign.title=เซ็นชื่อ +home.sign.desc=เพิ่มลายเซ็นลงใน PDF ด้วยการวาด ข้อความ หรือรูปภาพ +sign.tags=อนุญาต, อักษรย่อ, ลายเซ็นที่วาด, ลายเซ็นข้อความ, ลายเซ็นรูปภาพ + +home.flatten.title=แบน +home.flatten.desc=ลบองค์ประกอบแบบอินเตอร์แอคทีฟและฟอร์มทั้งหมดจาก PDF +flatten.tags=สถิต, ปิดการใช้งาน, ไม่โต้ตอบ, ลดจำนวน + +home.repair.title=ซ่อมแซม +home.repair.desc=พยายามซ่อมแซม PDF ที่เสียหาย/แตก +repair.tags=ซ่อมแซม, กู้คืน, กู้ + +home.removeBlanks.title=ลบหน้าว่าง +home.removeBlanks.desc=ตรวจจับและลบหน้าว่างจากเอกสาร +removeBlanks.tags=ทำความสะอาด, ลดจำนวน, ไม่มีเนื้อหา, จัดระเบียบ + +home.removeAnnotations.title=ลบคำอธิบายประกอบ +home.removeAnnotations.desc=ลบความคิดเห็น/คำอธิบายประกอบทั้งหมดจาก PDF +removeAnnotations.tags=ความคิดเห็น, เน้นข้อความ, โน้ต, มาร์คอัพ, ลบ + +home.compare.title=เปรียบเทียบ +home.compare.desc=เปรียบเทียบและแสดงความแตกต่างระหว่างเอกสาร PDF สองฉบับ +compare.tags=แยกแยะ, เปรียบเทียบ, การเปลี่ยนแปลง, การวิเคราะห์ + +home.certSign.title=เซ็นชื่อด้วยใบรับรอง +home.certSign.desc=เซ็นชื่อ PDF ด้วยใบรับรอง/คีย์ (PEM/P12) +certSign.tags=ยืนยัน, PEM, P12, เป็นทางการ, เข้ารหัส + +home.removeCertSign.title=ลบลายเซ็นใบรับรอง +home.removeCertSign.desc=ลบลายเซ็นใบรับรองจาก PDF +removeCertSign.tags=ยืนยัน, PEM, P12, เป็นทางการ, ถอดรหัส + +home.pageLayout.title=เลย์เอาต์หลายหน้า +home.pageLayout.desc=รวมหน้าหลายหน้าของเอกสาร PDF เข้าด้วยกันในหน้าเดียว +pageLayout.tags=รวม, ประกอบ, มุมมองเดียว, จัดระเบียบ + +home.scalePages.title=ปรับขนาด/สเกลหน้า +home.scalePages.desc=เปลี่ยนขนาด/สเกลของหน้าและ/หรือเนื้อหาของมัน +scalePages.tags=ปรับขนาด, แก้ไข, มิติ, ปรับ + +home.pipeline.title=Pipeline +home.pipeline.desc=เรียกใช้งานหลายการกระทำใน PDF โดยกำหนดสคริปต์ pipeline +pipeline.tags=อัตโนมัติ, ลำดับ, สคริปต์, ประมวลผลแบทช์ + +home.add-page-numbers.title=เพิ่มหมายเลขหน้า +home.add-page-numbers.desc=เพิ่มหมายเลขหน้าตลอดทั้งเอกสารในตำแหน่งที่กำหนด +add-page-numbers.tags=หน้า, เลขหน้า, จัดระเบียบ, ดัชนี + +home.auto-rename.title=เปลี่ยนชื่อ PDF อัตโนมัติ +home.auto-rename.desc=เปลี่ยนชื่อไฟล์ PDF โดยอัตโนมัติตามหัวข้อที่ตรวจจับได้ +auto-rename.tags=ตรวจจับอัตโนมัติ, ตั้งชื่อใหม่, จัดระเบียบ, ป้าย + +home.adjust-contrast.title=ปรับสี/คอนทราสต์ +home.adjust-contrast.desc=ปรับคอนทราสต์ ความอิ่มตัว และความสว่างของ PDF +adjust-contrast.tags=ปรับสี, จูน, แก้ไข, ปรับปรุง + +home.crop.title=ครอบตัด PDF +home.crop.desc=ครอบตัด PDF เพื่อลดขนาด (รักษาข้อความ!) +crop.tags=ครอบตัด, ลดขนาด, แก้ไข, รูปทรง + +home.autoSplitPDF.title=แยกหน้าอัตโนมัติ +home.autoSplitPDF.desc=แยก PDF ที่สแกนโดยใช้ QR Code แยกหน้า +autoSplitPDF.tags=แยกโดย QR, แยก, ส่วนสแกน, จัดระเบียบ + +home.sanitizePdf.title=ทำความสะอาด +home.sanitizePdf.desc=ลบสคริปต์และองค์ประกอบอื่นๆ จากไฟล์ PDF +sanitizePdf.tags=ทำความสะอาด, ปลอดภัย, ปลอดภัย, ลบภัยคุกคาม + +home.URLToPDF.title=URL/เว็บไซต์เป็น PDF +home.URLToPDF.desc=แปลง URL http(s) เป็น PDF +URLToPDF.tags=จับเว็บ, บันทึกหน้า, เว็บเป็นเอกสาร, จัดเก็บ + +home.HTMLToPDF.title=HTML เป็น PDF +home.HTMLToPDF.desc=แปลงไฟล์ HTML หรือ zip เป็น PDF +HTMLToPDF.tags=มาร์กอัป, เนื้อหาเว็บ, การแปลง, การแปลง + + +home.MarkdownToPDF.title=Markdown เป็น PDF +home.MarkdownToPDF.desc=แปลงไฟล์ Markdown เป็น PDF +MarkdownToPDF.tags=มาร์กอัป, เนื้อหาเว็บ, การแปลง, การแปลง + + +home.getPdfInfo.title=รับข้อมูลทั้งหมดเกี่ยวกับ PDF +home.getPdfInfo.desc=รับข้อมูลที่เป็นไปได้ทั้งหมดเกี่ยวกับ PDF +getPdfInfo.tags=ข้อมูล, สถิติ, สถิติ + + +home.extractPage.title=แยกหน้า +home.extractPage.desc=แยกหน้าที่เลือกจาก PDF +extractPage.tags=แยก + + +home.PdfToSinglePage.title=หน้าขนาดใหญ่เพียงหน้าเดียว +home.PdfToSinglePage.desc=รวมหน้าทั้งหมดของ PDF เป็นหน้าเดียวขนาดใหญ่ +PdfToSinglePage.tags=หน้าเดียว + + +home.showJS.title=แสดง Javascript +home.showJS.desc=ค้นหาและแสดง Javascript ที่ฝังใน PDF +showJS.tags=JS + +home.autoRedact.title=ซ่อนข้อมูลอัตโนมัติ +home.autoRedact.desc=ซ่อนข้อความใน PDF โดยอัตโนมัติตามข้อความที่ป้อน +autoRedact.tags=ซ่อน, ซ่อนข้อความ, ซ่อนด้วยสีดำ + +home.tableExtraxt.title=PDF เป็น CSV +home.tableExtraxt.desc=แยกตารางจาก PDF แปลงเป็น CSV +tableExtraxt.tags=CSV, การแยกตาราง, แยก, การแปลง + + +home.autoSizeSplitPDF.title=แยกตามขนาด/จำนวน +home.autoSizeSplitPDF.desc=แยก PDF เป็นเอกสารหลายฉบับตามขนาด จำนวนหน้า หรือจำนวนเอกสาร +autoSizeSplitPDF.tags=pdf, แยก, เอกสาร, การจัดระเบียบ + + +home.overlay-pdfs.title=ซ้อนทับ PDF +home.overlay-pdfs.desc=ซ้อนทับ PDF บน PDF อีกไฟล์หนึ่ง +overlay-pdfs.tags=ซ้อนทับ + +home.split-by-sections.title=แยก PDF เป็นส่วน +home.split-by-sections.desc=แบ่งแต่ละหน้าของ PDF เป็นส่วนย่อยแนวนอนและแนวตั้ง +split-by-sections.tags=แยกส่วน, แบ่ง, ปรับแต่ง + +home.AddStampRequest.title=เพิ่มตราประทับลงใน PDF +home.AddStampRequest.desc=เพิ่มข้อความหรือตราประทับรูปภาพในตำแหน่งที่กำหนด +AddStampRequest.tags=ตราประทับ, เพิ่มรูปภาพ, รูปภาพกึ่งกลาง, ลายน้ำ, PDF, ฝัง, ปรับแต่ง + + +home.PDFToBook.title=PDF เป็นหนังสือ +home.PDFToBook.desc=แปลง PDF เป็นรูปแบบหนังสือ/การ์ตูนโดยใช้ Calibre +PDFToBook.tags=หนังสือ, การ์ตูน, Calibre, แปลง, มังงะ, amazon, kindle + +home.BookToPDF.title=หนังสือเป็น PDF +home.BookToPDF.desc=แปลงรูปแบบหนังสือ/การ์ตูนเป็น PDF โดยใช้ Calibre +BookToPDF.tags=หนังสือ, การ์ตูน, Calibre, แปลง, มังงะ, amazon, kindle + + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=ลงชื่อเข้าใช้ +login.header=ลงชื่อเข้าใช้ +login.signin=ลงชื่อเข้าใช้ +login.rememberme=จำฉันไว้ +login.invalid=ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง +login.locked=บัญชีของคุณถูกล็อค +login.signinTitle=กรุณาลงชื่อเข้าใช้ +login.ssoSignIn=เข้าสู่ระบบด้วย Single Sign-on +login.oauth2AutoCreateDisabled=การสร้างผู้ใช้ OAuth2 อัตโนมัติถูกปิดใช้งาน +login.oauth2RequestNotFound=ไม่พบคำขอการอนุญาต +login.oauth2InvalidUserInfoResponse=การตอบกลับข้อมูลผู้ใช้ไม่ถูกต้อง +login.oauth2invalidRequest=คำขอไม่ถูกต้อง +login.oauth2AccessDenied=การเข้าถึงถูกปฏิเสธ +login.oauth2InvalidTokenResponse=การตอบกลับโทเค็นไม่ถูกต้อง +login.oauth2InvalidIdToken=โทเค็น Id ไม่ถูกต้อง + + +#auto-redact +autoRedact.title=ซ่อนข้อมูลอัตโนมัติ +autoRedact.header=ซ่อนข้อมูลอัตโนมัติ +autoRedact.colorLabel=สี +autoRedact.textsToRedactLabel=ข้อความที่จะซ่อน (แยกด้วยบรรทัด) +autoRedact.textsToRedactPlaceholder=เช่น \nConfidential \nTop-Secret +autoRedact.useRegexLabel=ใช้ Regex +autoRedact.wholeWordSearchLabel=ค้นหาทั้งคำ +autoRedact.customPaddingLabel=การเติมที่กำหนดเอง +autoRedact.convertPDFToImageLabel=แปลง PDF เป็นภาพ PDF (ใช้เพื่อลบข้อความที่อยู่ด้านหลังกล่อง) +autoRedact.submitButton=ส่ง + + +#showJS +showJS.title=แสดง Javascript +showJS.header=แสดง Javascript +showJS.downloadJS=ดาวน์โหลด Javascript +showJS.submit=แสดง + + +#pdfToSinglePage +pdfToSinglePage.title=PDF เป็นหน้าขนาดใหญ่เพียงหน้าเดียว +pdfToSinglePage.header=PDF เป็นหน้าขนาดใหญ่เพียงหน้าเดียว +pdfToSinglePage.submit=แปลงเป็นหน้าขนาดใหญ่เพียงหน้าเดียว + + +#pageExtracter +pageExtracter.title=แยกหน้า +pageExtracter.header=แยกหน้า +pageExtracter.submit=แยก +pageExtracter.placeholder=(เช่น 1,2,8 หรือ 4,7,12-16 หรือ 2n-1) + + +#getPdfInfo +getPdfInfo.title=รับข้อมูลเกี่ยวกับ PDF +getPdfInfo.header=รับข้อมูลเกี่ยวกับ PDF +getPdfInfo.submit=รับข้อมูล +getPdfInfo.downloadJson=ดาวน์โหลด JSON + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown เป็น PDF +MarkdownToPDF.header=Markdown เป็น PDF +MarkdownToPDF.submit=แปลง +MarkdownToPDF.help=กำลังดำเนินการ +MarkdownToPDF.credit=ใช้ WeasyPrint + + + +#url-to-pdf +URLToPDF.title=URL เป็น PDF +URLToPDF.header=URL เป็น PDF +URLToPDF.submit=แปลง +URLToPDF.credit=ใช้ WeasyPrint + + +#html-to-pdf +HTMLToPDF.title=HTML เป็น PDF +HTMLToPDF.header=HTML เป็น PDF +HTMLToPDF.help=ยอมรับไฟล์ HTML และ ZIP ที่มี html/css/รูปภาพ ฯลฯ ที่จำเป็น +HTMLToPDF.submit=แปลง +HTMLToPDF.credit=ใช้ WeasyPrint +HTMLToPDF.zoom=ระดับการซูมสำหรับการแสดงเว็บไซต์ +HTMLToPDF.pageWidth=ความกว้างของหน้าเป็นเซนติเมตร (เว้นว่างเพื่อใช้ค่าเริ่มต้น) +HTMLToPDF.pageHeight=ความสูงของหน้าเป็นเซนติเมตร (เว้นว่างเพื่อใช้ค่าเริ่มต้น) +HTMLToPDF.marginTop=ขอบบนของหน้าเป็นมิลลิเมตร (เว้นว่างเพื่อใช้ค่าเริ่มต้น) +HTMLToPDF.marginBottom=ขอบล่างของหน้าเป็นมิลลิเมตร (เว้นว่างเพื่อใช้ค่าเริ่มต้น) +HTMLToPDF.marginLeft=ขอบซ้ายของหน้าเป็นมิลลิเมตร (เว้นว่างเพื่อใช้ค่าเริ่มต้น) +HTMLToPDF.marginRight=ขอบขวาของหน้าเป็นมิลลิเมตร (เว้นว่างเพื่อใช้ค่าเริ่มต้น) +HTMLToPDF.printBackground=แสดงพื้นหลังของเว็บไซต์ +HTMLToPDF.defaultHeader=เปิดใช้งานหัวเรื่องเริ่มต้น (ชื่อและหมายเลขหน้า) +HTMLToPDF.cssMediaType=เปลี่ยนประเภทสื่อ CSS ของหน้า +HTMLToPDF.none=ไม่มี +HTMLToPDF.print=พิมพ์ +HTMLToPDF.screen=หน้าจอ + + +#AddStampRequest +AddStampRequest.header=ตราประทับ PDF +AddStampRequest.title=ตราประทับ PDF +AddStampRequest.stampType=ประเภทตราประทับ +AddStampRequest.stampText=ข้อความตราประทับ +AddStampRequest.stampImage=รูปภาพตราประทับ +AddStampRequest.alphabet=ตัวอักษร +AddStampRequest.fontSize=ขนาดฟอนต์/รูปภาพ +AddStampRequest.rotation=การหมุน +AddStampRequest.opacity=ความทึบ +AddStampRequest.position=ตำแหน่ง +AddStampRequest.overrideX=แทนที่พิกัด X +AddStampRequest.overrideY=แทนที่พิกัด Y +AddStampRequest.customMargin=ขอบที่กำหนดเอง +AddStampRequest.customColor=สีข้อความที่กำหนดเอง +AddStampRequest.submit=ส่ง + + +#sanitizePDF +sanitizePDF.title=ทำความสะอาด PDF +sanitizePDF.header=ทำความสะอาดไฟล์ PDF +sanitizePDF.selectText.1=ลบการกระทำ JavaScript +sanitizePDF.selectText.2=ลบไฟล์ฝังตัว +sanitizePDF.selectText.3=ลบข้อมูลเมตา +sanitizePDF.selectText.4=ลบลิงก์ +sanitizePDF.selectText.5=ลบฟอนต์ +sanitizePDF.submit=ทำความสะอาด PDF + + +#addPageNumbers +addPageNumbers.title=เพิ่มหมายเลขหน้า +addPageNumbers.header=เพิ่มหมายเลขหน้า +addPageNumbers.selectText.1=เลือกไฟล์ PDF: +addPageNumbers.selectText.2=ขนาดขอบ +addPageNumbers.selectText.3=ตำแหน่ง +addPageNumbers.selectText.4=หมายเลขเริ่มต้น +addPageNumbers.selectText.5=หน้าเพื่อกำหนดหมายเลข +addPageNumbers.selectText.6=ข้อความที่กำหนดเอง +addPageNumbers.customTextDesc=ข้อความที่กำหนดเอง +addPageNumbers.numberPagesDesc=หมายเลขหน้าที่จะกำหนด หมายเลขเริ่มต้น 'ทั้งหมด', ยังยอมรับ 1-5 หรือ 2,5,9 เป็นต้น +addPageNumbers.customNumberDesc=ค่าเริ่มต้น {n}, ยังยอมรับ 'หน้า {n} ของ {total}', 'ข้อความ-{n}', '{filename}-{n}' +addPageNumbers.submit=เพิ่มหมายเลขหน้า + + +#auto-rename +auto-rename.title=เปลี่ยนชื่ออัตโนมัติ +auto-rename.header=เปลี่ยนชื่อ PDF อัตโนมัติ +auto-rename.submit=เปลี่ยนชื่ออัตโนมัติ + + +#adjustContrast +adjustContrast.title=ปรับคอนทราสต์ +adjustContrast.header=ปรับคอนทราสต์ +adjustContrast.contrast=คอนทราสต์: +adjustContrast.brightness=ความสว่าง: +adjustContrast.saturation=ความอิ่มตัว: +adjustContrast.download=ดาวน์โหลด + + +#crop +crop.title=ครอบตัด +crop.header=ครอบตัด PDF +crop.submit=ส่ง + + +#autoSplitPDF +autoSplitPDF.title=แยกหน้าอัตโนมัติ +autoSplitPDF.header=แยก PDF อัตโนมัติ +autoSplitPDF.description=พิมพ์ แทรก สแกน อัปโหลด และให้เราจัดการแยกเอกสารของคุณโดยอัตโนมัติ ไม่ต้องทำงานแยกแยะด้วยตนเอง +autoSplitPDF.selectText.1=พิมพ์แผ่นแยกด้านล่าง (ขาวดำก็ได้) +autoSplitPDF.selectText.2=สแกนเอกสารทั้งหมดพร้อมแทรกแผ่นแยกระหว่างเอกสาร +autoSplitPDF.selectText.3=อัปโหลดไฟล์ PDF ที่สแกนขนาดใหญ่เดียวและปล่อยให้ Stirling PDF จัดการส่วนที่เหลือ +autoSplitPDF.selectText.4=หน้ากั้นจะถูกตรวจจับและลบโดยอัตโนมัติ รับประกันเอกสารสุดท้ายที่เรียบร้อย +autoSplitPDF.formPrompt=ส่ง PDF ที่มีแผ่นแยก Stirling-PDF: +autoSplitPDF.duplexMode=โหมด Duplex (การสแกนหน้าและหลัง) +autoSplitPDF.dividerDownload1=ดาวน์โหลด 'Auto Splitter Divider (minimal).pdf' +autoSplitPDF.dividerDownload2=ดาวน์โหลด 'Auto Splitter Divider (with instructions).pdf' +autoSplitPDF.submit=ส่ง + + +#pipeline +pipeline.title=Pipeline + + +#pageLayout +pageLayout.title=เลย์เอาต์หลายหน้า +pageLayout.header=เลย์เอาต์หลายหน้า +pageLayout.pagesPerSheet=จำนวนหน้าต่อแผ่น: +pageLayout.addBorder=เพิ่มขอบ +pageLayout.submit=ส่ง + + +#scalePages +scalePages.title=ปรับสเกลหน้า +scalePages.header=ปรับสเกลหน้า +scalePages.pageSize=ขนาดหน้าของเอกสาร +scalePages.scaleFactor=ระดับการซูม (ครอบตัด) ของหน้า +scalePages.submit=ส่ง + + +#certSign +certSign.title=การเซ็นชื่อด้วยใบรับรอง +certSign.header=เซ็นชื่อ PDF ด้วยใบรับรองของคุณ (กำลังดำเนินการ) +certSign.selectPDF=เลือกไฟล์ PDF สำหรับการเซ็น: +certSign.jksNote=หมายเหตุ: หากประเภทใบรับรองของคุณไม่อยู่ในรายการด้านล่าง กรุณาแปลงเป็นไฟล์ Java Keystore (.jks) โดยใช้เครื่องมือ keytool จากบรรทัดคำสั่ง จากนั้นเลือกตัวเลือกไฟล์ .jks ด้านล่าง +certSign.selectKey=เลือกไฟล์คีย์ส่วนตัวของคุณ (รูปแบบ PKCS#8, อาจเป็น .pem หรือ .der): +certSign.selectCert=เลือกไฟล์ใบรับรองของคุณ (รูปแบบ X.509, อาจเป็น .pem หรือ .der): +certSign.selectP12=เลือกไฟล์ PKCS#12 Keystore ของคุณ (.p12 หรือ .pfx) (ไม่บังคับ หากมี ควรมีคีย์ส่วนตัวและใบรับรองของคุณ): +certSign.selectJKS=เลือกไฟล์ Java Keystore ของคุณ (.jks หรือ .keystore): +certSign.certType=ประเภทใบรับรอง +certSign.password=ใส่รหัสผ่าน Keystore หรือคีย์ส่วนตัวของคุณ (ถ้ามี): +certSign.showSig=แสดงลายเซ็น +certSign.reason=เหตุผล +certSign.location=ตำแหน่ง +certSign.name=ชื่อ +certSign.submit=เซ็นชื่อ PDF + + +#removeCertSign +removeCertSign.title=ลบลายเซ็นใบรับรอง +removeCertSign.header=ลบลายเซ็นดิจิทัลจาก PDF +removeCertSign.selectPDF=เลือกไฟล์ PDF: +removeCertSign.submit=ลบลายเซ็น + + +#removeBlanks +removeBlanks.title=ลบหน้าว่าง +removeBlanks.header=ลบหน้าว่าง +removeBlanks.threshold=เกณฑ์ความขาวของพิกเซล: +removeBlanks.thresholdDesc=เกณฑ์ในการกำหนดว่าพิกเซลขาวเพียงพอจะถูกจัดเป็น 'ขาว' เท่าใด 0 = ดำ, 255 = ขาวบริสุทธิ์ +removeBlanks.whitePercent=เปอร์เซ็นต์ความขาว (%): +removeBlanks.whitePercentDesc=เปอร์เซ็นต์ของหน้าที่ต้องเป็นพิกเซล 'ขาว' เพื่อจะถูกลบ +removeBlanks.submit=ลบหน้าว่าง + + +#removeAnnotations +removeAnnotations.title=ลบคำอธิบายประกอบ +removeAnnotations.header=ลบคำอธิบายประกอบ +removeAnnotations.submit=ลบ + + +#compare +compare.title=เปรียบเทียบ +compare.header=เปรียบเทียบ PDF +compare.highlightColor.1=สีเน้น 1: +compare.highlightColor.2=สีเน้น 2: +compare.document.1=เอกสาร 1 +compare.document.2=เอกสาร 2 +compare.submit=เปรียบเทียบ + +#BookToPDF +BookToPDF.title=หนังสือและการ์ตูนเป็น PDF +BookToPDF.header=หนังสือเป็น PDF +BookToPDF.credit=ใช้ Calibre +BookToPDF.submit=แปลง + +#PDFToBook +PDFToBook.title=PDF เป็นหนังสือ +PDFToBook.header=PDF เป็นหนังสือ +PDFToBook.selectText.1=รูปแบบ +PDFToBook.credit=ใช้ Calibre +PDFToBook.submit=แปลง + +#sign +sign.title=เซ็นชื่อ +sign.header=เซ็นชื่อ PDF +sign.upload=อัปโหลดรูปภาพ +sign.draw=วาดลายเซ็น +sign.text=ป้อนข้อความ +sign.clear=ล้าง +sign.add=เพิ่ม + + +#repair +repair.title=ซ่อมแซม +repair.header=ซ่อมแซม PDF +repair.submit=ซ่อมแซม + + +#flatten +flatten.title=แบน +flatten.header=แบน PDF +flatten.flattenOnlyForms=แบนเฉพาะฟอร์ม +flatten.submit=แบน + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=เกณฑ์มุม: +ScannerImageSplit.selectText.2=ตั้งค่ามุมขั้นต่ำที่จำเป็นสำหรับการหมุนภาพ (ค่าเริ่มต้น: 10) +ScannerImageSplit.selectText.3=ความอดทน: +ScannerImageSplit.selectText.4=กำหนดช่วงความแตกต่างของสีรอบสีพื้นหลังที่คาดคะเน (ค่าเริ่มต้น: 30) +ScannerImageSplit.selectText.5=พื้นที่ขั้นต่ำ: +ScannerImageSplit.selectText.6=ตั้งค่าเกณฑ์พื้นที่ขั้นต่ำสำหรับรูปภาพ (ค่าเริ่มต้น: 10000) +ScannerImageSplit.selectText.7=พื้นที่เค้าโครงขั้นต่ำ: +ScannerImageSplit.selectText.8=ตั้งค่าเกณฑ์พื้นที่เค้าโครงขั้นต่ำสำหรับรูปภาพ +ScannerImageSplit.selectText.9=ขนาดขอบ: +ScannerImageSplit.selectText.10=ตั้งค่าขนาดขอบที่เพิ่มและลบเพื่อป้องกันขอบขาวในผลลัพธ์ (ค่าเริ่มต้น: 1) + + +#OCR +ocr.title=OCR / ทำความสะอาดการสแกน +ocr.header=ทำความสะอาดการสแกน / OCR (การรู้จำอักขระด้วยแสง) +ocr.selectText.1=เลือกภาษาที่จะตรวจจับใน PDF (รายการที่แสดงคือภาษาที่ตรวจจับได้ในขณะนี้): +ocr.selectText.2=สร้างไฟล์ข้อความที่มีข้อความ OCR ควบคู่ไปกับ PDF ที่ OCR แล้ว +ocr.selectText.3=แก้ไขหน้าที่สแกนเอียงโดยการหมุนกลับไปยังตำแหน่งที่ถูกต้อง +ocr.selectText.4=ทำความสะอาดหน้าเพื่อลดโอกาสที่ OCR จะพบข้อความในเสียงพื้นหลัง (ไม่มีการเปลี่ยนแปลงในผลลัพธ์) +ocr.selectText.5=ทำความสะอาดหน้าเพื่อลดโอกาสที่ OCR จะพบข้อความในเสียงพื้นหลัง รักษาการทำความสะอาดในผลลัพธ์ +ocr.selectText.6=ไม่สนใจหน้าที่มีข้อความแบบโต้ตอบ OCR เฉพาะหน้าที่เป็นภาพ +ocr.selectText.7=บังคับ OCR จะ OCR ทุกหน้าลบองค์ประกอบข้อความต้นฉบับทั้งหมด +ocr.selectText.8=ปกติ (จะแสดงข้อผิดพลาดหาก PDF มีข้อความ) +ocr.selectText.9=การตั้งค่าเพิ่มเติม +ocr.selectText.10=โหมด OCR +ocr.selectText.11=ลบภาพหลังจาก OCR (ลบภาพทั้งหมด, มีประโยชน์เฉพาะหากเป็นส่วนหนึ่งของขั้นตอนการแปลง) +ocr.selectText.12=ประเภทการเรนเดอร์ (ขั้นสูง) +ocr.help=โปรดอ่านเอกสารนี้เพื่อใช้งานภาษาอื่นๆ และ/หรือใช้งานนอก docker +ocr.credit=บริการนี้ใช้ OCRmyPDF และ Tesseract สำหรับ OCR +ocr.submit=ประมวลผล PDF ด้วย OCR + + +#extractImages +extractImages.title=แยกรูปภาพ +extractImages.header=แยกรูปภาพ +extractImages.selectText=เลือกรูปแบบภาพที่จะใช้ในการแปลงรูปภาพที่แยกได้ +extractImages.submit=แยก + + +#File to PDF +fileToPDF.title=ไฟล์เป็น PDF +fileToPDF.header=แปลงไฟล์ใดๆ เป็น PDF +fileToPDF.credit=บริการนี้ใช้ LibreOffice และ Unoconv สำหรับการแปลงไฟล์ +fileToPDF.supportedFileTypesInfo=ประเภทไฟล์ที่รองรับ +fileToPDF.supportedFileTypes=ประเภทไฟล์ที่รองรับควรมีรายการด้านล่าง อย่างไรก็ตามสำหรับรายการรูปแบบที่รองรับทั้งหมด กรุณาดูเอกสาร LibreOffice +fileToPDF.submit=แปลงเป็น PDF + + +#compress +compress.title=บีบอัด +compress.header=บีบอัด PDF +compress.credit=บริการนี้ใช้ Ghostscript สำหรับการบีบอัด/การเพิ่มประสิทธิภาพ PDF +compress.selectText.1=โหมดแมนนวล - จาก 1 ถึง 4 +compress.selectText.2=ระดับการเพิ่มประสิทธิภาพ: +compress.selectText.3=4 (ไม่ดีสำหรับภาพข้อความ) +compress.selectText.4=โหมดอัตโนมัติ - ปรับคุณภาพอัตโนมัติเพื่อให้ PDF ตรงกับขนาดที่ต้องการ +compress.selectText.5=ขนาด PDF ที่คาดหวัง (เช่น 25MB, 10.8MB, 25KB) +compress.submit=บีบอัด + + +#Add image +addImage.title=เพิ่มรูปภาพ +addImage.header=เพิ่มรูปภาพใน PDF +addImage.everyPage=ทุกหน้า? +addImage.upload=เพิ่มรูปภาพ +addImage.submit=เพิ่มรูปภาพ + + +#merge +merge.title=รวม +merge.header=รวม PDF หลายไฟล์ (2 ขึ้นไป) +merge.sortByName=จัดเรียงตามชื่อ +merge.sortByDate=จัดเรียงตามวันที่ +merge.removeCertSign=ลบลายเซ็นดิจิทัลในไฟล์ที่รวม? +merge.submit=รวม + + +#pdfOrganiser +pdfOrganiser.title=ตัวจัดระเบียบหน้า +pdfOrganiser.header=ตัวจัดระเบียบหน้า PDF +pdfOrganiser.submit=จัดเรียงหน้าใหม่ +pdfOrganiser.mode=โหมด +pdfOrganiser.mode.1=เรียงลำดับหน้าตามความต้องการ +pdfOrganiser.mode.2=เรียงลำดับย้อนกลับ +pdfOrganiser.mode.3=เรียงลำดับแบบสองหน้า +pdfOrganiser.mode.4=เรียงลำดับแบบสมุด +pdfOrganiser.mode.5=เรียงลำดับแบบเย็บข้าง +pdfOrganiser.mode.6=แยกหน้าแบบคี่-คู่ +pdfOrganiser.mode.7=ลบหน้าหมายเลขแรก +pdfOrganiser.mode.8=ลบหน้าหมายเลขสุดท้าย +pdfOrganiser.mode.9=ลบหน้าหมายเลขแรกและสุดท้าย +pdfOrganiser.mode.10=รวมหน้าแบบคี่-คู่ +pdfOrganiser.placeholder=(เช่น 1,3,2 หรือ 4-8,2,10-12 หรือ 2n-1) + + +#multiTool +multiTool.title=เครื่องมือ PDF หลายตัว +multiTool.header=เครื่องมือ PDF หลายตัว +multiTool.uploadPrompts=ชื่อไฟล์ + +#view pdf +viewPdf.title=ดู PDF +viewPdf.header=ดู PDF + +#pageRemover +pageRemover.title=ตัวลบหน้า +pageRemover.header=ตัวลบหน้า PDF +pageRemover.pagesToDelete=หน้าที่จะลบ (ป้อนหมายเลขหน้าแยกด้วยเครื่องหมายจุลภาค): +pageRemover.submit=ลบหน้า +pageRemover.placeholder=(เช่น 1,2,6 หรือ 1-10,15-30) + + +#rotate +rotate.title=หมุน PDF +rotate.header=หมุน PDF +rotate.selectAngle=เลือกมุมการหมุน (เป็นหลายเท่าของ 90 องศา): +rotate.submit=หมุน + + +#split-pdfs +split.title=แยก PDF +split.header=แยก PDF +split.desc.1=หมายเลขที่คุณเลือกคือหมายเลขหน้าที่คุณต้องการแยก +split.desc.2=ดังนั้นการเลือก 1,3,7-9 จะทำให้เอกสาร 10 หน้าแยกออกเป็น PDF แยก 6 ชุด: +split.desc.3=เอกสาร #1: หน้า 1 +split.desc.4=เอกสาร #2: หน้า 2 และ 3 +split.desc.5=เอกสาร #3: หน้า 4, 5, 6, 7 +split.desc.6=เอกสาร #4: หน้า 8 +split.desc.7=เอกสาร #5: หน้า 9 +split.desc.8=เอกสาร #6: หน้า 10 +split.splitPages=ป้อนหน้าที่ต้องการแยก: +split.submit=แยก + + +#merge +imageToPDF.title=รูปภาพเป็น PDF +imageToPDF.header=รูปภาพเป็น PDF +imageToPDF.submit=แปลง +imageToPDF.selectLabel=ตัวเลือกการใส่ภาพ +imageToPDF.fillPage=เติมหน้า +imageToPDF.fitDocumentToImage=ปรับหน้าให้พอดีกับภาพ +imageToPDF.maintainAspectRatio=รักษาอัตราส่วนกว้างยาว +imageToPDF.selectText.2=หมุน PDF อัตโนมัติ +imageToPDF.selectText.3=ตรรกะหลายไฟล์ (เปิดใช้งานเฉพาะเมื่อทำงานกับหลายภาพ) +imageToPDF.selectText.4=รวมเป็น PDF เดียว +imageToPDF.selectText.5=แปลงเป็น PDF แยก + + +#pdfToImage +pdfToImage.title=PDF เป็นรูปภาพ +pdfToImage.header=PDF เป็นรูปภาพ +pdfToImage.selectText=รูปแบบภาพ +pdfToImage.singleOrMultiple=ประเภทผลลัพธ์รูปภาพ +pdfToImage.single=รูปภาพใหญ่เพียงภาพเดียว +pdfToImage.multi=หลายภาพ +pdfToImage.colorType=ประเภทสี +pdfToImage.color=สี +pdfToImage.grey=ระดับสีเทา +pdfToImage.blackwhite=ขาวดำ (อาจสูญเสียข้อมูล!) +pdfToImage.submit=แปลง + + +#addPassword +addPassword.title=เพิ่มรหัสผ่าน +addPassword.header=เพิ่มรหัสผ่าน (เข้ารหัส) +addPassword.selectText.1=เลือก PDF เพื่อเข้ารหัส +addPassword.selectText.2=รหัสผ่านผู้ใช้ +addPassword.selectText.3=ความยาวคีย์การเข้ารหัส +addPassword.selectText.4=ค่าสูงกว่ามีความแข็งแกร่งกว่า แต่ค่าต่ำกว่าเข้ากันได้ดีกว่า +addPassword.selectText.5=สิทธิ์ที่ตั้งค่า (แนะนำให้ใช้พร้อมรหัสผ่านผู้ดูแล) +addPassword.selectText.6=ป้องกันการประกอบเอกสาร +addPassword.selectText.7=ป้องกันการสกัดเนื้อหา +addPassword.selectText.8=ป้องกันการสกัดเพื่อการเข้าถึง +addPassword.selectText.9=ป้องกันการกรอกแบบฟอร์ม +addPassword.selectText.10=ป้องกันการแก้ไข +addPassword.selectText.11=ป้องกันการแก้ไขคำอธิบายประกอบ +addPassword.selectText.12=ป้องกันการพิมพ์ +addPassword.selectText.13=ป้องกันการพิมพ์รูปแบบต่างๆ +addPassword.selectText.14=รหัสผ่านผู้ดูแล +addPassword.selectText.15=จำกัดสิ่งที่สามารถทำได้กับเอกสารเมื่อเปิด (ไม่รองรับโดยผู้อ่านทั้งหมด) +addPassword.selectText.16=จำกัดการเปิดเอกสาร +addPassword.submit=เข้ารหัส + + +#watermark +watermark.title=เพิ่มลายน้ำ +watermark.header=เพิ่มลายน้ำ +watermark.selectText.1=เลือก PDF เพื่อเพิ่มลายน้ำ: +watermark.selectText.2=ข้อความลายน้ำ: +watermark.selectText.3=ขนาดฟอนต์: +watermark.selectText.4=การหมุน (0-360): +watermark.selectText.5=ตัวเว้นระยะความกว้าง (ช่องว่างระหว่างลายน้ำในแนวนอน): +watermark.selectText.6=ตัวเว้นระยะความสูง (ช่องว่างระหว่างลายน้ำในแนวตั้ง): +watermark.selectText.7=ความทึบ (0% - 100%): +watermark.selectText.8=ประเภทลายน้ำ: +watermark.selectText.9=ภาพลายน้ำ: +watermark.submit=เพิ่มลายน้ำ +watermark.type.1=ข้อความ +watermark.type.2=ภาพ + + +#Change permissions +permissions.title=เปลี่ยนสิทธิ์ +permissions.header=เปลี่ยนสิทธิ์ +permissions.warning=คำเตือน: การตั้งค่าสิทธิ์เหล่านี้เป็นการเปลี่ยนแปลงที่ไม่สามารถย้อนกลับได้ แนะนำให้ตั้งค่าพร้อมรหัสผ่านผ่านหน้าการเพิ่มรหัสผ่าน +permissions.selectText.1=เลือก PDF เพื่อเปลี่ยนสิทธิ์ +permissions.selectText.2=สิทธิ์ที่ตั้งค่า +permissions.selectText.3=ป้องกันการประกอบเอกสาร +permissions.selectText.4=ป้องกันการสกัดเนื้อหา +permissions.selectText.5=ป้องกันการสกัดเพื่อการเข้าถึง +permissions.selectText.6=ป้องกันการกรอกแบบฟอร์ม +permissions.selectText.7=ป้องกันการแก้ไข +permissions.selectText.8=ป้องกันการแก้ไขคำอธิบายประกอบ +permissions.selectText.9=ป้องกันการพิมพ์ +permissions.selectText.10=ป้องกันการพิมพ์รูปแบบต่างๆ +permissions.submit=เปลี่ยน + + +#remove password +removePassword.title=ลบรหัสผ่าน +removePassword.header=ลบรหัสผ่าน (ถอดรหัส) +removePassword.selectText.1=เลือก PDF ที่ต้องการถอดรหัส +removePassword.selectText.2=รหัสผ่าน +removePassword.submit=ลบ + + +#changeMetadata +changeMetadata.title=เปลี่ยนข้อมูลเมตา +changeMetadata.header=เปลี่ยนข้อมูลเมตา +changeMetadata.selectText.1=โปรดแก้ไขตัวแปรที่คุณต้องการเปลี่ยน +changeMetadata.selectText.2=ลบข้อมูลเมตาทั้งหมด +changeMetadata.selectText.3=แสดงข้อมูลเมตาที่กำหนดเอง: +changeMetadata.author=ผู้แต่ง: +changeMetadata.creationDate=วันที่สร้าง (yyyy/MM/dd HH:mm:ss): +changeMetadata.creator=ผู้สร้าง: +changeMetadata.keywords=คำสำคัญ: +changeMetadata.modDate=วันที่แก้ไข (yyyy/MM/dd HH:mm:ss): +changeMetadata.producer=ผู้ผลิต: +changeMetadata.subject=หัวข้อ: +changeMetadata.trapped=ติดกับ: +changeMetadata.selectText.4=ข้อมูลเมตาอื่น ๆ: +changeMetadata.selectText.5=เพิ่มรายการข้อมูลเมตาที่กำหนดเอง +changeMetadata.submit=เปลี่ยน + + +#pdfToPDFA +pdfToPDFA.title=PDF เป็น PDF/A +pdfToPDFA.header=PDF เป็น PDF/A +pdfToPDFA.credit=บริการนี้ใช้ OCRmyPDF สำหรับการแปลง PDF/A +pdfToPDFA.submit=แปลง +pdfToPDFA.tip=ปัจจุบันไม่ทำงานสำหรับการป้อนข้อมูลหลายรายการพร้อมกัน +pdfToPDFA.outputFormat=รูปแบบผลลัพธ์ +pdfToPDFA.pdfWithDigitalSignature=PDF มีลายเซ็นดิจิทัล ซึ่งจะถูกลบในขั้นตอนถัดไป + + +#PDFToWord +PDFToWord.title=PDF เป็น Word +PDFToWord.header=PDF เป็น Word +PDFToWord.selectText.1=รูปแบบไฟล์ผลลัพธ์ +PDFToWord.credit=บริการนี้ใช้ LibreOffice สำหรับการแปลงไฟล์ +PDFToWord.submit=แปลง + + +#PDFToPresentation +PDFToPresentation.title=PDF เป็น Presentation +PDFToPresentation.header=PDF เป็น Presentation +PDFToPresentation.selectText.1=รูปแบบไฟล์ผลลัพธ์ +PDFToPresentation.credit=บริการนี้ใช้ LibreOffice สำหรับการแปลงไฟล์ +PDFToPresentation.submit=แปลง + + +#PDFToText +PDFToText.title=PDF เป็น RTF (Text) +PDFToText.header=PDF เป็น RTF (Text) +PDFToText.selectText.1=รูปแบบไฟล์ผลลัพธ์ +PDFToText.credit=บริการนี้ใช้ LibreOffice สำหรับการแปลงไฟล์ +PDFToText.submit=แปลง + + +#PDFToHTML +PDFToHTML.title=PDF เป็น HTML +PDFToHTML.header=PDF เป็น HTML +PDFToHTML.credit=บริการนี้ใช้ pdftohtml สำหรับการแปลงไฟล์ +PDFToHTML.submit=แปลง + + +#PDFToXML +PDFToXML.title=PDF เป็น XML +PDFToXML.header=PDF เป็น XML +PDFToXML.credit=บริการนี้ใช้ LibreOffice สำหรับการแปลงไฟล์ +PDFToXML.submit=แปลง + +#PDFToCSV +PDFToCSV.title=PDF เป็น CSV +PDFToCSV.header=PDF เป็น CSV +PDFToCSV.prompt=เลือกหน้าที่ต้องการแยกตาราง +PDFToCSV.submit=แยก + +#split-by-size-or-count +split-by-size-or-count.title=แยก PDF ตามขนาดหรือจำนวน +split-by-size-or-count.header=แยก PDF ตามขนาดหรือจำนวน +split-by-size-or-count.type.label=เลือกประเภทการแยก +split-by-size-or-count.type.size=ตามขนาด +split-by-size-or-count.type.pageCount=ตามจำนวนหน้า +split-by-size-or-count.type.docCount=ตามจำนวนเอกสาร +split-by-size-or-count.value.label=ป้อนค่า +split-by-size-or-count.value.placeholder=ป้อนขนาด (เช่น 2MB หรือ 3KB) หรือจำนวน (เช่น 5) +split-by-size-or-count.submit=ส่ง + + +#overlay-pdfs +overlay-pdfs.header=ซ้อนทับไฟล์ PDF +overlay-pdfs.baseFile.label=เลือกไฟล์ PDF พื้นฐาน +overlay-pdfs.overlayFiles.label=เลือกไฟล์ PDF ซ้อนทับ +overlay-pdfs.mode.label=เลือกโหมดซ้อนทับ +overlay-pdfs.mode.sequential=ซ้อนทับตามลำดับ +overlay-pdfs.mode.interleaved=ซ้อนทับแบบสลับ +overlay-pdfs.mode.fixedRepeat=ซ้อนทับแบบวนซ้ำ +overlay-pdfs.counts.label=จำนวนการซ้อนทับ (สำหรับโหมดวนซ้ำ) +overlay-pdfs.counts.placeholder=ป้อนจำนวนแยกด้วยเครื่องหมายจุลภาค (เช่น 2,3,1) +overlay-pdfs.position.label=เลือกตำแหน่งซ้อนทับ +overlay-pdfs.position.foreground=พื้นหน้า +overlay-pdfs.position.background=พื้นหลัง +overlay-pdfs.submit=ส่ง + + +#split-by-sections +split-by-sections.title=แยก PDF ตามส่วน +split-by-sections.header=แยก PDF เป็นส่วน +split-by-sections.horizontal.label=การแบ่งแนวนอน +split-by-sections.vertical.label=การแบ่งแนวตั้ง +split-by-sections.horizontal.placeholder=ป้อนจำนวนการแบ่งแนวนอน +split-by-sections.vertical.placeholder=ป้อนจำนวนการแบ่งแนวตั้ง +split-by-sections.submit=แยก PDF +split-by-sections.merge=รวมเป็น PDF เดียว + + +#printFile +printFile.title=พิมพ์ไฟล์ +printFile.header=พิมพ์ไฟล์ไปยังเครื่องพิมพ์ +printFile.selectText.1=เลือกไฟล์ที่จะพิมพ์ +printFile.selectText.2=ป้อนชื่อเครื่องพิมพ์ +printFile.submit=พิมพ์ + + +#licenses +licenses.nav=ใบอนุญาต +licenses.title=ใบอนุญาตบุคคลที่สาม +licenses.header=ใบอนุญาตบุคคลที่สาม +licenses.module=โมดูล +licenses.version=เวอร์ชัน +licenses.license=ใบอนุญาต + +#survey +survey.nav=สำรวจ +survey.title=สำรวจ Stirling-PDF +survey.description=Stirling-PDF ไม่มีการติดตาม ดังนั้นเราต้องการฟังความคิดเห็นจากผู้ใช้เพื่อปรับปรุง Stirling-PDF! +survey.please=กรุณาพิจารณาการสำรวจของเรา! +survey.disabled=(ป๊อปอัปการสำรวจจะถูกปิดใช้งานในการอัปเดตต่อไปนี้ แต่สามารถใช้ได้ที่ส่วนท้ายของหน้า) +survey.button=เริ่มสำรวจ +survey.dontShowAgain=ไม่ต้องแสดงอีก + + +#error +error.sorry=ขออภัยในปัญหา! +error.needHelp=ต้องการความช่วยเหลือ / พบปัญหา? +error.contactTip=หากคุณยังมีปัญหา อย่าลังเลที่จะติดต่อเราเพื่อขอความช่วยเหลือ คุณสามารถส่งตั๋วบนหน้าของเราใน GitHub หรือ ติดต่อเราผ่าน Discord: +error.404.head=404 - ไม่พบหน้า | อุ๊ย! เราพลาดในโค้ด! +error.404.1=เราไม่สามารถหาหน้าที่คุณกำลังมองหา +error.404.2=บางสิ่งบางอย่างผิดพลาด +error.github=ส่งตั๋วใน GitHub +error.showStack=แสดง Stack Trace +error.copyStack=คัดลอก Stack Trace +error.githubSubmit=GitHub - ส่งตั๋ว +error.discordSubmit=Discord - ส่งโพสต์การสนับสนุน + diff --git a/src/main/resources/static/images/flags/th.svg b/src/main/resources/static/images/flags/th.svg new file mode 100644 index 00000000..7e67ea6b --- /dev/null +++ b/src/main/resources/static/images/flags/th.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html index 5028d656..def990df 100644 --- a/src/main/resources/templates/fragments/languages.html +++ b/src/main/resources/templates/fragments/languages.html @@ -31,4 +31,5 @@ icon Česky icon Hrvatski icon Norsk + icon ไทย -- 2.46.1 From 5751b1ac2dc8ba66df4ceb9ff44ecd96b5521764 Mon Sep 17 00:00:00 2001 From: Ludy Date: Fri, 12 Jul 2024 00:35:01 +0200 Subject: [PATCH 016/231] =?UTF-8?q?adds=20Thai=20to=20the=20languages=20?= =?UTF-8?q?=E2=80=8B=E2=80=8Btable=20(#1555)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR makes #1554 obsolete --- README.md | 5 +++-- scripts/ignore_translation.toml | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 15c9a24f..86e6128d 100644 --- a/README.md +++ b/README.md @@ -165,14 +165,14 @@ Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR ## Supported Languages -Stirling PDF currently supports 32! +Stirling PDF currently supports 33! | Language | Progress | | ------------------------------------------- | -------------------------------------- | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | Arabic (العربية) (ar_AR) | ![45%](https://geps.dev/progress/45) | -| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | +| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | | Spanish (Español) (es_ES) | ![92%](https://geps.dev/progress/92) | | Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) | @@ -201,6 +201,7 @@ Stirling PDF currently supports 32! | Czech (Česky) (cs_CZ) | ![90%](https://geps.dev/progress/90) | | Croatian (Hrvatski) (hr_HR) | ![95%](https://geps.dev/progress/95) | | Norwegian (Norsk) (no_NB) | ![96%](https://geps.dev/progress/96) | +| Thai (ไทย) (th_TH) | ![100%](https://geps.dev/progress/100) | ## Contributing (creating issues, translations, fixing bugs, etc.) diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index d55e820a..d230b3f4 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -212,6 +212,14 @@ ignore = [ 'language.direction', ] +[th_TH] +ignore = [ + 'language.direction', + 'pipeline.title', + 'pipelineOptions.pipelineHeader', + 'showJS.tags', +] + [tr_TR] ignore = [ 'language.direction', -- 2.46.1 From 929f0bbbe5aa431b0268795c48f471ecedfe36d3 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 20 Jul 2024 09:53:58 +0100 Subject: [PATCH 017/231] version bump, multi file fix and disable survey (#1550) * version bump, multi file fix and disable survey * example test stuff * logs * Update docker-compose-latest.yml --------- Co-authored-by: a --- build.gradle | 2 +- chart/stirling-pdf/Chart.yaml | 2 +- cucumber/exampleFiles/ghost1.pdf | 106 ++ cucumber/exampleFiles/ghost2.pdf | 106 ++ cucumber/exampleFiles/ghost3.pdf | 106 ++ cucumber/exampleFiles/images.pdf | 1255 +++++++++++++++++ cucumber/exampleFiles/pdfa1.pdf | 106 ++ cucumber/exampleFiles/pdfa2.pdf | 106 ++ cucumber/features/environment.py | 5 + cucumber/features/examples.feature | 2 +- cucumber/features/external.feature | 17 +- cucumber/features/general.feature | 20 + cucumber/features/steps/step_definitions.py | 112 +- exampleYmlFiles/docker-compose-latest.yml | 1 - .../api/misc/CompressController.java | 2 +- .../convert/pdf-to-presentation.html | 2 +- .../templates/convert/pdf-to-word.html | 2 +- src/main/resources/templates/home.html | 3 +- .../resources/templates/remove-pages.html | 2 +- .../templates/security/add-watermark.html | 4 +- test.sh | 3 + 21 files changed, 1922 insertions(+), 42 deletions(-) create mode 100644 cucumber/exampleFiles/ghost1.pdf create mode 100644 cucumber/exampleFiles/ghost2.pdf create mode 100644 cucumber/exampleFiles/ghost3.pdf create mode 100644 cucumber/exampleFiles/images.pdf create mode 100644 cucumber/exampleFiles/pdfa1.pdf create mode 100644 cucumber/exampleFiles/pdfa2.pdf diff --git a/build.gradle b/build.gradle index 90e130f6..e5460c19 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ ext { } group = "stirling.software" -version = "0.26.1" +version = "0.26.2" // 17 is lowest but we support and recommend 21 sourceCompatibility = "17" diff --git a/chart/stirling-pdf/Chart.yaml b/chart/stirling-pdf/Chart.yaml index ebe8dd48..9b633ddb 100644 --- a/chart/stirling-pdf/Chart.yaml +++ b/chart/stirling-pdf/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 0.26.1 +appVersion: 0.26.2 description: locally hosted web application that allows you to perform various operations on PDF files home: https://github.com/Stirling-Tools/Stirling-PDF diff --git a/cucumber/exampleFiles/ghost1.pdf b/cucumber/exampleFiles/ghost1.pdf new file mode 100644 index 00000000..4e497da0 --- /dev/null +++ b/cucumber/exampleFiles/ghost1.pdf @@ -0,0 +1,106 @@ +%PDF-1.3 +% ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +4 0 obj +<< +/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/PageMode /UseNone /Pages 8 0 R /Type /Catalog +>> +endobj +7 0 obj +<< +/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (unspecified) /Title (untitled) /Trapped /False +>> +endobj +8 0 obj +<< +/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages +>> +endobj +9 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 210 +>> +stream +Gap@Gb79+X'F"5[`EfJOD4:mD<%*=m+N>oDG,>NK`5P_s[usI/ph*0pV~>endstream +endobj +10 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 209 +>> +stream +Gap@Gb79+X'F"5Y`EfJOV2A9=!fB]F'tK1LS`,]G+MiTenb&V2-^hqa(5IE#Nr59/!"Qm*5_(BdF!0&h!Yhk/A+\iS'%6tuO$O)9LaZS+flr([1p2&#RS1p/gT[B;rDj-=&=iqUlj(P^/5U@eCFqn4:endstream +endobj +11 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 209 +>> +stream +Gap@GbmK%f(e+0_`ODoa2.):e/i+N3r(.o*Qf\gSNb(bt4FIubi@GIOE=p8Ir3;CbQ@KuG^cdJhODZKQ*upt+*rdZ%!mFmN$*.P)K;`s#]G=8AO3s3DGB.RCOn?[F]bEIg,a>25?B%dh\Z/C6opFE'el@I,P\u\V\]:*JYrrsNJ&d,11VL;$h!43eGu&1X6$+5-h\Vr6!+>4Je,~>endstream +endobj +xref +0 12 +0000000000 65535 f +0000000073 00000 n +0000000104 00000 n +0000000211 00000 n +0000000404 00000 n +0000000598 00000 n +0000000792 00000 n +0000000860 00000 n +0000001156 00000 n +0000001227 00000 n +0000001527 00000 n +0000001827 00000 n +trailer +<< +/ID +[<0d5cf047e754e05f8d574f067785875c><0d5cf047e754e05f8d574f067785875c>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 7 0 R +/Root 6 0 R +/Size 12 +>> +startxref +2127 +%%EOF diff --git a/cucumber/exampleFiles/ghost2.pdf b/cucumber/exampleFiles/ghost2.pdf new file mode 100644 index 00000000..6b2f529b --- /dev/null +++ b/cucumber/exampleFiles/ghost2.pdf @@ -0,0 +1,106 @@ +%PDF-1.3 +% ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +4 0 obj +<< +/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/PageMode /UseNone /Pages 8 0 R /Type /Catalog +>> +endobj +7 0 obj +<< +/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (unspecified) /Title (untitled) /Trapped /False +>> +endobj +8 0 obj +<< +/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages +>> +endobj +9 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 207 +>> +stream +Gap@G:CDb.*/b(UbS>%`/0S`k\\5'TNY0mmgH?`8]i_0~>endstream +endobj +10 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 207 +>> +stream +Gap@G]afWJ'Lm;=if<;s>V*7BTJ]oQ@P!(q5S+WG1%>L@?8Ue;c>[fY&&IOd5@t@TY@+q.5TA_`50SO&7M04=8M'Oendstream +endobj +11 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 209 +>> +stream +Gap@GYmu@>'Ld5[if35r/JNaJ.A.7fP9RpSN*8k^-sEER0,enq1Rsuo@R/uCO-^&Y`F'9d^a?9)?ns+F&dXm[HMgPn6Ep+%TRk5Nh+!(+[H#H:U^.^(YL,PKS'%j/:3O\hJVEK-UUekJTd[A$N^((K^#0Du`i@,/^f5KiUISGr")3/+f9NF8NO1+iUgm^b"X\cE^+[:s!0]Gu6i~>endstream +endobj +xref +0 12 +0000000000 65535 f +0000000073 00000 n +0000000104 00000 n +0000000211 00000 n +0000000404 00000 n +0000000598 00000 n +0000000792 00000 n +0000000860 00000 n +0000001156 00000 n +0000001227 00000 n +0000001524 00000 n +0000001822 00000 n +trailer +<< +/ID +[<407fc55425168745e56176202aad30c9><407fc55425168745e56176202aad30c9>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 7 0 R +/Root 6 0 R +/Size 12 +>> +startxref +2122 +%%EOF diff --git a/cucumber/exampleFiles/ghost3.pdf b/cucumber/exampleFiles/ghost3.pdf new file mode 100644 index 00000000..ea051661 --- /dev/null +++ b/cucumber/exampleFiles/ghost3.pdf @@ -0,0 +1,106 @@ +%PDF-1.3 +% ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +4 0 obj +<< +/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/PageMode /UseNone /Pages 8 0 R /Type /Catalog +>> +endobj +7 0 obj +<< +/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (unspecified) /Title (untitled) /Trapped /False +>> +endobj +8 0 obj +<< +/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages +>> +endobj +9 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 209 +>> +stream +Gap@G]+0EH(e/_@iZH]:>:>hu1e>07BJg5<'#:.C1n)e#(QJ6R1Rsuo_gpn.+0-H5$/#"iYR[B.9\'>7!aDAC*rf/t&6O#aHfeLAB\mpjZhp"`@J3;"Fm97#9+W,"eb95\+#p\^HN~>endstream +endobj +10 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 209 +>> +stream +Gap@G]+0EX'Eriuig+>QHNeD'#n%Sq#n%BW`C'uDUOYK)HdS4E9JMsp+HUmDj&H-t*4?UamXX0peVspk"i_@ba+&u"J>UYDKV_^G,7V==aTZZendstream +endobj +11 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 209 +>> +stream +Gap@G]+0EH(e/_@iZH]:>J`g!jPCLm;?AgU"fdk"PQZD\d?lRI_oWc[$tp^]O\:3fK8kWeX2&Jcg0+RoJ]j;2j*upu!b4.o&f)b$I@7CfIYjP^#\VjhC=QhQ]^lV-@<0Tam!0.+Dn@("AK%N,Uc7hb+6VoQ$q2q[7]BB92RoY/.j2N028i1jNf'@<1+Fqf$1&"8omHk`#DHP>OT~>endstream +endobj +xref +0 12 +0000000000 65535 f +0000000073 00000 n +0000000104 00000 n +0000000211 00000 n +0000000404 00000 n +0000000598 00000 n +0000000792 00000 n +0000000860 00000 n +0000001156 00000 n +0000001227 00000 n +0000001526 00000 n +0000001826 00000 n +trailer +<< +/ID +[<80da26147a484f2b7573da8151a93d2e><80da26147a484f2b7573da8151a93d2e>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 7 0 R +/Root 6 0 R +/Size 12 +>> +startxref +2126 +%%EOF diff --git a/cucumber/exampleFiles/images.pdf b/cucumber/exampleFiles/images.pdf new file mode 100644 index 00000000..a87bca41 --- /dev/null +++ b/cucumber/exampleFiles/images.pdf @@ -0,0 +1,1255 @@ +%PDF-1.3 +% +1 0 obj +<< +/Type /Pages +/Count 20 +/Kids [ 4 0 R 9 0 R 14 0 R 19 0 R 24 0 R 29 0 R 34 0 R 39 0 R 44 0 R 49 0 R 54 0 R 59 0 R 64 0 R 69 0 R 74 0 R 79 0 R 84 0 R 89 0 R 94 0 R 99 0 R ] +>> +endobj +2 0 obj +<< +/Producer (PyPDF2) +>> +endobj +3 0 obj +<< +/Type /Catalog +/Pages 1 0 R +>> +endobj +4 0 obj +<< +/Contents 5 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 6 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 8 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +5 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +6 0 obj +<< +/F1 7 0 R +>> +endobj +7 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +8 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +9 0 obj +<< +/Contents 10 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 11 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 13 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +10 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +11 0 obj +<< +/F1 12 0 R +>> +endobj +12 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +13 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +14 0 obj +<< +/Contents 15 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 16 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 18 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +15 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +16 0 obj +<< +/F1 17 0 R +>> +endobj +17 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +18 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +19 0 obj +<< +/Contents 20 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 21 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 23 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +20 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +21 0 obj +<< +/F1 22 0 R +>> +endobj +22 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +23 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +24 0 obj +<< +/Contents 25 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 26 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 28 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +25 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +26 0 obj +<< +/F1 27 0 R +>> +endobj +27 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +28 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +29 0 obj +<< +/Contents 30 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 31 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 33 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +30 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +31 0 obj +<< +/F1 32 0 R +>> +endobj +32 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +33 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +34 0 obj +<< +/Contents 35 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 36 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 38 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +35 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +36 0 obj +<< +/F1 37 0 R +>> +endobj +37 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +38 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +39 0 obj +<< +/Contents 40 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 41 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 43 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +40 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +41 0 obj +<< +/F1 42 0 R +>> +endobj +42 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +43 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +44 0 obj +<< +/Contents 45 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 46 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 48 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +45 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +46 0 obj +<< +/F1 47 0 R +>> +endobj +47 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +48 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +49 0 obj +<< +/Contents 50 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 51 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 53 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +50 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +51 0 obj +<< +/F1 52 0 R +>> +endobj +52 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +53 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +54 0 obj +<< +/Contents 55 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 56 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 58 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +55 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +56 0 obj +<< +/F1 57 0 R +>> +endobj +57 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +58 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +59 0 obj +<< +/Contents 60 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 61 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 63 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +60 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +61 0 obj +<< +/F1 62 0 R +>> +endobj +62 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +63 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +64 0 obj +<< +/Contents 65 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 66 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 68 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +65 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +66 0 obj +<< +/F1 67 0 R +>> +endobj +67 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +68 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +69 0 obj +<< +/Contents 70 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 71 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 73 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +70 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +71 0 obj +<< +/F1 72 0 R +>> +endobj +72 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +73 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +74 0 obj +<< +/Contents 75 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 76 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 78 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +75 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +76 0 obj +<< +/F1 77 0 R +>> +endobj +77 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +78 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +79 0 obj +<< +/Contents 80 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 81 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 83 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +80 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +81 0 obj +<< +/F1 82 0 R +>> +endobj +82 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +83 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +84 0 obj +<< +/Contents 85 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 86 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 88 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +85 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +86 0 obj +<< +/F1 87 0 R +>> +endobj +87 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +88 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +89 0 obj +<< +/Contents 90 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 91 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 93 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +90 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +91 0 obj +<< +/F1 92 0 R +>> +endobj +92 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +93 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +94 0 obj +<< +/Contents 95 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 96 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 98 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +95 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +96 0 obj +<< +/F1 97 0 R +>> +endobj +97 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +98 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +99 0 obj +<< +/Contents 100 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 101 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.c13e8595b419a997b6975c8b3bcc8e5f 103 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 1 0 R +>> +endobj +100 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 129 +>> +stream +Gap(;YmQ"8$jHBQ`VT^RCobf1lJs.2E&Bp?.Jj'sU)_r?a)E^0fhS3dW$_d.a9O\(!I;\Pkp#TOGPr!!]KaqF\^.ZsAaK.*-#-i@6oo1]MjDkn=k_neU!Q-!#?I!*g&~> +endstream +endobj +101 0 obj +<< +/F1 102 0 R +>> +endobj +102 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +103 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 300 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 101 +>> +stream +Gb"0;0`_7S!5bE%:MgL^TE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!(qq*p`k-~> +endstream +endobj +xref +0 104 +0000000000 65535 f +0000000015 00000 n +0000000207 00000 n +0000000247 00000 n +0000000296 00000 n +0000000548 00000 n +0000000768 00000 n +0000000799 00000 n +0000000906 00000 n +0000001195 00000 n +0000001450 00000 n +0000001671 00000 n +0000001704 00000 n +0000001812 00000 n +0000002102 00000 n +0000002358 00000 n +0000002579 00000 n +0000002612 00000 n +0000002720 00000 n +0000003010 00000 n +0000003266 00000 n +0000003487 00000 n +0000003520 00000 n +0000003628 00000 n +0000003918 00000 n +0000004174 00000 n +0000004395 00000 n +0000004428 00000 n +0000004536 00000 n +0000004826 00000 n +0000005082 00000 n +0000005303 00000 n +0000005336 00000 n +0000005444 00000 n +0000005734 00000 n +0000005990 00000 n +0000006211 00000 n +0000006244 00000 n +0000006352 00000 n +0000006642 00000 n +0000006898 00000 n +0000007119 00000 n +0000007152 00000 n +0000007260 00000 n +0000007550 00000 n +0000007806 00000 n +0000008027 00000 n +0000008060 00000 n +0000008168 00000 n +0000008458 00000 n +0000008714 00000 n +0000008935 00000 n +0000008968 00000 n +0000009076 00000 n +0000009366 00000 n +0000009622 00000 n +0000009843 00000 n +0000009876 00000 n +0000009984 00000 n +0000010274 00000 n +0000010530 00000 n +0000010751 00000 n +0000010784 00000 n +0000010892 00000 n +0000011182 00000 n +0000011438 00000 n +0000011659 00000 n +0000011692 00000 n +0000011800 00000 n +0000012090 00000 n +0000012346 00000 n +0000012567 00000 n +0000012600 00000 n +0000012708 00000 n +0000012998 00000 n +0000013254 00000 n +0000013475 00000 n +0000013508 00000 n +0000013616 00000 n +0000013906 00000 n +0000014162 00000 n +0000014383 00000 n +0000014416 00000 n +0000014524 00000 n +0000014814 00000 n +0000015070 00000 n +0000015291 00000 n +0000015324 00000 n +0000015432 00000 n +0000015722 00000 n +0000015978 00000 n +0000016199 00000 n +0000016232 00000 n +0000016340 00000 n +0000016630 00000 n +0000016886 00000 n +0000017107 00000 n +0000017140 00000 n +0000017248 00000 n +0000017538 00000 n +0000017797 00000 n +0000018019 00000 n +0000018054 00000 n +0000018163 00000 n +trailer +<< +/Size 104 +/Root 3 0 R +/Info 2 0 R +>> +startxref +18454 +%%EOF diff --git a/cucumber/exampleFiles/pdfa1.pdf b/cucumber/exampleFiles/pdfa1.pdf new file mode 100644 index 00000000..2873c0d4 --- /dev/null +++ b/cucumber/exampleFiles/pdfa1.pdf @@ -0,0 +1,106 @@ +%PDF-1.3 +% ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +4 0 obj +<< +/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/PageMode /UseNone /Pages 8 0 R /Type /Catalog +>> +endobj +7 0 obj +<< +/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (unspecified) /Title (untitled) /Trapped /False +>> +endobj +8 0 obj +<< +/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages +>> +endobj +9 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 206 +>> +stream +Gap@G\IO3f&4Lr[@S4&T2aReWZ3N'9",Ncra>5AuK^J(o@r?=EP>b]h[L@XZ8q7#[c:#H2:^/=b,p3^,&f-Q.'H%!U?%N\iVa1pLMlh/41\A8@dF5@0al:-1?L;D%LpL3g\9`.3c6N/Mp=sE/nO%^@%Cc3`]e`qqS@[pkUWemMZCendstream +endobj +10 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 209 +>> +stream +Gap@G\IO3V'LdA_ig"8P1PS=kA5Q_GQ\P]*S3\>Q`jHYt?8UdkV`6]UV*On)+1VMV+A@.iF:*6sWfM9f"s.NmVuMto!p7-+,Rb<.h,pdi-&OQ5KO\RRFj.j"A)ScTQ7$hudF^TnZ'XuQA5"O]rYkt><-DJmj'"Ri>n!4`^m409XX`e)AR'*rGsn6m79.18+^ba=qRuss"-A3k+9~>endstream +endobj +11 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 210 +>> +stream +Gap@G]+0EH(e/_@iZH]:.1fBHK`Xl'[i1&AjX(\k8hbgo(QJ6R1Rsuo6_I1A5Gg$JL;D#$J2CX;+Cf*cUHk2%H1XmpWe+qZ5moJ#B]>b%%[d,mfSSkS4A:Q4NlOFfrL7eA,s45"eUSakM;927AA,1"-LZ)&nZ/ah=8_X7:?ZMj@J@;r7d`t]Z0\d39M%:$k8[S5D"2oSap4s80l?~>endstream +endobj +xref +0 12 +0000000000 65535 f +0000000073 00000 n +0000000104 00000 n +0000000211 00000 n +0000000404 00000 n +0000000598 00000 n +0000000792 00000 n +0000000860 00000 n +0000001156 00000 n +0000001227 00000 n +0000001523 00000 n +0000001823 00000 n +trailer +<< +/ID +[<88edee24ee67bd7d6b7cf53cfa2222b0><88edee24ee67bd7d6b7cf53cfa2222b0>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 7 0 R +/Root 6 0 R +/Size 12 +>> +startxref +2124 +%%EOF diff --git a/cucumber/exampleFiles/pdfa2.pdf b/cucumber/exampleFiles/pdfa2.pdf new file mode 100644 index 00000000..b0622aec --- /dev/null +++ b/cucumber/exampleFiles/pdfa2.pdf @@ -0,0 +1,106 @@ +%PDF-1.3 +% ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +4 0 obj +<< +/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/PageMode /UseNone /Pages 8 0 R /Type /Catalog +>> +endobj +7 0 obj +<< +/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (unspecified) /Title (untitled) /Trapped /False +>> +endobj +8 0 obj +<< +/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages +>> +endobj +9 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 209 +>> +stream +Gap@GYmu@>'Ld5[if35rI0]sG)F[U^"c>T)"\\os-r:1V0,enq1Rsuo,*67.@k7U.LRF-P.e"CM2V!>iYi=B8H6e;F1WmG#,(eS00(Qe9&:O@nI879DTsT,njXAB?`8:>,Hn3*RV!qh4;&@6%]<9Y*>QZ].Z5o;RAZXg7d[#+bphHs_Ep!QR2TZ2~>endstream +endobj +10 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 210 +>> +stream +Gap@G]+0EH(e/_@iZH]:>=,iY1bE)XN?M;1'J/>i&HY;gks]*rj:!DKpb8@`prC#N+9E#o#-%usEeEk=sRendstream +endobj +11 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 209 +>> +stream +Gap@G_$YcZ'LhbF`EQB$nqi=8S<;#HbK3&f>rnodRPo`Vf4P[3cJidY(I=[K5NWCT'endstream +endobj +xref +0 12 +0000000000 65535 f +0000000073 00000 n +0000000104 00000 n +0000000211 00000 n +0000000404 00000 n +0000000598 00000 n +0000000792 00000 n +0000000860 00000 n +0000001156 00000 n +0000001227 00000 n +0000001526 00000 n +0000001827 00000 n +trailer +<< +/ID +[<4fcc82a085fe71e34a32d1b23c8b939f><4fcc82a085fe71e34a32d1b23c8b939f>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 7 0 R +/Root 6 0 R +/Size 12 +>> +startxref +2127 +%%EOF diff --git a/cucumber/features/environment.py b/cucumber/features/environment.py index ec7f2c9f..ca56b21f 100644 --- a/cucumber/features/environment.py +++ b/cucumber/features/environment.py @@ -14,3 +14,8 @@ def after_scenario(context, scenario): os.remove('response_file') if hasattr(context, 'file_name') and os.path.exists(context.file_name): os.remove(context.file_name) + + # Remove any temporary files + for temp_file in os.listdir('.'): + if temp_file.startswith('genericNonCustomisableName') or temp_file.startswith('temp_image_'): + os.remove(temp_file) \ No newline at end of file diff --git a/cucumber/features/examples.feature b/cucumber/features/examples.feature index 04e4081f..c6477466 100644 --- a/cucumber/features/examples.feature +++ b/cucumber/features/examples.feature @@ -1,4 +1,4 @@ -@example +@example @general Feature: API Validation @positive @password diff --git a/cucumber/features/external.feature b/cucumber/features/external.feature index 1d503135..c1330f52 100644 --- a/cucumber/features/external.feature +++ b/cucumber/features/external.feature @@ -32,7 +32,7 @@ Feature: API Validation @ocr @positive Scenario: Extract Image Scans Given I generate a PDF file as "fileInput" - And the pdf contains 3 images on 2 pages + And the pdf contains 3 images of size 300x300 on 2 pages And the request data includes | parameter | value | | angleThreshold | 5 | @@ -125,8 +125,7 @@ Feature: API Validation @ocr Scenario: PDFA - Given I generate a PDF file as "fileInput" - And the pdf contains 3 pages with random text + Given I use an example file at "exampleFiles/pdfa2.pdf" as parameter "fileInput" And the request data includes | parameter | value | | outputFormat | pdfa | @@ -137,8 +136,7 @@ Feature: API Validation @ocr Scenario: PDFA1 - Given I generate a PDF file as "fileInput" - And the pdf contains 3 pages with random text + Given I use an example file at "exampleFiles/pdfa1.pdf" as parameter "fileInput" And the request data includes | parameter | value | | outputFormat | pdfa-1 | @@ -149,8 +147,7 @@ Feature: API Validation @compress @ghostscript @positive Scenario: Compress - Given I generate a PDF file as "fileInput" - And the pdf contains 3 pages with random text + Given I use an example file at "exampleFiles/ghost3.pdf" as parameter "fileInput" And the request data includes | parameter | value | | optimizeLevel | 4 | @@ -161,8 +158,7 @@ Feature: API Validation @compress @ghostscript @positive Scenario: Compress - Given I generate a PDF file as "fileInput" - And the pdf contains 3 pages with random text + Given I use an example file at "exampleFiles/ghost2.pdf" as parameter "fileInput" And the request data includes | parameter | value | | optimizeLevel | 1 | @@ -175,8 +171,7 @@ Feature: API Validation @compress @ghostscript @positive Scenario: Compress - Given I generate a PDF file as "fileInput" - And the pdf contains 3 pages with random text + Given I use an example file at "exampleFiles/ghost1.pdf" as parameter "fileInput" And the request data includes | parameter | value | | optimizeLevel | 1 | diff --git a/cucumber/features/general.feature b/cucumber/features/general.feature index 229d37b5..345f59cb 100644 --- a/cucumber/features/general.feature +++ b/cucumber/features/general.feature @@ -94,3 +94,23 @@ Feature: API Validation | 1 | 10 | 2 | 10 | + @extract-images + Scenario Outline: Extract Image Scans + Given I use an example file at "exampleFiles/images.pdf" as parameter "fileInput" + And the request data includes + | parameter | value | + | format | | + When I send the API request to the endpoint "/api/v1/misc/extract-images" + Then the response content type should be "application/octet-stream" + And the response file should have extension ".zip" + And the response ZIP should contain 20 files + And the response file should have size greater than 0 + And the response status code should be 200 + + Examples: + | format | + | png | + | gif | + | jpeg | + + diff --git a/cucumber/features/steps/step_definitions.py b/cucumber/features/steps/step_definitions.py index 60479b6e..65a49fda 100644 --- a/cucumber/features/steps/step_definitions.py +++ b/cucumber/features/steps/step_definitions.py @@ -6,11 +6,14 @@ import io import random import string from reportlab.lib.pagesizes import letter +from reportlab.lib.utils import ImageReader from reportlab.pdfgen import canvas import mimetypes import requests import zipfile import shutil +import re +from PIL import Image, ImageDraw ######### # GIVEN # @@ -43,8 +46,6 @@ def step_use_example_file(context, filePath, fileInput): except FileNotFoundError: raise FileNotFoundError(f"The example file '{filePath}' does not exist.") - - @given('the pdf contains {page_count:d} pages') def step_pdf_contains_pages(context, page_count): writer = PdfWriter() @@ -66,8 +67,6 @@ def step_pdf_contains_blank_pages(context, page_count): context.files[context.param_name].close() context.files[context.param_name] = open(context.file_name, 'rb') - - def create_black_box_image(file_name, size): can = canvas.Canvas(file_name, pagesize=size) width, height = size @@ -76,36 +75,75 @@ def create_black_box_image(file_name, size): can.showPage() can.save() -def create_pdf_with_black_boxes(file_name, image_count, page_count): - page_width, page_height = letter - box_size = 72 # 1 inch by 1 inch black box +@given(u'the pdf contains {image_count:d} images of size {width:d}x{height:d} on {page_count:d} pages') +def step_impl(context, image_count, width, height, page_count): + context.param_name = "fileInput" + context.file_name = "genericNonCustomisableName.pdf" + create_pdf_with_images_and_boxes(context.file_name, image_count, page_count, width, height) + if not hasattr(context, 'files'): + context.files = {} + context.files[context.param_name] = open(context.file_name, 'rb') + +def add_black_boxes_to_image(image): + if isinstance(image, str): + image = Image.open(image) + + draw = ImageDraw.Draw(image) + draw.rectangle([(0, 0), image.size], fill=(0, 0, 0)) # Fill image with black + return image + +def create_pdf_with_images_and_boxes(file_name, image_count, page_count, image_width, image_height): + page_width, page_height = max(letter[0], image_width), max(letter[1], image_height) boxes_per_page = image_count // page_count + (1 if image_count % page_count != 0 else 0) - + writer = PdfWriter() box_counter = 0 - + for page in range(page_count): packet = io.BytesIO() - can = canvas.Canvas(packet, pagesize=letter) - + can = canvas.Canvas(packet, pagesize=(page_width, page_height)) + for i in range(boxes_per_page): if box_counter >= image_count: break - x = (i % (page_width // box_size)) * box_size - y = page_height - ((i // (page_width // box_size) + 1) * box_size) - can.setFillColorRGB(0, 0, 0) - can.rect(x, y, box_size, box_size, fill=1) + + # Simulating a dynamic image creation (replace this with your actual image creation logic) + # For demonstration, we'll create a simple black image + dummy_image = Image.new('RGB', (image_width, image_height), color='white') # Create a white image + dummy_image = add_black_boxes_to_image(dummy_image) # Add black boxes + + # Convert the PIL Image to bytes to pass to drawImage + image_bytes = io.BytesIO() + dummy_image.save(image_bytes, format='PNG') + image_bytes.seek(0) + + # Check if the image fits in the current page dimensions + x = (i % (page_width // image_width)) * image_width + y = page_height - (((i % (page_height // image_height)) + 1) * image_height) + + if x + image_width > page_width or y < 0: + break + + # Add the image to the PDF + can.drawImage(ImageReader(image_bytes), x, y, width=image_width, height=image_height) box_counter += 1 - + can.showPage() can.save() packet.seek(0) new_pdf = PdfReader(packet) writer.add_page(new_pdf.pages[0]) - + + # Write the PDF to file with open(file_name, 'wb') as f: writer.write(f) + # Clean up temporary image files + for i in range(image_count): + temp_image_path = f"temp_image_{i}.png" + if os.path.exists(temp_image_path): + os.remove(temp_image_path) + @given('the pdf contains {image_count:d} images on {page_count:d} pages') def step_pdf_contains_images(context, image_count, page_count): if not hasattr(context, 'param_name'): @@ -118,7 +156,6 @@ def step_pdf_contains_images(context, image_count, page_count): context.files[context.param_name].close() context.files[context.param_name] = open(context.file_name, 'rb') - @given('the pdf contains {page_count:d} pages with random text') def step_pdf_contains_pages_with_random_text(context, page_count): buffer = io.BytesIO() @@ -186,6 +223,21 @@ def save_generated_pdf(context, filename): # WHEN # ######## +@when('I send a GET request to "{endpoint}"') +def step_send_get_request(context, endpoint): + base_url = "http://localhost:8080" + full_url = f"{base_url}{endpoint}" + response = requests.get(full_url) + context.response = response + +@when('I send a GET request to "{endpoint}" with parameters') +def step_send_get_request_with_params(context, endpoint): + base_url = "http://localhost:8080" + params = {row['parameter']: row['value'] for row in context.table} + full_url = f"{base_url}{endpoint}" + response = requests.get(full_url, params=params) + context.response = response + @when('I send the API request to the endpoint "{endpoint}"') def step_send_api_request(context, endpoint): url = f"http://localhost:8080{endpoint}" @@ -278,7 +330,6 @@ def step_save_response_file(context, filename): f.write(context.response.content) print(f"Saved response content to {filename}") - @then('the response PDF should contain {page_count:d} pages') def step_check_response_pdf_page_count(context, page_count): response_file = io.BytesIO(context.response.content) @@ -305,3 +356,26 @@ def step_check_response_zip_doc_page_count(context, doc_count, pages_per_doc): reader = PdfReader(pdf_file) actual_pages_per_doc = len(reader.pages) assert actual_pages_per_doc == pages_per_doc, f"Expected {pages_per_doc} pages per document but got {actual_pages_per_doc} pages in document {file_name}" + +@then('the JSON value of "{key}" should be "{expected_value}"') +def step_check_json_value(context, key, expected_value): + actual_value = context.response.json().get(key) + assert actual_value == expected_value, \ + f"Expected JSON value for '{key}' to be '{expected_value}' but got '{actual_value}'" + +@then('JSON list entry containing "{identifier_key}" as "{identifier_value}" should have "{target_key}" as "{target_value}"') +def step_check_json_list_entry(context, identifier_key, identifier_self, target_key, target_value): + json_response = context.response.json() + for entry in json_response: + if entry.get(identifier_key) == identifier_value: + assert entry.get(target_key) == target_value, \ + f"Expected {target_key} to be {target_value} in entry where {identifier_key} is {identifier_value}, but found {entry.get(target_key)}" + break + else: + raise AssertionError(f"No entry with {identifier_key} as {identifier_value} found") + +@then('the response should match the regex "{pattern}"') +def step_response_matches_regex(context, pattern): + response_text = context.response.text + assert re.match(pattern, response_text), \ + f"Response '{response_text}' does not match the expected pattern '{pattern}'" diff --git a/exampleYmlFiles/docker-compose-latest.yml b/exampleYmlFiles/docker-compose-latest.yml index 794eb1be..6090e291 100644 --- a/exampleYmlFiles/docker-compose-latest.yml +++ b/exampleYmlFiles/docker-compose-latest.yml @@ -22,7 +22,6 @@ services: DOCKER_ENABLE_SECURITY: "false" SECURITY_ENABLELOGIN: "false" LANGS: "en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID" - INSTALL_BOOK_AND_ADVANCED_HTML_OPS: "true" SYSTEM_DEFAULTLOCALE: en-US UI_APPNAME: Stirling-PDF UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java index 12dd625c..2240dbed 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java @@ -99,7 +99,7 @@ public class CompressController { List command = new ArrayList<>(); command.add("gs"); command.add("-sDEVICE=pdfwrite"); - command.add("-dCompatibilityLevel=1.4"); + command.add("-dCompatibilityLevel=1.5"); switch (optimizeLevel) { case 1: diff --git a/src/main/resources/templates/convert/pdf-to-presentation.html b/src/main/resources/templates/convert/pdf-to-presentation.html index 79431760..ce1f455d 100644 --- a/src/main/resources/templates/convert/pdf-to-presentation.html +++ b/src/main/resources/templates/convert/pdf-to-presentation.html @@ -22,8 +22,8 @@
diff --git a/src/main/resources/templates/convert/pdf-to-word.html b/src/main/resources/templates/convert/pdf-to-word.html index 7e5f96c0..0fd004f2 100644 --- a/src/main/resources/templates/convert/pdf-to-word.html +++ b/src/main/resources/templates/convert/pdf-to-word.html @@ -22,8 +22,8 @@
diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index ffb25a37..d2846a24 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -264,6 +264,7 @@ diff --git a/src/main/resources/templates/remove-pages.html b/src/main/resources/templates/remove-pages.html index 58dc18c7..84471ef2 100644 --- a/src/main/resources/templates/remove-pages.html +++ b/src/main/resources/templates/remove-pages.html @@ -21,7 +21,7 @@
- +
diff --git a/src/main/resources/templates/security/add-watermark.html b/src/main/resources/templates/security/add-watermark.html index 12e706e4..71c32374 100644 --- a/src/main/resources/templates/security/add-watermark.html +++ b/src/main/resources/templates/security/add-watermark.html @@ -20,9 +20,7 @@
-
- -
+
diff --git a/test.sh b/test.sh index 54c3c883..54d95ec9 100644 --- a/test.sh +++ b/test.sh @@ -88,6 +88,9 @@ main() { passed_tests+=("Stirling-PDF-Regression") else failed_tests+=("Stirling-PDF-Regression") + echo "Printing docker logs of failed regression" + docker logs "Stirling-PDF" + echo "Printed docker logs of failed regression" fi cd .. fi -- 2.46.1 From 11e279bd12ca20fc37c3bdd0dc9795efbb735bdd Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 20 Jul 2024 09:54:46 +0100 Subject: [PATCH 018/231] Remove calibre for now --- Dockerfile-fat | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile-fat b/Dockerfile-fat index 12585201..53f1c1fc 100644 --- a/Dockerfile-fat +++ b/Dockerfile-fat @@ -31,7 +31,7 @@ ENV DOCKER_ENABLE_SECURITY=false \ PGID=1000 \ UMASK=022 \ FAT_DOCKER=true \ - INSTALL_BOOK_AND_ADVANCED_HTML_OPS=true + INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false # JDK for app @@ -45,7 +45,6 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et tini \ bash \ curl \ - calibre@testing \ shadow \ su-exec \ openssl \ -- 2.46.1 From ecfdfa56444c0721396df3d7c44b3cce003800d0 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 20 Jul 2024 09:56:39 +0100 Subject: [PATCH 019/231] Update init-without-ocr.sh --- scripts/init-without-ocr.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/init-without-ocr.sh b/scripts/init-without-ocr.sh index 99054031..49218f76 100644 --- a/scripts/init-without-ocr.sh +++ b/scripts/init-without-ocr.sh @@ -12,7 +12,8 @@ fi umask "$UMASK" || true if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" && "$FAT_DOCKER" != "true" ]]; then - apk add --no-cache calibre@testing + echo "issue with calibre in current version, feature currently disabled on Stirling-PDF" + #apk add --no-cache calibre@testing fi if [[ "$FAT_DOCKER" != "true" ]]; then -- 2.46.1 From 6c7dc34640fdaa8b2fd586a867f76ed1e1b6e245 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 20 Jul 2024 10:57:27 +0200 Subject: [PATCH 020/231] Add: Label manager (#1560) --- .github/labels.yml | 91 ++++++++++++++++++++++++++++++ .github/workflows/manage-label.yml | 24 ++++++++ 2 files changed, 115 insertions(+) create mode 100644 .github/labels.yml create mode 100644 .github/workflows/manage-label.yml diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 00000000..c7f23973 --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,91 @@ +# Labels names are important as they are used by Release Drafter to decide +# regarding where to record them in changelog or if to skip them. +# +# The repository labels will be automatically configured using this file and +# the GitHub Action https://github.com/marketplace/actions/github-labeler. +- name: "Back End" + color: "20CE6C" + description: "Issues related to back-end development" + from_name: "Back end" +- name: "Bug" + description: "Something isn't working" + color: "EB9CA6" + from_name: "bug" +- name: "dependencies" + description: "Pull requests that update a dependency file" + color: "5AA8FC" +- name: "Docker" + description: "Pull requests that update Docker code" + color: "1FCEFF" + from_name: "docker" +- name: "Documentation" + description: "Improvements or additions to documentation" + color: "35ABFF" + from_name: "documentation" +- name: "Done for next release" + color: "0CDBD1" +- name: "Done" + color: "60F13B" +- name: "duplicate" + description: "This issue or pull request already exists" + color: "CDD1D5" +- name: "enhancement" + description: "New feature or request" + color: "A0EEEE" +- name: "fix needs confirmation" + color: "60A1E7" + description: "Fix needs to be confirmed" +- name: "Front End" + color: "BBD2F1" + description: "Issues related to front-end development" +- name: "github-actions" + description: "Pull requests that update GitHub Actions code" + color: "999999" + from_name: "github_actions" +- name: "good first issue" + description: "Good for newcomers" + color: "C1B8FF" +- name: "help wanted" + description: "Extra attention is needed" + color: "00E6C4" +- name: "invalid" + description: "This doesn't seem right" + color: "E5E566" +- name: "Java" + description: "Pull requests that update Java code" + color: "FF9E1F" + from_name: "java" +- name: "Long-term Enhancement" + color: "BFDEC3" + description: "Enhancements planned for the long term" +- name: "more-info-needed" + color: "00E4F8" + description: "More information is needed" +- name: "needs investigation" + color: "B8C3A7" + description: "Issues that require further investigation" +- name: "Prioritised enhancement" + color: "4BA2EE" + description: "High-priority enhancements" +- name: "question" + description: "Further information is requested" + color: "D97EE5" +- name: "Translation" + color: "9FABF9" + from_name: "translation" +- name: "upstream" + color: "DEDEDE" +- name: "v2" + color: "FFFF00" +- name: "wontfix" + description: "This will not be worked on" + color: "FFFFFF" +- name: "Security" + color: "000000" + description: "Security-related issues or pull requests" +- name: "API" + color: "FFFF00" + description: "API-related issues or pull requests" +- name: "Test" + color: "FF9E1F" + description: "Testing-related issues or pull requests" \ No newline at end of file diff --git a/.github/workflows/manage-label.yml b/.github/workflows/manage-label.yml new file mode 100644 index 00000000..b1a239cf --- /dev/null +++ b/.github/workflows/manage-label.yml @@ -0,0 +1,24 @@ +name: Manage labels + +on: + schedule: + - cron: "30 20 * * *" + +permissions: + contents: read + issues: write + +jobs: + labeler: + name: Labeler + runs-on: ubuntu-latest + steps: + - name: Check out the repository + uses: actions/checkout@v4 + + - name: Run Labeler + uses: crazy-max/ghaction-github-labeler@v5 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + yaml-file: .github/labels.yml + skip-delete: true \ No newline at end of file -- 2.46.1 From 85ed0c38d18911502b2b6ffcff76bb33733a51aa Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 20 Jul 2024 11:13:49 +0200 Subject: [PATCH 021/231] Adding declaration as repository component & changing primary key type (#1559) * Adding declaration as repository component & changing primary key type * Update AuthorityRepository.java * Update PersistentLoginRepository.java --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- .../software/SPDF/repository/AuthorityRepository.java | 2 ++ .../software/SPDF/repository/PersistentLoginRepository.java | 2 ++ .../stirling/software/SPDF/repository/UserRepository.java | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/stirling/software/SPDF/repository/AuthorityRepository.java b/src/main/java/stirling/software/SPDF/repository/AuthorityRepository.java index 41c251e1..01f23dd9 100644 --- a/src/main/java/stirling/software/SPDF/repository/AuthorityRepository.java +++ b/src/main/java/stirling/software/SPDF/repository/AuthorityRepository.java @@ -3,9 +3,11 @@ package stirling.software.SPDF.repository; import java.util.Set; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import stirling.software.SPDF.model.Authority; +@Repository public interface AuthorityRepository extends JpaRepository { // Set findByUsername(String username); Set findByUser_Username(String username); diff --git a/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java b/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java index 31841a57..92d7bb81 100644 --- a/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java +++ b/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java @@ -1,7 +1,9 @@ package stirling.software.SPDF.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import stirling.software.SPDF.model.PersistentLogin; +@Repository public interface PersistentLoginRepository extends JpaRepository {} diff --git a/src/main/java/stirling/software/SPDF/repository/UserRepository.java b/src/main/java/stirling/software/SPDF/repository/UserRepository.java index ad65f27d..cf0c80d1 100644 --- a/src/main/java/stirling/software/SPDF/repository/UserRepository.java +++ b/src/main/java/stirling/software/SPDF/repository/UserRepository.java @@ -3,10 +3,12 @@ package stirling.software.SPDF.repository; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import stirling.software.SPDF.model.User; -public interface UserRepository extends JpaRepository { +@Repository +public interface UserRepository extends JpaRepository { Optional findByUsernameIgnoreCase(String username); Optional findByUsername(String username); -- 2.46.1 From 6a3d95ba090f520af63a0d4442cb15f8e9b446fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Sat, 20 Jul 2024 09:15:03 +0000 Subject: [PATCH 022/231] Add missing Turkish translation (#1549) Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- src/main/resources/messages_tr_TR.properties | 92 ++++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 321d048f..13c87f3f 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -55,7 +55,7 @@ userNotFoundMessage=Kullanıcı bulunamadı. incorrectPasswordMessage=Mevcut şifre yanlış. usernameExistsMessage=Yeni Kullanıcı Adı zaten var. invalidUsernameMessage=Geçersiz kullanıcı adı, kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. +confirmPasswordErrorMessage=Yeni Şifre ve Yeni Şifreyi Onayla eşleşmelidir. deleteCurrentUserMessage=Şu anda oturum açmış olan kullanıcı silinemiyor. deleteUsernameExistsMessage=Kullanıcı adı mevcut değil ve silinemez. downgradeCurrentUserMessage=Mevcut kullanıcının rolü düşürülemiyor @@ -86,7 +86,7 @@ pipeline.defaultOption=Özel pipeline.submitButton=Gönder pipeline.help=Çoklu İşlemler Yardım pipeline.scanHelp=Klasör Tarama Yardımı -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=Çoklu işlemleri silmek istediğinizden emin misiniz ###################### # Pipeline Options # @@ -116,7 +116,7 @@ navbar.multiTool=Çoklu Araçlar navbar.sections.organize=Düzenle navbar.sections.convertTo=PDF'ye dönüştür navbar.sections.convertFrom=PDF'den dönüştür -navbar.sections.security=Oturum & Güvenlik +navbar.sections.security=Oturum ve Güvenlik navbar.sections.advance=Gelişmiş navbar.sections.edit=Görüntüle ve Düzenle @@ -175,8 +175,8 @@ adminUserSettings.header=Yönetici Kullanıcı Kontrol Ayarları adminUserSettings.admin=Yönetici adminUserSettings.user=Kullanıcı adminUserSettings.addUser=Yeni Kullanıcı Ekle -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.deleteUser=Kullanıcı Sil +adminUserSettings.confirmDeleteUser=Kullanıcı silinsin mi? adminUserSettings.usernameInfo=Kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır. adminUserSettings.roles=Roller adminUserSettings.role=Rol @@ -192,21 +192,21 @@ adminUserSettings.changeUserRole=Kullanıcı rolünü değiştir adminUserSettings.authenticated=Onaylandı -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Veri Tabanını İçe/Dışa Aktar +database.header=Veri Tabanını İçe/Dışa Aktar +database.fileName=Dosya Adı +database.creationDate=Oluşturulma Tarihi +database.fileSize=Dosya Boyutu +database.deleteBackupFile=Yedekleme Dosyasını Sil +database.importBackupFile=Yedekleme Dosyasını İçe Aktar +database.downloadBackupFile=Yedekleme Dosyasını İndir +database.info_1=Verileri içe aktarırken, yapının doğru olduğundan emin olmak çok önemlidir. Ne yaptığınızdan emin değilseniz, bir uzmandan tavsiye ve destek alın. Yapıdaki bir hata, uygulamanın tamamen çalıştırılamaması da dahil olmak üzere uygulama sorunlarına neden olabilir. +database.info_2=Karşıya yüklerken dosya adı önemli değildir. Daha sonra yedekleme_kullanıcısı_yyyyAAggSdd.sql biçiminde yeniden adlandırılacak ve tutarlı bir adlandırma kuralı sağlanacaktır. +database.submit=Yedeklemeyi İçe Aktar +database.importIntoDatabaseSuccessed=Veri tabanına başarıyla aktarıldı +database.fileNotFound=Dosya bulunamadı +database.fileNullOrEmpty=Dosya yok veya boş olmamalıdır +database.failedImportFile=Dosya İçe Aktarılamadı ############# # HOME-PAGE # @@ -353,9 +353,9 @@ home.certSign.title=Sertifika ile İmzala home.certSign.desc=Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar certSign.tags=doğrula,PEM,P12,resmi,şifrele -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Sertifika İmzasını Kaldır +home.removeCertSign.desc=PDF'ten sertifika imzasını kaldırır +removeCertSign.tags=doğrula,PEM,P12,resmi,şifre çöz home.pageLayout.title=Çoklu-Sayfa Düzeni home.pageLayout.desc=Bir PDF belgesinin çoklu sayfalarını tek bir sayfada birleştirir @@ -477,12 +477,12 @@ login.locked=Hesabınız kilitlendi. login.signinTitle=Lütfen giriş yapınız. login.ssoSignIn=Tek Oturum Açma ile Giriş Yap login.oauth2AutoCreateDisabled=OAUTH2 Otomatik Oluşturma Kullanıcı Devre Dışı Bırakıldı -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token +login.oauth2RequestNotFound=Yetkilendirme isteği bulunamadı +login.oauth2InvalidUserInfoResponse=Geçersiz Kullanıcı Bilgisi Yanıtı +login.oauth2invalidRequest=Geçersiz İstek +login.oauth2AccessDenied=Erişim Reddedildi +login.oauth2InvalidTokenResponse=Geçersiz Belirteç Yanıtı +login.oauth2InvalidIdToken=Geçersiz Kimlik Belirteci #auto-redact @@ -681,10 +681,10 @@ certSign.submit=PDF'i İmzala #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Sertifika İmzasını Kaldır +removeCertSign.header=PDF'ten dijital sertifikayı kaldırın +removeCertSign.selectPDF=PDF dosyası seçin: +removeCertSign.submit=İmzayı Kaldır #removeBlanks @@ -706,8 +706,8 @@ removeAnnotations.submit=Kaldır #compare compare.title=Karşılaştır compare.header=PDF'leri Karşılaştır -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Vurgu Rengi 1: +compare.highlightColor.2=Vurgu Rengi 2: compare.document.1=Belge 1 compare.document.2=Belge 2 compare.submit=Karşılaştır @@ -744,7 +744,7 @@ repair.submit=Onar #flatten flatten.title=Düzleştir flatten.header=PDF'leri Düzleştir -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Yalnızca formları düzleştir flatten.submit=Düzleştir @@ -822,7 +822,7 @@ merge.title=Birleştir merge.header=Çoklu PDF'leri Birleştir (2+) merge.sortByName=İsme göre sırala merge.sortByDate=Tarihe göre sırala -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Birleştirilen dosyadaki dijital imza kaldırılsın mı? merge.submit=Birleştir @@ -840,7 +840,7 @@ pdfOrganiser.mode.6=Tek-Çift Ayrımı pdfOrganiser.mode.7=İlk Önce Kaldır pdfOrganiser.mode.8=Sonuncuyu Kaldır pdfOrganiser.mode.9=İlk ve Sonu Kaldır -pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.10=Tek-Çift Birleştirme pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1) @@ -1099,17 +1099,17 @@ licenses.nav=Lisanslar licenses.title=3. Taraf Lisansları licenses.header=3. Taraf Lisansları licenses.module=Modül -licenses.version=Versiyon +licenses.version=Sürüm licenses.license=Lisans #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Anket +survey.title=Stirling-PDF Anketi +survey.description=Stirling-PDF'te izleme yok, bu yüzden Stirling-PDF'i iyileştirmek için kullanıcılarımızdan geri bildirim almak istiyoruz! +survey.please=Lütfen anketimize katılmayı düşünün! +survey.disabled=(Anket açılır penceresi sonraki güncellemelerde devre dışı bırakılacak ancak sayfanın alt kısmında yer alacaktır) +survey.button=Ankete Katıl +survey.dontShowAgain=Tekrar gösterme #error -- 2.46.1 From cf2a7896da1c753b5954c86e95881ea1a671292b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 20 Jul 2024 10:41:32 +0100 Subject: [PATCH 023/231] :memo: Update README: Translation Progress Table (#1571) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 86e6128d..26bd1275 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ Stirling PDF currently supports 33! | Japanese (日本語) (ja_JP) | ![90%](https://geps.dev/progress/90) | | Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | | Greek (Ελληνικά) (el_GR) | ![82%](https://geps.dev/progress/82) | -| Turkish (Türkçe) (tr_TR) | ![94%](https://geps.dev/progress/94) | +| Turkish (Türkçe) (tr_TR) | ![99%](https://geps.dev/progress/99) | | Indonesia (Bahasa Indonesia) (id_ID) | ![76%](https://geps.dev/progress/76) | | Hindi (हिंदी) (hi_IN) | ![77%](https://geps.dev/progress/77) | | Hungarian (Magyar) (hu_HU) | ![76%](https://geps.dev/progress/76) | -- 2.46.1 From 81871a6f10ba650b5ce7aed9763087420f2d29a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Jul 2024 10:42:03 +0100 Subject: [PATCH 024/231] Bump springBootVersion from 3.3.0 to 3.3.2 (#1570) Bumps `springBootVersion` from 3.3.0 to 3.3.2. Updates `org.springframework.boot:spring-boot-starter-web` from 3.3.0 to 3.3.2 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.0...v3.3.2) Updates `org.springframework.boot:spring-boot-starter-jetty` from 3.3.0 to 3.3.2 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.0...v3.3.2) Updates `org.springframework.boot:spring-boot-starter-thymeleaf` from 3.3.0 to 3.3.2 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.0...v3.3.2) Updates `org.springframework.boot:spring-boot-starter-security` from 3.3.0 to 3.3.2 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.0...v3.3.2) Updates `org.springframework.boot:spring-boot-starter-data-jpa` from 3.3.0 to 3.3.2 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.0...v3.3.2) Updates `org.springframework.boot:spring-boot-starter-oauth2-client` from 3.3.0 to 3.3.2 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.0...v3.3.2) Updates `org.springframework.boot:spring-boot-starter-test` from 3.3.0 to 3.3.2 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.0...v3.3.2) Updates `org.springframework.boot:spring-boot-starter-actuator` from 3.3.0 to 3.3.2 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.0...v3.3.2) Updates `org.springframework.boot:spring-boot-devtools` from 3.3.0 to 3.3.2 - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.0...v3.3.2) --- updated-dependencies: - dependency-name: org.springframework.boot:spring-boot-starter-web dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.boot:spring-boot-starter-jetty dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.boot:spring-boot-starter-thymeleaf dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.boot:spring-boot-starter-security dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.boot:spring-boot-starter-data-jpa dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.boot:spring-boot-starter-oauth2-client dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.boot:spring-boot-starter-test dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.boot:spring-boot-starter-actuator dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.boot:spring-boot-devtools dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e5460c19..eb776343 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { import com.github.jk1.license.render.* ext { - springBootVersion = "3.3.0" + springBootVersion = "3.3.2" } group = "stirling.software" -- 2.46.1 From cbe92269f4eab07ce28cd8506ea8dfb6b07c39b9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 20 Jul 2024 10:49:09 +0100 Subject: [PATCH 025/231] Update 3rd Party Licenses (#1572) Signed-off-by: GitHub Action Co-authored-by: GitHub Action --- src/main/resources/static/3rdPartyLicenses.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 2d4fe8ef..4a96a99d 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -906,7 +906,7 @@ { "moduleName": "org.springframework.boot:spring-boot-devtools", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -920,7 +920,7 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-actuator", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -934,7 +934,7 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-data-jpa", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -948,7 +948,7 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-jetty", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -969,28 +969,28 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-security", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-web", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, -- 2.46.1 From 6eb79e65faaf42f575c6bf01aab554fd7026975f Mon Sep 17 00:00:00 2001 From: Ludy Date: Mon, 22 Jul 2024 22:15:10 +0200 Subject: [PATCH 026/231] minor changes in the DEV tools and more (#1578) --- .github/labeler-config.yml | 40 ++++++++++++++++--- .github/scripts/check_tabulator.py | 1 + .../{labeler.yml => auto-labeler.yml} | 0 .github/workflows/sync_files.yml | 2 + build.gradle | 1 + .../database/DatabaseBackupHelper.java | 9 +++-- .../SPDF/model/ApplicationProperties.java | 2 + 7 files changed, 45 insertions(+), 10 deletions(-) rename .github/workflows/{labeler.yml => auto-labeler.yml} (100%) diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index 029aa318..da9e5e3f 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -1,20 +1,48 @@ -translation: +Translation: - changed-files: - any-glob-to-any-file: 'src/main/resources/messages_*_*.properties' Front End: - changed-files: - - any-glob-to-any-file: 'src/main/resources/templates/**' + - any-glob-to-any-file: 'src/main/resources/templates/**/*' + - any-glob-to-any-file: 'src/main/resources/static/**/*' + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/**' -java: +Java: - changed-files: - any-glob-to-any-file: 'src/main/java/**/*.java' -documentation: +Back End: + - changed-files: + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*' + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/provider/**/*' + - any-glob-to-any-file: 'src/main/resources/settings.yml.template' + - any-glob-to-any-file: 'src/main/resources/banner.txt' + +Security: + - changed-files: + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*' + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/provider/**/*' + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/AuthenticationType.java' + +API: + - changed-files: + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/MetricsController.java' + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/**/*' + +Documentation: - changed-files: - any-glob-to-any-file: '**/*.md' + - any-glob-to-any-file: 'scripts/counter_translation.py' + - any-glob-to-any-file: 'scripts/ignore_translation.toml' -docker: +Docker: - changed-files: - any-glob-to-any-file: 'Dockerfile' - - any-glob-to-any-file: 'Dockerfile-*' \ No newline at end of file + - any-glob-to-any-file: 'Dockerfile-*' + - any-glob-to-any-file: 'exampleYmlFiles/*.yml' + +Test: + - changed-files: + - any-glob-to-any-file: 'cucumber/**/*' + - any-glob-to-any-file: 'test*' \ No newline at end of file diff --git a/.github/scripts/check_tabulator.py b/.github/scripts/check_tabulator.py index eb408ad6..dea57092 100644 --- a/.github/scripts/check_tabulator.py +++ b/.github/scripts/check_tabulator.py @@ -1,4 +1,5 @@ """check_tabulator.py""" + import argparse import sys diff --git a/.github/workflows/labeler.yml b/.github/workflows/auto-labeler.yml similarity index 100% rename from .github/workflows/labeler.yml rename to .github/workflows/auto-labeler.yml diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml index c9365460..018f6e1f 100644 --- a/.github/workflows/sync_files.yml +++ b/.github/workflows/sync_files.yml @@ -51,6 +51,7 @@ jobs: [1]: https://github.com/peter-evans/create-pull-request draft: false delete-branch: true + labels: github-actions sync-readme: runs-on: ubuntu-latest steps: @@ -88,3 +89,4 @@ jobs: [1]: https://github.com/peter-evans/create-pull-request draft: false delete-branch: true + labels: Documentation,Translation,github-actions diff --git a/build.gradle b/build.gradle index eb776343..0dde7af5 100644 --- a/build.gradle +++ b/build.gradle @@ -40,6 +40,7 @@ sourceSets { exclude "stirling/software/SPDF/controller/web/AccountWebController.java" exclude "stirling/software/SPDF/controller/web/DatabaseWebController.java" exclude "stirling/software/SPDF/model/ApiKeyAuthenticationToken.java" + exclude "stirling/software/SPDF/model/AttemptCounter.java" exclude "stirling/software/SPDF/model/Authority.java" exclude "stirling/software/SPDF/model/PersistentLogin.java" exclude "stirling/software/SPDF/model/User.java" diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java index 0cf1e612..3ce4f28a 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseBackupHelper.java @@ -179,11 +179,12 @@ public class DatabaseBackupHelper implements DatabaseBackupInterface { } private boolean executeDatabaseScript(Path scriptPath) { - try (Connection conn = DriverManager.getConnection(url, "sa", ""); - Statement stmt = conn.createStatement()) { + String query = "RUNSCRIPT from ?;"; - String query = "RUNSCRIPT from '" + scriptPath.toString() + "';"; - stmt.execute(query); + try (Connection conn = DriverManager.getConnection(url, "sa", ""); + PreparedStatement stmt = conn.prepareStatement(query)) { + stmt.setString(1, scriptPath.toString()); + stmt.execute(); log.info("Database import completed: {}", scriptPath); return true; } catch (SQLException e) { diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index 99e45776..6bad4a66 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -360,6 +360,8 @@ public class ApplicationProperties { + useAsUsername + ", provider=" + provider + + ", client=" + + client + ", scopes=" + scopes + "]"; -- 2.46.1 From 560936e182575c824ae3783103659ae206abc80f Mon Sep 17 00:00:00 2001 From: Ludy Date: Tue, 23 Jul 2024 17:57:21 +0200 Subject: [PATCH 027/231] remove new lines and obsolete spaces (#1585) --- src/main/resources/messages_ar_AR.properties | 1 - src/main/resources/messages_bg_BG.properties | 1 - src/main/resources/messages_ca_CA.properties | 1 - src/main/resources/messages_cs_CZ.properties | 1 - src/main/resources/messages_de_DE.properties | 1 - src/main/resources/messages_el_GR.properties | 1 - src/main/resources/messages_en_GB.properties | 9 ++++----- src/main/resources/messages_en_US.properties | 5 ++--- src/main/resources/messages_es_ES.properties | 1 - src/main/resources/messages_eu_ES.properties | 1 - src/main/resources/messages_fr_FR.properties | 1 - src/main/resources/messages_hi_IN.properties | 1 - src/main/resources/messages_hr_HR.properties | 1 - src/main/resources/messages_hu_HU.properties | 1 - src/main/resources/messages_id_ID.properties | 1 - src/main/resources/messages_it_IT.properties | 1 - src/main/resources/messages_ja_JP.properties | 1 - src/main/resources/messages_ko_KR.properties | 1 - src/main/resources/messages_nl_NL.properties | 1 - src/main/resources/messages_no_NB.properties | 1 - src/main/resources/messages_pl_PL.properties | 1 - src/main/resources/messages_pt_BR.properties | 1 - src/main/resources/messages_pt_PT.properties | 1 - src/main/resources/messages_ro_RO.properties | 1 - src/main/resources/messages_ru_RU.properties | 1 - src/main/resources/messages_sk_SK.properties | 1 - src/main/resources/messages_sr_LATN_RS.properties | 1 - src/main/resources/messages_sv_SE.properties | 1 - src/main/resources/messages_th_TH.properties | 5 ++--- src/main/resources/messages_tr_TR.properties | 5 ++--- src/main/resources/messages_uk_UA.properties | 1 - src/main/resources/messages_zh_CN.properties | 1 - src/main/resources/messages_zh_TW.properties | 1 - 33 files changed, 10 insertions(+), 43 deletions(-) diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index f97377d8..30fb5715 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 0895f5f9..2207379c 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -1124,4 +1124,3 @@ error.showStack=Покажи проследяване на стека error.copyStack=Копиране на проследяване на стека error.githubSubmit=GitHub - Изпратете запитване error.discordSubmit=Discord - Изпратете запитване за поддръжка - diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 4a37930d..f641fa52 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 36634d3a..7f274dbb 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -1124,4 +1124,3 @@ error.showStack=Zobrazit stopu zásobníku error.copyStack=Kopírovat stopu zásobníku error.githubSubmit=GitHub - Odeslat požadavek error.discordSubmit=Discord - Odeslat příspěvek podpory - diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index b135d510..decbd9b0 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -1124,4 +1124,3 @@ error.showStack=Stack-Trace anzeigen error.copyStack=Stack-Trace kopieren error.githubSubmit=GitHub - Ein Ticket einreichen error.discordSubmit=Discord - Unterstützungsbeitrag einreichen - diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 7db7e274..6f32362d 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -1124,4 +1124,3 @@ error.showStack=Εμφάνιση Stack Trace error.copyStack=Αντιγραφή Stack Trace error.githubSubmit=GitHub - Υποβάλετε ένα ticket error.discordSubmit=Discord - Υποβάλετε ένα Support post - diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 7add06f6..79067b54 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -140,7 +140,7 @@ settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details -changeCreds.changePassword=You are using default login credentials. Please enter a new password +changeCreds.changePassword=You are using default login credentials. Please enter a new password changeCreds.newUsername=New Username changeCreds.oldPassword=Current Password changeCreds.newPassword=New Password @@ -706,8 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Compare compare.header=Compare PDFs -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Compare @@ -744,7 +744,7 @@ repair.submit=Repair #flatten flatten.title=Flatten flatten.header=Flatten PDF -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Flatten only forms flatten.submit=Flatten @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 5f20e450..1f38bf8c 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -706,8 +706,8 @@ removeAnnotations.submit=Remove #compare compare.title=Compare compare.header=Compare PDFs -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Compare @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index daf1172f..38c8f915 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -1124,4 +1124,3 @@ error.showStack=Mostrar seguimiento de pila error.copyStack=Mostrar seguimiento de pila error.githubSubmit=GitHub - Enviar un ticket error.discordSubmit=Discord - Enviar mensaje de soporte - diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 29dcc44b..65dff466 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 62731ae6..d7bae3ea 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -1124,4 +1124,3 @@ error.showStack=Afficher la Stack Trace error.copyStack=Copier la Stack Trace error.githubSubmit=GitHub - Créer un ticket error.discordSubmit=Discord - Poster un message de demande d’assistance - diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 000e2779..4938f49a 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index 9901e13f..c50613d6 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -1124,4 +1124,3 @@ error.showStack=Prikaži Stack Trace error.copyStack=Kopiraj Stack Trace error.githubSubmit=GitHub - Pošaljite ticket error.discordSubmit=Discord - Pošalji objavu podrške - diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index b9b77e5f..3967db38 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 38d4dee4..d31712bd 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index dca16d02..48effe89 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -1124,4 +1124,3 @@ error.showStack=Mostra traccia dello stack error.copyStack=Copia traccia dello stack error.githubSubmit=GitHub: invia un ticket error.discordSubmit=Discord: invia post di supporto - diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 2ac0cf76..3f39dcd3 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -1124,4 +1124,3 @@ error.showStack=スタックトレースを表示 error.copyStack=スタックトレースをコピー error.githubSubmit=GitHub - チケットを提出 error.discordSubmit=Discord - サポート投稿を提出 - diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index b86dca72..cae46d9b 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -1124,4 +1124,3 @@ error.showStack=스택 추적 보기 error.copyStack=스택 추적 복사 error.githubSubmit=GitHub - 티켓 제출 error.discordSubmit=Discord - 문의 게시 - diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index ed204678..6c43a399 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -1124,4 +1124,3 @@ error.showStack=Geeft tracering weer error.copyStack=Kopieer tracering error.githubSubmit=GitHub - Dien een ticket in error.discordSubmit=Discord - Maak een support post - diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 584cabf1..dcf43342 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -1124,4 +1124,3 @@ error.showStack=Vis stakksporing error.copyStack=Kopier stakksporing error.githubSubmit=GitHub - Send inn en billett error.discordSubmit=Discord - Send inn støtteinnlegg - diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 63dd95e3..17e4cb7b 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -1124,4 +1124,3 @@ error.showStack=Pokaż Stack Trace error.copyStack=Kopiuj Stack Trace error.githubSubmit=GitHub - wyślij zgłoszenie error.discordSubmit=Discord - wyślij posta z prośbą o pomoc - diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index bf87d427..4e82820f 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index a0df21cd..12fc44b4 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 1786a47d..b49f8d7e 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index d632969f..ad7c4df1 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -1124,4 +1124,3 @@ error.showStack=Показать стек вызовов error.copyStack=Скопировать стек вызовов error.githubSubmit=GitHub - Отправить заявку error.discordSubmit=Discord - Отправить запрос в поддержку - diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index f6f0cc1c..94f2d1df 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -1124,4 +1124,3 @@ error.showStack=Zobraziť sledovanie zásobníka error.copyStack=Kopírovať sledovanie zásobníka error.githubSubmit=GitHub - Podajte tiket error.discordSubmit=Discord - Podajte príspevok na podporu - diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index c20ac0d4..fe6f2ec7 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index c67574c6..fc8fb437 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -1124,4 +1124,3 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post - diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index a40ac939..8c24d449 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -706,8 +706,8 @@ removeAnnotations.submit=ลบ #compare compare.title=เปรียบเทียบ compare.header=เปรียบเทียบ PDF -compare.highlightColor.1=สีเน้น 1: -compare.highlightColor.2=สีเน้น 2: +compare.highlightColor.1=สีเน้น 1: +compare.highlightColor.2=สีเน้น 2: compare.document.1=เอกสาร 1 compare.document.2=เอกสาร 2 compare.submit=เปรียบเทียบ @@ -1124,4 +1124,3 @@ error.showStack=แสดง Stack Trace error.copyStack=คัดลอก Stack Trace error.githubSubmit=GitHub - ส่งตั๋ว error.discordSubmit=Discord - ส่งโพสต์การสนับสนุน - diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 13c87f3f..5a082bc3 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -706,8 +706,8 @@ removeAnnotations.submit=Kaldır #compare compare.title=Karşılaştır compare.header=PDF'leri Karşılaştır -compare.highlightColor.1=Vurgu Rengi 1: -compare.highlightColor.2=Vurgu Rengi 2: +compare.highlightColor.1=Vurgu Rengi 1: +compare.highlightColor.2=Vurgu Rengi 2: compare.document.1=Belge 1 compare.document.2=Belge 2 compare.submit=Karşılaştır @@ -1124,4 +1124,3 @@ error.showStack=Yığın İzlemesini Göster error.copyStack=Yığın İzini Kopyala error.githubSubmit=GitHub - Hata gönderin error.discordSubmit=Discord - Destek gönderisi gönderin - diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 2f68967e..9bd25283 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -1124,4 +1124,3 @@ error.showStack=Показати стек викликів error.copyStack=Скопіювати стек викликів error.githubSubmit=GitHub - Надіслати запит error.discordSubmit=Discord - Надіслати повідомлення підтримки - diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index f24f092e..e10b1bee 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -1124,4 +1124,3 @@ error.showStack=显示堆栈跟踪 error.copyStack=复制堆栈跟踪 error.githubSubmit=GitHub - 提交工单 error.discordSubmit=Discord - 提交支持帖子 - diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 6a4b3ac0..65f41fe2 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -1124,4 +1124,3 @@ error.showStack=顯示堆疊追蹤 error.copyStack=複製堆疊追蹤 error.githubSubmit=GitHub - 提交工單 error.discordSubmit=Discord - 提交支援帖子 - -- 2.46.1 From 072090d41b6d3dec83b36bb4e0a11ea7f46b196c Mon Sep 17 00:00:00 2001 From: Clara Bujeda <95882405+CBujeda@users.noreply.github.com> Date: Tue, 23 Jul 2024 19:51:46 +0200 Subject: [PATCH 028/231] Update of what was missing in messages_es_ES.properties (#1586) I have translated what was missing from translating so everything would be translated. --- src/main/resources/messages_es_ES.properties | 110 +++++++++---------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 38c8f915..d3724753 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -60,11 +60,11 @@ deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actua deleteUsernameExistsMessage=El usuario no existe y no puede eliminarse. downgradeCurrentUserMessage=No se puede degradar el rol del usuario actual downgradeCurrentUserLongMessage=No se puede degradar el rol del usuario actual. Por lo tanto, el usuario actual no se mostrará. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. +userAlreadyExistsOAuthMessage=La usuario ya existe como usuario de OAuth2. +userAlreadyExistsWebMessage=El usuario ya existe como usuario web. error=Error oops=Ups! -help=Help +help=Ayuda goHomepage=Ir a la página principal joinDiscord=Únase a nuestro servidor Discord seeDockerHub=Ver Docker Hub @@ -86,7 +86,7 @@ pipeline.defaultOption=Personalizar pipeline.submitButton=Enviar pipeline.help=Ayuda de Canalización pipeline.scanHelp=Ayuda de escaneado de carpetas -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=¿Estás segura de que quieres eliminar la canalización? ###################### # Pipeline Options # @@ -107,18 +107,18 @@ pipelineOptions.validateButton=Validar ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Favoritos navbar.darkmode=Modo oscuro -navbar.language=Languages +navbar.language=Idiomas navbar.settings=Configuración -navbar.allTools=Tools -navbar.multiTool=Multi Tools +navbar.allTools=Herramientas +navbar.multiTool=Multi herramientas navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit +navbar.sections.convertTo=Convertir a PDF +navbar.sections.convertFrom=Convertir desde PDF +navbar.sections.security=Señalización y seguridad +navbar.sections.advance=Avanzado +navbar.sections.edit=Ver y Editar ############# # SETTINGS # @@ -175,8 +175,8 @@ adminUserSettings.header=Configuración de control de usuario administrador adminUserSettings.admin=Administrador adminUserSettings.user=Usuario adminUserSettings.addUser=Añadir Nuevo Usuario -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.deleteUser=Eliminar Usuario +adminUserSettings.confirmDeleteUser=¿Se debe eliminar al usuario? adminUserSettings.usernameInfo=El nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida. adminUserSettings.roles=Roles adminUserSettings.role=Rol @@ -189,24 +189,24 @@ adminUserSettings.internalApiUser=Usuario interno de API adminUserSettings.forceChange=Forzar usuario a cambiar usuario/contraseña en el acceso adminUserSettings.submit=Guardar Usuario adminUserSettings.changeUserRole=Cambiar rol de usuario -adminUserSettings.authenticated=Authenticated +adminUserSettings.authenticated=Autenticado -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Base de Datos Importar/Exportar +database.header=Base de Datos Importar/Exportar +database.fileName=Nombre de Archivo +database.creationDate=Fecha de creación +database.fileSize=Tamaño de archivo +database.deleteBackupFile=Eliminar archivo de copia de seguridad +database.importBackupFile=Importar archivo de copia de seguridad +database.downloadBackupFile=Descargar archivo de copia de seguridad +database.info_1=Al importar datos, es fundamental garantizar la estructura correcta. Si no está seguro de lo que está haciendo, busque consejo y apoyo de un profesional. Un error en la estructura puede causar un mal funcionamiento de la aplicación, incluyendo la imposibilidad total de ejecutar la aplicación. +database.info_2=El nombre del archivo no importa al cargarlo. Posteriormente se le cambiará el nombre para que siga el formato backup_user_yyyyMMddHHmm.sql, lo que garantiza una convención de nomenclatura coherente. +database.submit=Importar Backup +database.importIntoDatabaseSuccessed=Importación a la base de datos ha sido exitosa +database.fileNotFound=Archivo no encontrado +database.fileNullOrEmpty=El archivo no debe ser nulo o vacío. +database.failedImportFile=Archivo de importación fallido ############# # HOME-PAGE # @@ -353,8 +353,8 @@ home.certSign.title=Firmar con certificado home.certSign.desc=Firmar un PDF con un Certificado/Clave (PEM/P12) certSign.tags=autentificar,PEM,P12,oficial,encriptar -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF +home.removeCertSign.title=Quitar signo de certificado +home.removeCertSign.desc=Eliminar firma de certificado de PDF removeCertSign.tags=authenticate,PEM,P12,official,decrypt home.pageLayout.title=Diseño de varias páginas @@ -476,13 +476,13 @@ login.invalid=Nombre de usuario o contraseña erróneos. login.locked=Su cuenta se ha bloqueado. login.signinTitle=Por favor, inicie sesión login.ssoSignIn=Iniciar sesión a través del inicio de sesión único -login.oauth2AutoCreateDisabled=Usuario DE creación automática de OAUTH2 DESACTIVADO -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response +login.oauth2AutoCreateDisabled=Usuario de creación automática de OAUTH2 DESACTIVADO +login.oauth2RequestNotFound=Solicitud de autorización no encontrada +login.oauth2InvalidUserInfoResponse=Respuesta de información de usuario no válida login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token +login.oauth2InvalidTokenResponse=Respuesta de token no válida +login.oauth2InvalidIdToken=Token de identificación no válido #auto-redact @@ -681,10 +681,10 @@ certSign.submit=Firmar PDF #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Eliminar firma del certificado +removeCertSign.header=Quitar el certificado digital del PDF +removeCertSign.selectPDF=Seleccione un archivo PDF: +removeCertSign.submit=Eliminar firma #removeBlanks @@ -706,8 +706,8 @@ removeAnnotations.submit=Eliminar #compare compare.title=Comparar compare.header=Comparar archivos PDF -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Color resaltado 1: +compare.highlightColor.2=Color resaltado 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar @@ -744,7 +744,7 @@ repair.submit=Reparar #flatten flatten.title=Aplanar flatten.header=Acoplar archivos PDF -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Aplanar sólo formularios flatten.submit=Aplanar @@ -792,7 +792,7 @@ extractImages.submit=Extraer fileToPDF.title=Archivo a PDF fileToPDF.header=Convertir cualquier archivo a PDF fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de archivos -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=Tipos de archivos admitidos fileToPDF.supportedFileTypes=Los tipos de archivo soportados deben incluir los indicados a continuación; sin embargo, para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice fileToPDF.submit=Convertir a PDF @@ -1000,8 +1000,8 @@ pdfToPDFA.header=PDF a PDF/A pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A pdfToPDFA.submit=Convertir pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.outputFormat=Formato de salida +pdfToPDFA.pdfWithDigitalSignature=El PDF contiene una firma digital. Esto se eliminará en el siguiente paso. #PDFToWord @@ -1103,13 +1103,13 @@ licenses.version=Versión licenses.license=Licencia #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Encuesta +survey.title=Encuesta Stirling-PDF +survey.description=Stirling-PDF no tiene seguimiento, por lo que queremos escuchar a nuestros usuarios para mejorar Stirling-PDF. +survey.please=¡Considere realizar nuestra encuesta! +survey.disabled=(La ventana emergente de la encuesta se desactivará en las siguientes actualizaciones, pero estará disponible al pie de la página.) +survey.button=Realizar encuesta +survey.dontShowAgain=No volver a mostrar #error -- 2.46.1 From bfe38c71e8fbc639b8b0e4aa092dd4ba9e08b91f Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Tue, 23 Jul 2024 21:18:00 +0200 Subject: [PATCH 029/231] Update messages_it_IT.properties (#1588) --- src/main/resources/messages_it_IT.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 48effe89..bcc78d5a 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -706,8 +706,8 @@ removeAnnotations.submit=Rimuovi #compare compare.title=Compara compare.header=Compara PDF -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Evidenzia colore 1: +compare.highlightColor.2=Evidenzia colore 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Compara -- 2.46.1 From e07f73dce73952b5a7aa4f474a8c78d92b15bc53 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste WITTNER <44366963+jbwittner@users.noreply.github.com> Date: Wed, 24 Jul 2024 22:58:04 +0200 Subject: [PATCH 030/231] [Helm][K8S] Add rootPath helm (#1593) * Update of values.yaml to use a new variable to manage the application rootpath * Use rootPath of values in deployment to manage rootPath and probes --- chart/stirling-pdf/templates/deployment.yaml | 8 +++++--- chart/stirling-pdf/values.yaml | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/chart/stirling-pdf/templates/deployment.yaml b/chart/stirling-pdf/templates/deployment.yaml index 290a56c9..d91e8097 100644 --- a/chart/stirling-pdf/templates/deployment.yaml +++ b/chart/stirling-pdf/templates/deployment.yaml @@ -62,8 +62,10 @@ spec: imagePullPolicy: {{ .Values.image.pullPolicy }} securityContext: {{- toYaml .Values.containerSecurityContext | nindent 10 }} -{{- if .Values.envs }} env: + - name: SYSTEM_ROOTURIPATH + value: {{ .Values.rootPath}} +{{- if .Values.envs }} {{ toYaml .Values.envs | indent 8 }} {{- end }} {{- if .Values.extraArgs }} @@ -75,13 +77,13 @@ spec: containerPort: 8080 livenessProbe: httpGet: - path: / + path: {{ .Values.rootPath}} port: http {{ toYaml .Values.probes.livenessHttpGetConfig | indent 12 }} {{ toYaml .Values.probes.liveness | indent 10 }} readinessProbe: httpGet: - path: / + path: {{ .Values.rootPath}} port: http {{ toYaml .Values.probes.readinessHttpGetConfig | indent 12 }} {{ toYaml .Values.probes.readiness | indent 10 }} diff --git a/chart/stirling-pdf/values.yaml b/chart/stirling-pdf/values.yaml index e9e00c3e..3e3e560c 100644 --- a/chart/stirling-pdf/values.yaml +++ b/chart/stirling-pdf/values.yaml @@ -15,6 +15,9 @@ secret: commonLabels: {} # team_name: dev +# rootpath for the application +rootPath: / + envs: [] # - name: UI_APP_NAME # value: "Stirling PDF" @@ -24,8 +27,6 @@ envs: [] # value: "Stirling PDF" # - name: ALLOW_GOOGLE_VISIBILITY # value: "true" -# - name: APP_ROOT_PATH -# value: "/" # - name: APP_LOCALE # value: "en_GB" -- 2.46.1 From 07f85ea8b4685f12f80c68541c6dfc00f337e6ea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 13:00:54 +0100 Subject: [PATCH 031/231] :memo: Update README: Translation Progress Table (#1587) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 26bd1275..3f3640e4 100644 --- a/README.md +++ b/README.md @@ -174,7 +174,7 @@ Stirling PDF currently supports 33! | Arabic (العربية) (ar_AR) | ![45%](https://geps.dev/progress/45) | | German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | -| Spanish (Español) (es_ES) | ![92%](https://geps.dev/progress/92) | +| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | | Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) | | Traditional Chinese (繁體中文) (zh_TW) | ![96%](https://geps.dev/progress/96) | | Catalan (Català) (ca_CA) | ![48%](https://geps.dev/progress/48) | -- 2.46.1 From 281047f42a469b5a6a1ecb69cfd0fc07b821242b Mon Sep 17 00:00:00 2001 From: Son Tran Lam Date: Fri, 26 Jul 2024 20:01:17 +0800 Subject: [PATCH 032/231] Translate to Vietnamese (#1591) * Translate to Vietnamese * Add translation for Vietnamese * - Remove invalid properties and duplicated values. - Add blank lines to align with the original format of en_GB file * fix eof * add empty lines to align with the template format. The number of line is equal with the reference en_GB file now * change some translations to be more natural and easier to understand --- scripts/ignore_translation.toml | 5 + src/main/resources/messages_vi_VN.properties | 1126 +++++++++++++++++ src/main/resources/static/images/flags/vn.svg | 11 + .../templates/fragments/languages.html | 1 + 4 files changed, 1143 insertions(+) create mode 100644 src/main/resources/messages_vi_VN.properties create mode 100644 src/main/resources/static/images/flags/vn.svg diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index d230b3f4..9b88b096 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -239,3 +239,8 @@ ignore = [ ignore = [ 'language.direction', ] + +[vi_VN] +ignore = [ + 'language.direction', +] diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties new file mode 100644 index 00000000..eda27872 --- /dev/null +++ b/src/main/resources/messages_vi_VN.properties @@ -0,0 +1,1126 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr = left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=Chọn (các) tệp PDF +multiPdfPrompt=Chọn các tệp PDF (2+) +multiPdfDropPrompt=Chọn (hoặc kéo và thả) tất cả các tệp PDF bạn cần +imgPrompt=Chọn (các) hình ảnh +genericSubmit=Gửi +processTimeWarning=Cảnh báo: Quá trình này có thể mất đến một phút tùy thuộc vào kích thước tệp +pageOrderPrompt=Thứ tự trang tùy chỉnh (Nhập danh sách số trang được phân tách bằng dấu phẩy hoặc Các hàm như 2n+1) : +pageSelectionPrompt=Lựa chọn trang tùy chỉnh (Nhập danh sách số trang được phân tách bằng dấu phẩy 1,5,6 hoặc Các hàm như 2n+1) : +goToPage=Đi đến +true=Đúng +false=Sai +unknown=Không xác định +save=Lưu +saveToBrowser=Lưu vào trình duyệt +close=Đóng +filesSelected=tệp đã chọn +noFavourites=Không có mục yêu thích nào được thêm +downloadComplete=Tải xuống hoàn tất +bored=Chán phải chờ đợi? +alphabet=Bảng chữ cái +downloadPdf=Tải xuống PDF +text=Văn bản +font=Phông chữ +selectFillter=-- Chọn -- +pageNum=Số trang +sizes.small=Nhỏ +sizes.medium=Trung bình +sizes.large=Lớn +sizes.x-large=Rất lớn +error.pdfPassword=Tài liệu PDF được bảo vệ bằng mật khẩu và mật khẩu không được cung cấp hoặc không chính xác +delete=Xóa +username=Tên người dùng +password=Mật khẩu +welcome=Chào mừng +property=Thuộc tính +black=Đen +white=Trắng +red=Đỏ +green=Xanh lá +blue=Xanh dương +custom=Tùy chỉnh... +WorkInProgess=Đang trong quá trình phát triển, Có thể không hoạt động hoặc có lỗi, Vui lòng báo cáo mọi vấn đề! +poweredBy=Được hỗ trợ bởi +yes=Có +no=Không +changedCredsMessage=Thông tin đăng nhập đã thay đổi! +notAuthenticatedMessage=Người dùng chưa được xác thực. +userNotFoundMessage=Không tìm thấy người dùng. +incorrectPasswordMessage=Mật khẩu hiện tại không chính xác. +usernameExistsMessage=Tên người dùng mới đã tồn tại. +invalidUsernameMessage=Tên người dùng không hợp lệ, tên người dùng chỉ có thể chứa chữ cái, số và các ký tự đặc biệt sau @._+- hoặc phải là một địa chỉ email hợp lệ. +confirmPasswordErrorMessage=Mật khẩu mới và Xác nhận mật khẩu mới phải khớp nhau. +deleteCurrentUserMessage=Không thể xóa người dùng đang đăng nhập. +deleteUsernameExistsMessage=Tên người dùng không tồn tại và không thể bị xóa. +downgradeCurrentUserMessage=Không thể hạ cấp vai trò của người dùng hiện tại +downgradeCurrentUserLongMessage=Không thể hạ cấp vai trò của người dùng hiện tại. Do đó, người dùng hiện tại sẽ không được hiển thị. +userAlreadyExistsOAuthMessage=Người dùng đã tồn tại dưới dạng người dùng OAuth2. +userAlreadyExistsWebMessage=Người dùng đã tồn tại dưới dạng người dùng web. +error=Lỗi +oops=Rất tiếc! +help=Trợ giúp +goHomepage=Đi đến Trang chủ +joinDiscord=Tham gia máy chủ Discord của chúng tôi +seeDockerHub=Xem Docker Hub +visitGithub=Truy cập kho lưu trữ Github +donate=Ủng hộ +color=Màu sắc +sponsor=Nhà tài trợ +info=Thông tin + + + +############### +# Pipeline # +############### +pipeline.header=Menu Pipeline (Beta) +pipeline.uploadButton=Tải lên tùy chỉnh +pipeline.configureButton=Cấu hình +pipeline.defaultOption=Tùy chỉnh +pipeline.submitButton=Gửi +pipeline.help=Trợ giúp Pipeline +pipeline.scanHelp=Trợ giúp quét thư mục +pipeline.deletePrompt=Bạn có chắc chắn muốn xóa pipeline + +###################### +# Pipeline Options # +###################### +pipelineOptions.header=Cấu hình Pipeline +pipelineOptions.pipelineNameLabel=Tên Pipeline +pipelineOptions.saveSettings=Lưu cài đặt thao tác +pipelineOptions.pipelineNamePrompt=Nhập tên pipeline tại đây +pipelineOptions.selectOperation=Chọn thao tác +pipelineOptions.addOperationButton=Thêm thao tác +pipelineOptions.pipelineHeader=Pipeline: +pipelineOptions.saveButton=Tải xuống +pipelineOptions.validateButton=Xác thực + + + + +############# +# NAVBAR # +############# +navbar.favorite=Yêu thích +navbar.darkmode=Chế độ tối +navbar.language=Ngôn ngữ +navbar.settings=Cài đặt +navbar.allTools=Công cụ +navbar.multiTool=Đa công cụ +navbar.sections.organize=Sắp xếp +navbar.sections.convertTo=Chuyển đổi sang PDF +navbar.sections.convertFrom=Chuyển đổi từ PDF +navbar.sections.security=Ký & Bảo mật +navbar.sections.advance=Nâng cao +navbar.sections.edit=Xem & Chỉnh sửa + +############# +# SETTINGS # +############# +settings.title=Cài đặt +settings.update=Có bản cập nhật +settings.updateAvailable={0} là phiên bản hiện tại đã cài đặt. Một phiên bản mới ({1}) đã có sẵn. +settings.appVersion=Phiên bản ứng dụng: +settings.downloadOption.title=Chọn tùy chọn tải xuống (Đối với tải xuống tệp đơn không nén): +settings.downloadOption.1=Mở trong cùng cửa sổ +settings.downloadOption.2=Mở trong cửa sổ mới +settings.downloadOption.3=Tải xuống tệp +settings.zipThreshold=Nén tệp khi số lượng tệp tải xuống vượt quá +settings.signOut=Đăng xuất +settings.accountSettings=Cài đặt tài khoản +settings.bored.help=Bật trò chơi ẩn +settings.cacheInputs.name=Lưu đầu vào biểu mẫu +settings.cacheInputs.help=Bật để lưu trữ các đầu vào đã sử dụng trước đó cho các lần chạy trong tương lai + +changeCreds.title=Thay đổi thông tin đăng nhập +changeCreds.header=Cập nhật thông tin tài khoản của bạn +changeCreds.changePassword=Bạn đang sử dụng thông tin đăng nhập mặc định. Vui lòng nhập mật khẩu mới +changeCreds.newUsername=Tên người dùng mới +changeCreds.oldPassword=Mật khẩu hiện tại +changeCreds.newPassword=Mật khẩu mới +changeCreds.confirmNewPassword=Xác nhận mật khẩu mới +changeCreds.submit=Gửi thay đổi + + + +account.title=Cài đặt tài khoản +account.accountSettings=Cài đặt tài khoản +account.adminSettings=Cài đặt quản trị - Xem và thêm người dùng +account.userControlSettings=Cài đặt kiểm soát người dùng +account.changeUsername=Thay đổi tên người dùng +account.newUsername=Tên người dùng mới +account.password=Mật khẩu xác nhận +account.oldPassword=Mật khẩu cũ +account.newPassword=Mật khẩu mới +account.changePassword=Thay đổi mật khẩu +account.confirmNewPassword=Xác nhận mật khẩu mới +account.signOut=Đăng xuất +account.yourApiKey=Khóa API của bạn +account.syncTitle=Đồng bộ hóa cài đặt trình duyệt với tài khoản +account.settingsCompare=So sánh cài đặt: +account.property=Thuộc tính +account.webBrowserSettings=Cài đặt trình duyệt web +account.syncToBrowser=Đồng bộ hóa Tài khoản -> Trình duyệt +account.syncToAccount=Đồng bộ hóa Tài khoản <- Trình duyệt + + +adminUserSettings.title=Cài đặt kiểm soát người dùng +adminUserSettings.header=Cài đặt kiểm soát người dùng quản trị +adminUserSettings.admin=Quản trị viên +adminUserSettings.user=Người dùng +adminUserSettings.addUser=Thêm người dùng mới +adminUserSettings.deleteUser=Xóa người dùng +adminUserSettings.confirmDeleteUser=Bạn có muốn xóa người dùng không? +adminUserSettings.usernameInfo=Tên người dùng chỉ có thể chứa chữ cái, số và các ký tự đặc biệt sau @._+- hoặc phải là một địa chỉ email hợp lệ. +adminUserSettings.roles=Vai trò +adminUserSettings.role=Vai trò +adminUserSettings.actions=Hành động +adminUserSettings.apiUser=Người dùng API giới hạn +adminUserSettings.extraApiUser=Người dùng API giới hạn bổ sung +adminUserSettings.webOnlyUser=Chỉ người dùng web +adminUserSettings.demoUser=Người dùng demo (Không có cài đặt tùy chỉnh) +adminUserSettings.internalApiUser=Người dùng API nội bộ +adminUserSettings.forceChange=Buộc người dùng thay đổi mật khẩu khi đăng nhập +adminUserSettings.submit=Lưu người dùng +adminUserSettings.changeUserRole=Thay đổi vai trò của người dùng +adminUserSettings.authenticated=Đã xác thực + + +database.title=Nhập/Xuất cơ sở dữ liệu +database.header=Nhập/Xuất cơ sở dữ liệu +database.fileName=Tên tệp +database.creationDate=Ngày tạo +database.fileSize=Kích thước tệp +database.deleteBackupFile=Xóa tệp sao lưu +database.importBackupFile=Nhập tệp sao lưu +database.downloadBackupFile=Tải xuống tệp sao lưu +database.info_1=Khi nhập dữ liệu, điều quan trọng là phải đảm bảo cấu trúc chính xác. Nếu bạn không chắc chắn về những gì bạn đang làm, hãy tìm kiếm lời khuyên và hỗ trợ từ một chuyên gia. Lỗi trong cấu trúc có thể gây ra sự cố ứng dụng, thậm chí là không thể chạy ứng dụng hoàn toàn. +database.info_2=Tên tệp không quan trọng khi tải lên. Nó sẽ được đổi tên sau đó để tuân theo định dạng backup_user_yyyyMMddHHmm.sql, đảm bảo quy ước đặt tên nhất quán. +database.submit=Nhập bản sao lưu +database.importIntoDatabaseSuccessed=Nhập vào cơ sở dữ liệu thành công +database.fileNotFound=Không tìm thấy tệp +database.fileNullOrEmpty=Tệp không được để trống hoặc rỗng +database.failedImportFile=Không thể nhập tệp + +############# +# HOME-PAGE # +############# +home.desc=Giải pháp toàn diện cho mọi nhu cầu về PDF ngay trên máy của bạn +home.searchBar=Tìm kiếm tính năng... + + +home.viewPdf.title=Xem PDF +home.viewPdf.desc=Xem, chú thích, thêm văn bản hoặc hình ảnh +viewPdf.tags=xem,đọc,chú thích,văn bản,hình ảnh + +home.multiTool.title=Đa công cụ PDF +home.multiTool.desc=Ghép nối, Xoay, Sắp xếp lại và Xóa trang +multiTool.tags=Đa công cụ,Đa thao tác,Giao diện người dùng,nhấp kéo,phía trước,phía máy khách,tương tác,có thể tương tác,di chuyển + +home.merge.title=Ghép nối +home.merge.desc=Dễ dàng ghép nối nhiều PDF thành một. +merge.tags=ghép nối,Thao tác trang,Phía sau,phía máy chủ + +home.split.title=Tách +home.split.desc=Tách PDF thành nhiều tài liệu +split.tags=Thao tác trang,chia,Nhiều trang,cắt,phía máy chủ + +home.rotate.title=Xoay +home.rotate.desc=Dễ dàng xoay PDF của bạn. +rotate.tags=phía máy chủ + + +home.imageToPdf.title=Hình ảnh sang PDF +home.imageToPdf.desc=Chuyển đổi hình ảnh (PNG, JPEG, GIF) sang PDF. +imageToPdf.tags=chuyển đổi,img,jpg,hình ảnh,ảnh + +home.pdfToImage.title=PDF sang Hình ảnh +home.pdfToImage.desc=Chuyển đổi PDF sang hình ảnh. (PNG, JPEG, GIF) +pdfToImage.tags=chuyển đổi,img,jpg,hình ảnh,ảnh + +home.pdfOrganiser.title=Sắp xếp +home.pdfOrganiser.desc=Xóa/Sắp xếp lại trang theo bất kỳ thứ tự nào +pdfOrganiser.tags=duplex,chẵn,lẻ,sắp xếp,di chuyển + + +home.addImage.title=Thêm hình ảnh +home.addImage.desc=Thêm hình ảnh vào vị trí cố định trên PDF +addImage.tags=img,jpg,hình ảnh,ảnh + +home.watermark.title=Thêm hình mờ +home.watermark.desc=Thêm hình mờ tùy chỉnh vào tài liệu PDF của bạn. +watermark.tags=Văn bản,lặp lại,nhãn,riêng,bản quyền,thương hiệu,img,jpg,hình ảnh,ảnh + +home.permissions.title=Thay đổi quyền +home.permissions.desc=Thay đổi quyền của tài liệu PDF của bạn +permissions.tags=đọc,viết,chỉnh sửa,in + + +home.removePages.title=Xóa +home.removePages.desc=Xóa các trang không mong muốn khỏi tài liệu PDF của bạn. +removePages.tags=Xóa trang,xóa trang + +home.addPassword.title=Thêm mật khẩu +home.addPassword.desc=Mã hóa tài liệu PDF của bạn bằng mật khẩu. +addPassword.tags=bảo mật,an toàn + +home.removePassword.title=Xóa mật khẩu +home.removePassword.desc=Xóa bảo vệ mật khẩu khỏi tài liệu PDF của bạn. +removePassword.tags=bảo mật,Giải mã,an toàn,bỏ mật khẩu,xóa mật khẩu + +home.compressPdfs.title=Nén +home.compressPdfs.desc=Nén PDF để giảm kích thước tệp. +compressPdfs.tags=ép,nhỏ,nhỏ gọn + + +home.changeMetadata.title=Thay đổi Metadata +home.changeMetadata.desc=Thay đổi/Xóa/Thêm metadata từ tài liệu PDF +changeMetadata.tags=Tiêu đề,tác giả,ngày,tạo,thời gian,nhà xuất bản,nhà sản xuất,thống kê + +home.fileToPDF.title=Chuyển đổi tệp sang PDF +home.fileToPDF.desc=Chuyển đổi hầu hết mọi tệp sang PDF (DOCX, PNG, XLS, PPT, TXT và nhiều hơn nữa) +fileToPDF.tags=chuyển đổi,định dạng,tài liệu,hình ảnh,slide,văn bản,chuyển đổi,văn phòng,tài liệu,word,excel,powerpoint + +home.ocr.title=OCR / Dọn dẹp bản quét +home.ocr.desc=Dọn dẹp bản quét và phát hiện văn bản từ hình ảnh trong PDF và thêm lại dưới dạng văn bản. +ocr.tags=nhận dạng,văn bản,hình ảnh,quét,đọc,nhận dạng,phát hiện,có thể chỉnh sửa + + +home.extractImages.title=Trích xuất hình ảnh +home.extractImages.desc=Trích xuất tất cả hình ảnh từ PDF và lưu chúng vào tệp zip +extractImages.tags=hình ảnh,ảnh,lưu,lưu trữ,zip,chụp,lấy + +home.pdfToPDFA.title=PDF sang PDF/A +home.pdfToPDFA.desc=Chuyển đổi PDF sang PDF/A để lưu trữ lâu dài +pdfToPDFA.tags=lưu trữ,dài hạn,tiêu chuẩn,chuyển đổi,lưu trữ,bảo quản + +home.PDFToWord.title=PDF sang Word +home.PDFToWord.desc=Chuyển đổi PDF sang các định dạng Word (DOC, DOCX và ODT) +PDFToWord.tags=doc,docx,odt,word,chuyển đổi,định dạng,chuyển đổi,văn phòng,microsoft,tệp doc + +home.PDFToPresentation.title=PDF sang Bài thuyết trình +home.PDFToPresentation.desc=Chuyển đổi PDF sang các định dạng Bài thuyết trình (PPT, PPTX và ODP) +PDFToPresentation.tags=slides,trình chiếu,văn phòng,microsoft + +home.PDFToText.title=PDF sang RTF (Văn bản) +home.PDFToText.desc=Chuyển đổi PDF sang định dạng Văn bản hoặc RTF +PDFToText.tags=định dạng phong phú,định dạng văn bản phong phú,định dạng văn bản phong phú + +home.PDFToHTML.title=PDF sang HTML +home.PDFToHTML.desc=Chuyển đổi PDF sang định dạng HTML +PDFToHTML.tags=nội dung web,thân thiện với trình duyệt + + +home.PDFToXML.title=PDF sang XML +home.PDFToXML.desc=Chuyển đổi PDF sang định dạng XML +PDFToXML.tags=trích xuất dữ liệu,nội dung có cấu trúc,tương tác,chuyển đổi,chuyển + +home.ScannerImageSplit.title=Phát hiện/Tách ảnh quét +home.ScannerImageSplit.desc=Tách nhiều ảnh từ trong một ảnh/PDF +ScannerImageSplit.tags=tách,tự động phát hiện,quét,nhiều ảnh,sắp xếp + +home.sign.title=Ký +home.sign.desc=Thêm chữ ký vào PDF bằng cách vẽ, văn bản hoặc hình ảnh +sign.tags=ủy quyền,ký tắt,chữ ký vẽ,ký văn bản,chữ ký hình ảnh + +home.flatten.title=Làm phẳng +home.flatten.desc=Xóa tất cả các phần tử tương tác và biểu mẫu từ PDF +flatten.tags=tĩnh,vô hiệu hóa,không tương tác,tinh giản + +home.repair.title=Sửa chữa +home.repair.desc=Cố gắng sửa chữa PDF bị hỏng/lỗi +repair.tags=sửa,khôi phục,sửa chữa,phục hồi + +home.removeBlanks.title=Xóa trang trống +home.removeBlanks.desc=Phát hiện và xóa các trang trống khỏi tài liệu +removeBlanks.tags=dọn dẹp,tinh giản,không nội dung,sắp xếp + +home.removeAnnotations.title=Xóa chú thích +home.removeAnnotations.desc=Xóa tất cả các bình luận/chú thích khỏi PDF +removeAnnotations.tags=bình luận,đánh dấu,ghi chú,đánh dấu,xóa + +home.compare.title=So sánh +home.compare.desc=So sánh và hiển thị sự khác biệt giữa 2 tài liệu PDF +compare.tags=phân biệt,đối chiếu,thay đổi,phân tích + +home.certSign.title=Ký bằng chứng chỉ +home.certSign.desc=Ký PDF bằng Chứng chỉ/Khóa (PEM/P12) +certSign.tags=xác thực,PEM,P12,chính thức,mã hóa + +home.removeCertSign.title=Xóa chữ ký chứng chỉ +home.removeCertSign.desc=Xóa chữ ký chứng chỉ khỏi PDF +removeCertSign.tags=xác thực,PEM,P12,chính thức,giải mã + +home.pageLayout.title=Bố cục nhiều trang +home.pageLayout.desc=Ghép nhiều trang của tài liệu PDF thành một trang duy nhất +pageLayout.tags=ghép,tổng hợp,xem đơn,sắp xếp + +home.scalePages.title=Điều chỉnh kích thước/tỷ lệ trang +home.scalePages.desc=Thay đổi kích thước/tỷ lệ của trang và/hoặc nội dung của nó. +scalePages.tags=điều chỉnh kích thước,sửa đổi,kích thước,điều chỉnh + +home.pipeline.title=Pipeline (Nâng cao) +home.pipeline.desc=Chạy nhiều thao tác trên PDF bằng cách định nghĩa các tập lệnh pipeline +pipeline.tags=tự động hóa,chuỗi,kịch bản,xử lý hàng loạt + +home.add-page-numbers.title=Thêm số trang +home.add-page-numbers.desc=Thêm số trang xuyên suốt tài liệu ở vị trí cố định +add-page-numbers.tags=đánh số trang,gắn nhãn,sắp xếp,chỉ mục + +home.auto-rename.title=Tự động đổi tên tệp PDF +home.auto-rename.desc=Tự động đổi tên tệp PDF dựa trên tiêu đề được phát hiện +auto-rename.tags=tự động phát hiện,dựa trên tiêu đề,sắp xếp,đổi nhãn + +home.adjust-contrast.title=Điều chỉnh màu sắc/tương phản +home.adjust-contrast.desc=Điều chỉnh độ tương phản, độ bão hòa và độ sáng của PDF +adjust-contrast.tags=hiệu chỉnh màu sắc,điều chỉnh,sửa đổi,nâng cao + +home.crop.title=Cắt PDF +home.crop.desc=Cắt PDF để giảm kích thước (giữ nguyên văn bản!) +crop.tags=cắt tỉa,thu nhỏ,chỉnh sửa,định hình + +home.autoSplitPDF.title=Tự động tách trang +home.autoSplitPDF.desc=Tự động tách PDF đã quét với mã QR tách trang quét vật lý +autoSplitPDF.tags=Dựa trên QR,tách,phân đoạn quét,sắp xếp + +home.sanitizePdf.title=Làm sạch +home.sanitizePdf.desc=Xóa các tập lệnh và phần tử khác khỏi các tệp PDF +sanitizePdf.tags=làm sạch,bảo mật,an toàn,loại bỏ mối đe dọa + +home.URLToPDF.title=URL/Trang web sang PDF +home.URLToPDF.desc=Chuyển đổi bất kỳ URL http(s) nào thành PDF +URLToPDF.tags=chụp web,lưu trang,web sang tài liệu,lưu trữ + +home.HTMLToPDF.title=HTML sang PDF +home.HTMLToPDF.desc=Chuyển đổi bất kỳ tệp HTML hoặc zip nào thành PDF +HTMLToPDF.tags=đánh dấu,nội dung web,chuyển đổi,chuyển + + +home.MarkdownToPDF.title=Markdown sang PDF +home.MarkdownToPDF.desc=Chuyển đổi bất kỳ tệp Markdown nào thành PDF +MarkdownToPDF.tags=đánh dấu,nội dung web,chuyển đổi,chuyển + + +home.getPdfInfo.title=Lấy TẤT CẢ thông tin về PDF +home.getPdfInfo.desc=Lấy bất kỳ và tất cả thông tin có thể về PDF +getPdfInfo.tags=thông tin,dữ liệu,số liệu thống kê,thống kê + + +home.extractPage.title=Trích xuất (các) trang +home.extractPage.desc=Trích xuất các trang được chọn từ PDF +extractPage.tags=trích xuất + + +home.PdfToSinglePage.title=PDF sang một trang lớn +home.PdfToSinglePage.desc=Ghép tất cả các trang PDF thành một trang lớn duy nhất +PdfToSinglePage.tags=trang đơn + + +home.showJS.title=Hiển thị Javascript +home.showJS.desc=Tìm kiếm và hiển thị bất kỳ JS nào được chèn vào PDF +showJS.tags=JS + +home.autoRedact.title=Tự động biên tập +home.autoRedact.desc=Tự động biên tập (Che đen) văn bản trong PDF dựa trên văn bản đầu vào +autoRedact.tags=Biên tập,Ẩn,che đen,đen,bút đánh dấu,ẩn + +home.tableExtraxt.title=PDF sang CSV +home.tableExtraxt.desc=Trích xuất bảng từ PDF chuyển đổi thành CSV +tableExtraxt.tags=CSV,Trích xuất bảng,trích xuất,chuyển đổi + + +home.autoSizeSplitPDF.title=Tự động chia theo kích thước/số lượng +home.autoSizeSplitPDF.desc=Chia một tệp PDF thành nhiều tài liệu dựa trên kích thước, số trang hoặc số lượng tài liệu +autoSizeSplitPDF.tags=pdf,chia,tài liệu,tổ chức + + +home.overlay-pdfs.title=Chồng lớp PDF +home.overlay-pdfs.desc=Chồng lớp PDF lên trên PDF khác +overlay-pdfs.tags=Chồng lớp + +home.split-by-sections.title=Chia PDF theo phần +home.split-by-sections.desc=Chia mỗi trang của PDF thành các phần nhỏ hơn theo chiều ngang và dọc +split-by-sections.tags=Chia phần,Phân chia,Tùy chỉnh + +home.AddStampRequest.title=Thêm dấu vào PDF +home.AddStampRequest.desc=Thêm văn bản hoặc hình ảnh dấu tại vị trí cố định +AddStampRequest.tags=Dấu,Thêm hình ảnh,căn giữa hình ảnh,Hình mờ,PDF,Nhúng,Tùy chỉnh + + +home.PDFToBook.title=PDF sang sách +home.PDFToBook.desc=Chuyển đổi PDF sang định dạng sách/truyện tranh bằng calibre +PDFToBook.tags=Sách,Truyện tranh,Calibre,Chuyển đổi,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf + +home.BookToPDF.title=Sách sang PDF +home.BookToPDF.desc=Chuyển đổi định dạng sách/truyện tranh sang PDF bằng calibre +BookToPDF.tags=Sách,Truyện tranh,Calibre,Chuyển đổi,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf + + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=Đăng nhập +login.header=Đăng nhập +login.signin=Đăng nhập +login.rememberme=Ghi nhớ tôi +login.invalid=Tên đăng nhập hoặc mật khẩu không hợp lệ. +login.locked=Tài khoản của bạn đã bị khóa. +login.signinTitle=Vui lòng đăng nhập +login.ssoSignIn=Đăng nhập qua Single Sign-on +login.oauth2AutoCreateDisabled=Tự động tạo người dùng OAUTH2 bị vô hiệu hóa +login.oauth2RequestNotFound=Không tìm thấy yêu cầu ủy quyền +login.oauth2InvalidUserInfoResponse=Phản hồi thông tin người dùng không hợp lệ +login.oauth2invalidRequest=Yêu cầu không hợp lệ +login.oauth2AccessDenied=Truy cập bị từ chối +login.oauth2InvalidTokenResponse=Phản hồi token không hợp lệ +login.oauth2InvalidIdToken=Id Token không hợp lệ + + +#auto-redact +autoRedact.title=Tự động biên tập +autoRedact.header=Tự động biên tập +autoRedact.colorLabel=Màu sắc +autoRedact.textsToRedactLabel=Văn bản cần biên tập (mỗi dòng một từ) +autoRedact.textsToRedactPlaceholder=ví dụ: \nMật \nTối mật +autoRedact.useRegexLabel=Sử dụng Regex +autoRedact.wholeWordSearchLabel=Tìm kiếm toàn bộ từ +autoRedact.customPaddingLabel=Đệm thêm tùy chỉnh +autoRedact.convertPDFToImageLabel=Chuyển đổi PDF thành PDF-Hình ảnh (Dùng để xóa văn bản phía sau ô) +autoRedact.submitButton=Gửi + + +#showJS +showJS.title=Hiển thị Javascript +showJS.header=Hiển thị Javascript +showJS.downloadJS=Tải xuống Javascript +showJS.submit=Hiển thị + + +#pdfToSinglePage +pdfToSinglePage.title=PDF thành một trang +pdfToSinglePage.header=PDF thành một trang +pdfToSinglePage.submit=Chuyển đổi thành một trang + + +#pageExtracter +pageExtracter.title=Trích xuất trang +pageExtracter.header=Trích xuất trang +pageExtracter.submit=Trích xuất +pageExtracter.placeholder=(ví dụ: 1,2,8 hoặc 4,7,12-16 hoặc 2n-1) + + +#getPdfInfo +getPdfInfo.title=Lấy thông tin PDF +getPdfInfo.header=Lấy thông tin PDF +getPdfInfo.submit=Lấy thông tin +getPdfInfo.downloadJson=Tải xuống JSON + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown sang PDF +MarkdownToPDF.header=Markdown sang PDF +MarkdownToPDF.submit=Chuyển đổi +MarkdownToPDF.help=Đang trong quá trình phát triển +MarkdownToPDF.credit=Sử dụng WeasyPrint + + + +#url-to-pdf +URLToPDF.title=URL sang PDF +URLToPDF.header=URL sang PDF +URLToPDF.submit=Chuyển đổi +URLToPDF.credit=Sử dụng WeasyPrint + + +#html-to-pdf +HTMLToPDF.title=HTML sang PDF +HTMLToPDF.header=HTML sang PDF +HTMLToPDF.help=Chấp nhận tệp HTML và ZIP chứa html/css/hình ảnh cần thiết +HTMLToPDF.submit=Chuyển đổi +HTMLToPDF.credit=Sử dụng WeasyPrint +HTMLToPDF.zoom=Mức độ phóng to để hiển thị trang web. +HTMLToPDF.pageWidth=Chiều rộng trang tính bằng cm. (Để trống để mặc định) +HTMLToPDF.pageHeight=Chiều cao trang tính bằng cm. (Để trống để mặc định) +HTMLToPDF.marginTop=Lề trên của trang tính bằng mm. (Để trống để mặc định) +HTMLToPDF.marginBottom=Lề dưới của trang tính bằng mm. (Để trống để mặc định) +HTMLToPDF.marginLeft=Lề trái của trang tính bằng mm. (Để trống để mặc định) +HTMLToPDF.marginRight=Lề phải của trang tính bằng mm. (Để trống để mặc định) +HTMLToPDF.printBackground=Hiển thị nền của trang web. +HTMLToPDF.defaultHeader=Bật tiêu đề mặc định (Tên và số trang) +HTMLToPDF.cssMediaType=Thay đổi loại phương tiện CSS của trang. +HTMLToPDF.none=Không +HTMLToPDF.print=In +HTMLToPDF.screen=Màn hình + + +#AddStampRequest +AddStampRequest.header=Đóng dấu PDF +AddStampRequest.title=Đóng dấu PDF +AddStampRequest.stampType=Loại dấu +AddStampRequest.stampText=Văn bản dấu +AddStampRequest.stampImage=Hình ảnh dấu +AddStampRequest.alphabet=Bảng chữ cái +AddStampRequest.fontSize=Cỡ chữ/Kích thước hình ảnh +AddStampRequest.rotation=Xoay +AddStampRequest.opacity=Độ mờ +AddStampRequest.position=Vị trí +AddStampRequest.overrideX=Ghi đè tọa độ X +AddStampRequest.overrideY=Ghi đè tọa độ Y +AddStampRequest.customMargin=Lề tùy chỉnh +AddStampRequest.customColor=Màu văn bản tùy chỉnh +AddStampRequest.submit=Gửi + + +#sanitizePDF +sanitizePDF.title=Làm sạch PDF +sanitizePDF.header=Làm sạch tệp PDF +sanitizePDF.selectText.1=Xóa các hành động JavaScript +sanitizePDF.selectText.2=Xóa các tệp nhúng +sanitizePDF.selectText.3=Xóa metadata +sanitizePDF.selectText.4=Xóa liên kết +sanitizePDF.selectText.5=Xóa phông chữ +sanitizePDF.submit=Làm sạch PDF + + +#addPageNumbers +addPageNumbers.title=Thêm số trang +addPageNumbers.header=Thêm số trang +addPageNumbers.selectText.1=Chọn tệp PDF: +addPageNumbers.selectText.2=Kích thước lề +addPageNumbers.selectText.3=Vị trí +addPageNumbers.selectText.4=Số bắt đầu +addPageNumbers.selectText.5=Trang cần đánh số +addPageNumbers.selectText.6=Văn bản tùy chỉnh +addPageNumbers.customTextDesc=Văn bản tùy chỉnh +addPageNumbers.numberPagesDesc=Những trang cần đánh số, mặc định là 'all', cũng chấp nhận 1-5 hoặc 2,5,9 v.v. +addPageNumbers.customNumberDesc=Mặc định là {n}, cũng chấp nhận 'Trang {n} / {total}', 'Văn bản-{n}', '{filename}-{n} +addPageNumbers.submit=Thêm số trang + + +#auto-rename +auto-rename.title=Tự động đổi tên +auto-rename.header=Tự động đổi tên PDF +auto-rename.submit=Tự động đổi tên + + +#adjustContrast +adjustContrast.title=Điều chỉnh độ tương phản +adjustContrast.header=Điều chỉnh độ tương phản +adjustContrast.contrast=Độ tương phản: +adjustContrast.brightness=Độ sáng: +adjustContrast.saturation=Độ bão hòa: +adjustContrast.download=Tải xuống + + +#crop +crop.title=Cắt cúp +crop.header=Cắt cúp PDF +crop.submit=Gửi + + +#autoSplitPDF +autoSplitPDF.title=Tự động chia PDF +autoSplitPDF.header=Tự động chia PDF +autoSplitPDF.description=In, chèn, quét, tải lên và để chúng tôi tự động tách tài liệu của bạn. Không cần sắp xếp thủ công. +autoSplitPDF.selectText.1=In một số trang phân cách từ bên dưới (Đen trắng là được). +autoSplitPDF.selectText.2=Quét tất cả tài liệu của bạn cùng một lúc bằng cách chèn trang phân cách giữa chúng. +autoSplitPDF.selectText.3=Tải lên tệp PDF quét lớn duy nhất và để Stirling PDF xử lý phần còn lại. +autoSplitPDF.selectText.4=Các trang phân cách được tự động phát hiện và xóa, đảm bảo tài liệu cuối cùng gọn gàng. +autoSplitPDF.formPrompt=Gửi PDF chứa trang phân cách Stirling-PDF: +autoSplitPDF.duplexMode=Chế độ hai mặt (Quét mặt trước và sau) +autoSplitPDF.dividerDownload1=Tải xuống 'Trang phân cách tự động (tối giản).pdf' +autoSplitPDF.dividerDownload2=Tải xuống 'Trang phân cách tự động (có hướng dẫn).pdf' +autoSplitPDF.submit=Gửi + + +#pipeline +pipeline.title=Pipeline + + +#pageLayout +pageLayout.title=Bố cục nhiều trang +pageLayout.header=Bố cục nhiều trang +pageLayout.pagesPerSheet=Số trang trên một tờ: +pageLayout.addBorder=Thêm viền +pageLayout.submit=Gửi + + +#scalePages +scalePages.title=Điều chỉnh tỷ lệ trang +scalePages.header=Điều chỉnh tỷ lệ trang +scalePages.pageSize=Kích thước của một trang trong tài liệu. +scalePages.scaleFactor=Mức độ phóng to (cắt cúp) của một trang. +scalePages.submit=Gửi + + +#certSign +certSign.title=Ký bằng chứng chỉ +certSign.header=Ký PDF bằng chứng chỉ của bạn (Đang trong quá trình phát triển) +certSign.selectPDF=Chọn tệp PDF để ký: +certSign.jksNote=Lưu ý: Nếu loại chứng chỉ của bạn không được liệt kê bên dưới, vui lòng chuyển đổi nó thành tệp Java Keystore (.jks) bằng công cụ dòng lệnh keytool. Sau đó, chọn tùy chọn tệp .jks bên dưới. +certSign.selectKey=Chọn tệp khóa riêng của bạn (định dạng PKCS#8, có thể là .pem hoặc .der): +certSign.selectCert=Chọn tệp chứng chỉ của bạn (định dạng X.509, có thể là .pem hoặc .der): +certSign.selectP12=Chọn tệp Keystore PKCS#12 của bạn (.p12 hoặc .pfx) (Tùy chọn, nếu cung cấp, nó phải chứa khóa riêng và chứng chỉ của bạn): +certSign.selectJKS=Chọn tệp Java Keystore của bạn (.jks hoặc .keystore): +certSign.certType=Loại chứng chỉ +certSign.password=Nhập mật khẩu Keystore hoặc Private Key của bạn (Nếu có): +certSign.showSig=Hiển thị chữ ký +certSign.reason=Lý do +certSign.location=Vị trí +certSign.name=Tên +certSign.submit=Ký PDF + + +#removeCertSign +removeCertSign.title=Xóa chữ ký chứng chỉ +removeCertSign.header=Xóa chứng chỉ số khỏi PDF +removeCertSign.selectPDF=Chọn một tệp PDF: +removeCertSign.submit=Xóa chữ ký + + +#removeBlanks +removeBlanks.title=Xóa trang trắng +removeBlanks.header=Xóa trang trắng +removeBlanks.threshold=Ngưỡng độ trắng của pixel: +removeBlanks.thresholdDesc=Ngưỡng để xác định mức độ trắng của một pixel để được coi là 'Trắng'. 0 = Đen, 255 trắng tinh khiết. +removeBlanks.whitePercent=Phần trăm trắng (%): +removeBlanks.whitePercentDesc=Phần trăm của trang phải là pixel 'trắng' để bị xóa +removeBlanks.submit=Xóa trang trắng + + +#removeAnnotations +removeAnnotations.title=Xóa chú thích +removeAnnotations.header=Xóa chú thích +removeAnnotations.submit=Xóa + + +#compare +compare.title=So sánh +compare.header=So sánh PDF +compare.highlightColor.1=Màu đánh dấu 1: +compare.highlightColor.2=Màu đánh dấu 2: +compare.document.1=Tài liệu 1 +compare.document.2=Tài liệu 2 +compare.submit=So sánh + +#BookToPDF +BookToPDF.title=Sách và truyện tranh sang PDF +BookToPDF.header=Sách sang PDF +BookToPDF.credit=Sử dụng Calibre +BookToPDF.submit=Chuyển đổi + +#PDFToBook +PDFToBook.title=PDF sang sách +PDFToBook.header=PDF sang sách +PDFToBook.selectText.1=Định dạng +PDFToBook.credit=Sử dụng Calibre +PDFToBook.submit=Chuyển đổi + +#sign +sign.title=Ký +sign.header=Ký PDF +sign.upload=Tải lên hình ảnh +sign.draw=Vẽ chữ ký +sign.text=Nhập văn bản +sign.clear=Xóa +sign.add=Thêm + + +#repair +repair.title=Sửa chữa +repair.header=Sửa chữa PDF +repair.submit=Sửa chữa + + +#flatten +flatten.title=Làm phẳng +flatten.header=Làm phẳng PDF +flatten.flattenOnlyForms=Chỉ làm phẳng biểu mẫu +flatten.submit=Làm phẳng + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=Ngưỡng góc: +ScannerImageSplit.selectText.2=Đặt góc tuyệt đối tối thiểu cần thiết để xoay hình ảnh (mặc định: 10). +ScannerImageSplit.selectText.3=Dung sai: +ScannerImageSplit.selectText.4=Xác định phạm vi biến đổi màu sắc xung quanh màu nền ước tính (mặc định: 30). +ScannerImageSplit.selectText.5=Diện tích tối thiểu: +ScannerImageSplit.selectText.6=Đặt ngưỡng diện tích tối thiểu cho một ảnh (mặc định: 10000). +ScannerImageSplit.selectText.7=Diện tích đường viền tối thiểu: +ScannerImageSplit.selectText.8=Đặt ngưỡng diện tích đường viền tối thiểu cho một ảnh +ScannerImageSplit.selectText.9=Kích thước viền: +ScannerImageSplit.selectText.10=Đặt kích thước của viền được thêm vào và loại bỏ để ngăn chặn viền trắng trong đầu ra (mặc định: 1). + + +#OCR +ocr.title=OCR / Làm sạch bản Scan +ocr.header=Làm sạch các bản Scan / OCR (Nhận dạng ký tự quang học) +ocr.selectText.1=Chọn ngôn ngữ cần được phát hiện trong PDF (Những ngôn ngữ được liệt kê là những ngôn ngữ hiện đang được phát hiện): +ocr.selectText.2=Tạo tệp văn bản chứa văn bản OCR cùng với PDF đã được OCR +ocr.selectText.3=Sửa các trang đã được scan ở góc nghiêng bằng cách xoay chúng trở lại vị trí +ocr.selectText.4=Làm sạch trang để giảm khả năng OCR sẽ tìm thấy văn bản trong nhiễu nền. (Không thay đổi đầu ra) +ocr.selectText.5=Làm sạch trang để giảm khả năng OCR sẽ tìm thấy văn bản trong nhiễu nền, duy trì làm sạch trong đầu ra. +ocr.selectText.6=Bỏ qua các trang có văn bản tương tác, chỉ OCR các trang là hình ảnh +ocr.selectText.7=Bắt buộc OCR, sẽ OCR mọi trang và xóa tất cả các phần tử văn bản gốc +ocr.selectText.8=Bình thường (Sẽ báo lỗi nếu PDF chứa văn bản) +ocr.selectText.9=Cài đặt bổ sung +ocr.selectText.10=Chế độ OCR +ocr.selectText.11=Xóa hình ảnh sau khi OCR (Xóa TẤT CẢ hình ảnh, chỉ hữu ích nếu là một phần của bước chuyển đổi) +ocr.selectText.12=Loại hiển thị (Nâng cao) +ocr.help=Vui lòng đọc tài liệu này về cách sử dụng cho các ngôn ngữ khác và/hoặc sử dụng không trong docker +ocr.credit=Dịch vụ này sử dụng OCRmyPDF và Tesseract cho OCR. +ocr.submit=Xử lý PDF với OCR + + +#extractImages +extractImages.title=Trích xuất hình ảnh +extractImages.header=Trích xuất hình ảnh +extractImages.selectText=Chọn định dạng hình ảnh để chuyển đổi hình ảnh đã trích xuất +extractImages.submit=Trích xuất + + +#File to PDF +fileToPDF.title=Tệp sang PDF +fileToPDF.header=Chuyển đổi bất kỳ tệp nào sang PDF +fileToPDF.credit=Dịch vụ này sử dụng LibreOffice và Unoconv để chuyển đổi tệp. +fileToPDF.supportedFileTypesInfo=Các loại tệp được hỗ trợ +fileToPDF.supportedFileTypes=Các loại tệp được hỗ trợ nên bao gồm các loại dưới đây, tuy nhiên để có danh sách đầy đủ và cập nhật các định dạng được hỗ trợ, vui lòng tham khảo tài liệu LibreOffice +fileToPDF.submit=Chuyển đổi sang PDF + + +#compress +compress.title=Nén +compress.header=Nén PDF +compress.credit=Dịch vụ này sử dụng Ghostscript để Nén/Tối ưu hóa PDF. +compress.selectText.1=Chế độ thủ công - Từ 1 đến 4 +compress.selectText.2=Mức độ tối ưu hóa: +compress.selectText.3=4 (Tệ cho hình ảnh văn bản) +compress.selectText.4=Chế độ tự động - Tự động điều chỉnh chất lượng để đạt được kích thước PDF chính xác +compress.selectText.5=Kích thước PDF mong muốn (ví dụ: 25MB, 10.8MB, 25KB) +compress.submit=Nén + + +#Add image +addImage.title=Thêm hình ảnh +addImage.header=Thêm hình ảnh vào PDF +addImage.everyPage=Mọi trang? +addImage.upload=Thêm hình ảnh +addImage.submit=Thêm hình ảnh + + +#merge +merge.title=Trộn +merge.header=Trộn nhiều PDF (2+) +merge.sortByName=Sắp xếp theo tên +merge.sortByDate=Sắp xếp theo ngày +merge.removeCertSign=Xóa chữ ký số trong tệp đã trộn? +merge.submit=Trộn + + +#pdfOrganiser +pdfOrganiser.title=Sắp xếp trang +pdfOrganiser.header=Sắp xếp trang PDF +pdfOrganiser.submit=Sắp xếp lại trang +pdfOrganiser.mode=Chế độ +pdfOrganiser.mode.1=Thứ tự trang tùy chỉnh +pdfOrganiser.mode.2=Đảo ngược thứ tự +pdfOrganiser.mode.3=Sắp xếp hai mặt +pdfOrganiser.mode.4=Sắp xếp sách nhỏ +pdfOrganiser.mode.5=Sắp xếp sách nhỏ đóng gáy bên +pdfOrganiser.mode.6=Tách lẻ-chẵn +pdfOrganiser.mode.7=Xóa trang đầu +pdfOrganiser.mode.8=Xóa trang cuối +pdfOrganiser.mode.9=Xóa trang đầu và cuối +pdfOrganiser.mode.10=Trộn lẻ-chẵn +pdfOrganiser.placeholder=(ví dụ: 1,3,2 hoặc 4-8,2,10-12 hoặc 2n-1) + + +#multiTool +multiTool.title=Công cụ đa năng PDF +multiTool.header=Công cụ đa năng PDF +multiTool.uploadPrompts=Tên tệp + +#view pdf +viewPdf.title=Xem PDF +viewPdf.header=Xem PDF + +#pageRemover +pageRemover.title=Xóa trang +pageRemover.header=Xóa trang PDF +pageRemover.pagesToDelete=Các trang cần xóa (Nhập danh sách số trang được phân cách bằng dấu phẩy) : +pageRemover.submit=Xóa trang +pageRemover.placeholder=(ví dụ: 1,2,6 hoặc 1-10,15-30) + + +#rotate +rotate.title=Xoay PDF +rotate.header=Xoay PDF +rotate.selectAngle=Chọn góc xoay (theo bội số của 90 độ): +rotate.submit=Xoay + + +#split-pdfs +split.title=Chia PDF +split.header=Chia PDF +split.desc.1=Các số bạn chọn là số trang bạn muốn thực hiện chia +split.desc.2=Như vậy, việc chọn 1,3,7-9 sẽ chia một tài liệu 10 trang thành 6 PDF riêng biệt với: +split.desc.3=Tài liệu #1: Trang 1 +split.desc.4=Tài liệu #2: Trang 2 và 3 +split.desc.5=Tài liệu #3: Trang 4, 5, 6 và 7 +split.desc.6=Tài liệu #4: Trang 8 +split.desc.7=Tài liệu #5: Trang 9 +split.desc.8=Tài liệu #6: Trang 10 +split.splitPages=Nhập các trang cần chia: +split.submit=Chia + + +#merge +imageToPDF.title=Hình ảnh sang PDF +imageToPDF.header=Hình ảnh sang PDF +imageToPDF.submit=Chuyển đổi +imageToPDF.selectLabel=Tùy chọn điều chỉnh hình ảnh +imageToPDF.fillPage=Lấp đầy trang +imageToPDF.fitDocumentToImage=Điều chỉnh trang theo hình ảnh +imageToPDF.maintainAspectRatio=Giữ tỷ lệ khung hình +imageToPDF.selectText.2=Tự động xoay PDF +imageToPDF.selectText.3=Logic đa tệp (Chỉ được bật khi làm việc với nhiều hình ảnh) +imageToPDF.selectText.4=Trộn thành một PDF duy nhất +imageToPDF.selectText.5=Chuyển đổi thành các PDF riêng biệt + + +#pdfToImage +pdfToImage.title=PDF sang hình ảnh +pdfToImage.header=PDF sang hình ảnh +pdfToImage.selectText=Định dạng hình ảnh +pdfToImage.singleOrMultiple=Loại kết quả trang sang hình ảnh +pdfToImage.single=Một hình ảnh lớn kết hợp tất cả các trang +pdfToImage.multi=Nhiều hình ảnh, mỗi trang một hình ảnh +pdfToImage.colorType=Loại màu +pdfToImage.color=Màu +pdfToImage.grey=Thang độ xám +pdfToImage.blackwhite=Đen trắng (Có thể mất dữ liệu!) +pdfToImage.submit=Chuyển đổi + + +#addPassword +addPassword.title=Thêm mật khẩu +addPassword.header=Thêm mật khẩu (Mã hóa) +addPassword.selectText.1=Chọn PDF để mã hóa +addPassword.selectText.2=Mật khẩu người dùng +addPassword.selectText.3=Độ dài khóa mã hóa +addPassword.selectText.4=Giá trị cao hơn thì mạnh hơn, nhưng giá trị thấp hơn có tính tương thích tốt hơn. +addPassword.selectText.5=Quyền cần đặt (Khuyến nghị sử dụng cùng với mật khẩu chủ sở hữu) +addPassword.selectText.6=Ngăn chặn lắp ráp tài liệu +addPassword.selectText.7=Ngăn chặn trích xuất nội dung +addPassword.selectText.8=Ngăn chặn trích xuất để truy cập +addPassword.selectText.9=Ngăn chặn điền vào biểu mẫu +addPassword.selectText.10=Ngăn chặn sửa đổi +addPassword.selectText.11=Ngăn chặn sửa đổi chú thích +addPassword.selectText.12=Ngăn chặn in +addPassword.selectText.13=Ngăn chặn in các định dạng khác nhau +addPassword.selectText.14=Mật khẩu chủ sở hữu +addPassword.selectText.15=Hạn chế những gì có thể làm với tài liệu sau khi mở (Không được hỗ trợ bởi tất cả các trình đọc) +addPassword.selectText.16=Hạn chế việc mở tài liệu +addPassword.submit=Mã hóa + + +#watermark +watermark.title=Thêm hình mờ +watermark.header=Thêm hình mờ +watermark.selectText.1=Chọn PDF để thêm hình mờ: +watermark.selectText.2=Văn bản hình mờ: +watermark.selectText.3=Cỡ chữ: +watermark.selectText.4=Xoay (0-360): +watermark.selectText.5=Khoảng cách ngang (Khoảng cách giữa mỗi hình mờ theo chiều ngang): +watermark.selectText.6=Khoảng cách dọc (Khoảng cách giữa mỗi hình mờ theo chiều dọc): +watermark.selectText.7=Độ mờ (0% - 100%): +watermark.selectText.8=Loại hình mờ: +watermark.selectText.9=Hình ảnh hình mờ: +watermark.submit=Thêm hình mờ +watermark.type.1=Văn bản +watermark.type.2=Hình ảnh + + +#Change permissions +permissions.title=Thay đổi quyền +permissions.header=Thay đổi quyền +permissions.warning=Cảnh báo để các quyền này không thể thay đổi, bạn nên đặt chúng với mật khẩu thông qua trang thêm mật khẩu +permissions.selectText.1=Chọn PDF để thay đổi quyền +permissions.selectText.2=Quyền cần đặt +permissions.selectText.3=Ngăn chặn lắp ráp tài liệu +permissions.selectText.4=Ngăn chặn trích xuất nội dung +permissions.selectText.5=Ngăn chặn trích xuất để truy cập +permissions.selectText.6=Ngăn chặn điền vào biểu mẫu +permissions.selectText.7=Ngăn chặn sửa đổi +permissions.selectText.8=Ngăn chặn sửa đổi chú thích +permissions.selectText.9=Ngăn chặn in +permissions.selectText.10=Ngăn chặn in các định dạng khác nhau +permissions.submit=Thay đổi + + +#remove password +removePassword.title=Xóa mật khẩu +removePassword.header=Xóa mật khẩu (Giải mã) +removePassword.selectText.1=Chọn PDF để giải mã +removePassword.selectText.2=Mật khẩu +removePassword.submit=Xóa + + +#changeMetadata +changeMetadata.title=Thay đổi metadata +changeMetadata.header=Thay đổi metadata +changeMetadata.selectText.1=Vui lòng chỉnh sửa các biến bạn muốn thay đổi +changeMetadata.selectText.2=Xóa tất cả metadata +changeMetadata.selectText.3=Hiển thị metadata tùy chỉnh: +changeMetadata.author=Tác giả: +changeMetadata.creationDate=Ngày tạo (yyyy/MM/dd HH:mm:ss): +changeMetadata.creator=Người tạo: +changeMetadata.keywords=Từ khóa: +changeMetadata.modDate=Ngày sửa đổi (yyyy/MM/dd HH:mm:ss): +changeMetadata.producer=Nhà sản xuất: +changeMetadata.subject=Chủ đề: +changeMetadata.trapped=Trapped: +changeMetadata.selectText.4=Metadata khác: +changeMetadata.selectText.5=Thêm mục metadata tùy chỉnh +changeMetadata.submit=Thay đổi + + +#pdfToPDFA +pdfToPDFA.title=PDF sang PDF/A +pdfToPDFA.header=PDF sang PDF/A +pdfToPDFA.credit=Dịch vụ này sử dụng OCRmyPDF để chuyển đổi PDF/A +pdfToPDFA.submit=Chuyển đổi +pdfToPDFA.tip=Hiện tại không hoạt động với nhiều đầu vào cùng lúc +pdfToPDFA.outputFormat=Định dạng đầu ra +pdfToPDFA.pdfWithDigitalSignature=PDF chứa chữ ký số. Điều này sẽ bị xóa trong bước tiếp theo. + + +#PDFToWord +PDFToWord.title=PDF sang Word +PDFToWord.header=PDF sang Word +PDFToWord.selectText.1=Định dạng tệp đầu ra +PDFToWord.credit=Dịch vụ này sử dụng LibreOffice để chuyển đổi tệp. +PDFToWord.submit=Chuyển đổi + + +#PDFToPresentation +PDFToPresentation.title=PDF sang bài thuyết trình +PDFToPresentation.header=PDF sang bài thuyết trình +PDFToPresentation.selectText.1=Định dạng tệp đầu ra +PDFToPresentation.credit=Dịch vụ này sử dụng LibreOffice để chuyển đổi tệp. +PDFToPresentation.submit=Chuyển đổi + + +#PDFToText +PDFToText.title=PDF sang RTF (Văn bản) +PDFToText.header=PDF sang RTF (Văn bản) +PDFToText.selectText.1=Định dạng tệp đầu ra +PDFToText.credit=Dịch vụ này sử dụng LibreOffice để chuyển đổi tệp. +PDFToText.submit=Chuyển đổi + + +#PDFToHTML +PDFToHTML.title=PDF sang HTML +PDFToHTML.header=PDF sang HTML +PDFToHTML.credit=Dịch vụ này sử dụng pdftohtml để chuyển đổi tệp. +PDFToHTML.submit=Chuyển đổi + + +#PDFToXML +PDFToXML.title=PDF sang XML +PDFToXML.header=PDF sang XML +PDFToXML.credit=Dịch vụ này sử dụng LibreOffice để chuyển đổi tệp. +PDFToXML.submit=Chuyển đổi + +#PDFToCSV +PDFToCSV.title=PDF sang CSV +PDFToCSV.header=PDF sang CSV +PDFToCSV.prompt=Chọn trang để trích xuất bảng +PDFToCSV.submit=Trích xuất + +#split-by-size-or-count +split-by-size-or-count.title=Chia PDF theo kích thước hoặc số lượng +split-by-size-or-count.header=Chia PDF theo kích thước hoặc số lượng +split-by-size-or-count.type.label=Chọn loại chia +split-by-size-or-count.type.size=Theo kích thước +split-by-size-or-count.type.pageCount=Theo số trang +split-by-size-or-count.type.docCount=Theo số tài liệu +split-by-size-or-count.value.label=Nhập giá trị +split-by-size-or-count.value.placeholder=Nhập kích thước (ví dụ: 2MB hoặc 3KB) hoặc số lượng (ví dụ: 5) +split-by-size-or-count.submit=Gửi + + +#overlay-pdfs +overlay-pdfs.header=Chồng lớp tệp PDF +overlay-pdfs.baseFile.label=Chọn tệp PDF nền +overlay-pdfs.overlayFiles.label=Chọn các tệp PDF chồng lớp +overlay-pdfs.mode.label=Chọn chế độ chồng lớp +overlay-pdfs.mode.sequential=Chồng lớp tuần tự +overlay-pdfs.mode.interleaved=Chồng lớp xen kẽ +overlay-pdfs.mode.fixedRepeat=Chồng lớp lặp lại cố định +overlay-pdfs.counts.label=Số lần chồng lớp (cho chế độ lặp lại cố định) +overlay-pdfs.counts.placeholder=Nhập số lần chồng lớp, phân cách bằng dấu phẩy (ví dụ: 2,3,1) +overlay-pdfs.position.label=Chọn vị trí chồng lớp +overlay-pdfs.position.foreground=Nền trước +overlay-pdfs.position.background=Nền sau +overlay-pdfs.submit=Gửi + + +#split-by-sections +split-by-sections.title=Chia PDF theo phần +split-by-sections.header=Chia PDF thành các phần +split-by-sections.horizontal.label=Phân chia theo chiều ngang +split-by-sections.vertical.label=Phân chia theo chiều dọc +split-by-sections.horizontal.placeholder=Nhập số lượng phân chia theo chiều ngang +split-by-sections.vertical.placeholder=Nhập số lượng phân chia theo chiều dọc +split-by-sections.submit=Chia PDF +split-by-sections.merge=Trộn thành một PDF + + +#printFile +printFile.title=In tệp +printFile.header=In tệp vào máy in +printFile.selectText.1=Chọn tệp để in +printFile.selectText.2=Nhập tên máy in +printFile.submit=In + + +#licenses +licenses.nav=Giấy phép +licenses.title=Giấy phép bên thứ 3 +licenses.header=Giấy phép bên thứ 3 +licenses.module=Module +licenses.version=Phiên bản +licenses.license=Giấy phép + +#survey +survey.nav=Khảo sát +survey.title=Khảo sát Stirling-PDF +survey.description=Stirling-PDF không có cài đặt theo dõi nên chúng tôi muốn nghe từ người dùng để cải thiện Stirling-PDF! +survey.please=Vui lòng cân nhắc tham gia khảo sát của chúng tôi! +survey.disabled=(Cửa sổ popup khảo sát sẽ bị vô hiệu hóa trong các bản cập nhật tiếp theo nhưng vẫn tìm thấy ở cuối trang) +survey.button=Tham gia khảo sát +survey.dontShowAgain=Không hiển thị lại + + +#error +error.sorry=Xin lỗi vì sự cố! +error.needHelp=Cần trợ giúp / Phát hiện sự cố? +error.contactTip=Nếu bạn vẫn gặp khó khăn, đừng ngần ngại liên hệ với chúng tôi để được trợ giúp. Bạn có thể gửi ticket trên trang GitHub của chúng tôi hoặc liên hệ qua Discord: +error.404.head=404 - Không tìm thấy trang | Ồ, có vẻ như chúng tôi đã vấp phải lỗi trong mã nguồn! +error.404.1=Chúng tôi không thể tìm thấy trang bạn đang tìm kiếm. +error.404.2=Đã xảy ra lỗi +error.github=Gửi ticket trên GitHub +error.showStack=Hiển thị Stack Trace +error.copyStack=Sao chép Stack Trace +error.githubSubmit=GitHub - Gửi ticket +error.discordSubmit=Discord - Gửi bài đăng hỗ trợ diff --git a/src/main/resources/static/images/flags/vn.svg b/src/main/resources/static/images/flags/vn.svg new file mode 100644 index 00000000..7e4bac8f --- /dev/null +++ b/src/main/resources/static/images/flags/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html index def990df..264a0f8b 100644 --- a/src/main/resources/templates/fragments/languages.html +++ b/src/main/resources/templates/fragments/languages.html @@ -32,4 +32,5 @@ icon Hrvatski icon Norsk icon ไทย + icon Tiếng Việt -- 2.46.1 From 3e7889cee8a9e3c435b897ef2f12f6fc1a9391b4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 13:06:48 +0100 Subject: [PATCH 033/231] :memo: Update README: Translation Progress Table (#1597) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- scripts/ignore_translation.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index 9b88b096..71be4a2a 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -230,6 +230,11 @@ ignore = [ 'language.direction', ] +[vi_VN] +ignore = [ + 'language.direction', +] + [zh_CN] ignore = [ 'language.direction', @@ -239,8 +244,3 @@ ignore = [ ignore = [ 'language.direction', ] - -[vi_VN] -ignore = [ - 'language.direction', -] -- 2.46.1 From 7c5077006d050c34bab7509f88454c80565a2c6e Mon Sep 17 00:00:00 2001 From: an-777 <131597737+an-777@users.noreply.github.com> Date: Fri, 26 Jul 2024 20:19:20 +0800 Subject: [PATCH 034/231] Update messages_zh_TW.properties: Translate English sentence to Traditional Chinese (#1596) * Update messages_zh_TW.properties * fix eof --- src/main/resources/messages_zh_TW.properties | 90 ++++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 65f41fe2..c95659b8 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -9,7 +9,7 @@ multiPdfPrompt=選擇多個 PDF 檔案 multiPdfDropPrompt=選擇(或拖放)所有需要的 PDF 檔案 imgPrompt=選擇圖片 genericSubmit=送出 -processTimeWarning=警告:此過程可能需要長達一分鐘,具體取決於檔案大小 +processTimeWarning=警告:此過程可能長達一分鐘,具體取決於檔案大小 pageOrderPrompt=自訂頁面順序(輸入以逗號分隔的頁碼或函式,如 2n+1): pageSelectionPrompt=自訂頁面選擇(輸入以逗號分隔的頁碼 1、5、6 或 2n+1 等函數的清單): goToPage=前往 @@ -66,7 +66,7 @@ error=錯誤 oops=哎呀! help=幫助 goHomepage=前往首頁 -joinDiscord=加入我們的 Discord 服務器 +joinDiscord=加入我們的 Discord 伺服器 seeDockerHub=查看 Docker Hub visitGithub=訪問 GitHub 存儲庫 donate=捐贈 @@ -108,7 +108,7 @@ pipelineOptions.validateButton=驗證 # NAVBAR # ############# navbar.favorite=我的最愛 -navbar.darkmode=暗黑模式 +navbar.darkmode=深色模式 navbar.language=語言 navbar.settings=設定 navbar.allTools=工具 @@ -125,7 +125,7 @@ navbar.sections.edit=檢視與編輯 ############# settings.title=設定 settings.update=有更新可用 -settings.updateAvailable=當前版本為 {0}。歡迎您更新至最新版 ({1})。。 +settings.updateAvailable=當前版本為 {0}。歡迎你更新至最新版 ({1})。。 settings.appVersion=應用版本: settings.downloadOption.title=選擇下載選項(對於單一檔案非壓縮下載): settings.downloadOption.1=在同一視窗中開啟 @@ -139,8 +139,8 @@ settings.cacheInputs.name=輸入檔案下載 settings.cacheInputs.help=開啟記住先前的輸入,做為日後使用 changeCreds.title=變更憑證 -changeCreds.header=更新您的帳戶詳細資訊 -changeCreds.changePassword=您使用的是預設登錄認證。請輸入新密碼 +changeCreds.header=更新你的帳戶詳細資訊 +changeCreds.changePassword=你使用的是預設登錄認證。請輸入新密碼 changeCreds.newUsername=新使用者名稱 changeCreds.oldPassword=目前密碼 changeCreds.newPassword=新密碼 @@ -161,7 +161,7 @@ account.newPassword=新密碼 account.changePassword=修改密碼 account.confirmNewPassword=確認新密碼 account.signOut=登出 -account.yourApiKey=您的 API 金鑰 +account.yourApiKey=你的 API 金鑰 account.syncTitle=將瀏覽器設定與帳戶同步 account.settingsCompare=設定比較: account.property=屬性 @@ -192,26 +192,26 @@ adminUserSettings.changeUserRole=更改使用者身份 adminUserSettings.authenticated=已驗證 -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=資料庫匯入/匯出 +database.header=資料庫匯入/匯出 +database.fileName=檔案名稱 +database.creationDate=建立日期 +database.fileSize=檔案大小 +database.deleteBackupFile=刪除備份檔案 +database.importBackupFile=匯入備份檔案 +database.downloadBackupFile=下載備份檔案 +database.info_1=在匯入資料時,確保正確的結構是至關重要的。如果你不確定自己在做什麼,請尋求專業人士的建議和支持。結構錯誤可能會導致應用程式故障,甚至完全無法運行。 +database.info_2=上傳時檔案名稱無關緊要。上傳後將重新命名為 backup_user_yyyyMMddHHmm.sql 格式,以確保命名規範一致。 +database.submit=匯入備份 +database.importIntoDatabaseSuccessed=成功匯入資料庫 +database.fileNotFound=檔案未找到 +database.fileNullOrEmpty=檔案不能為空或空白 +database.failedImportFile=匯入檔案失敗 ############# # HOME-PAGE # ############# -home.desc=您的本地主機一站式 PDF 需求解決方案。 +home.desc=你的本地主機一站式 PDF 需求解決方案。 home.searchBar=搜尋功能... @@ -232,7 +232,7 @@ home.split.desc=將 PDF 分割為多個文件 split.tags=頁面操作,劃分,多頁,剪下,伺服器端 home.rotate.title=旋轉 -home.rotate.desc=輕鬆旋轉您的 PDF。 +home.rotate.desc=輕鬆旋轉你的 PDF。 rotate.tags=伺服器端 @@ -254,24 +254,24 @@ home.addImage.desc=在 PDF 的指定位置新增圖片 addImage.tags=img,jpg,圖片,照片 home.watermark.title=新增浮水印 -home.watermark.desc=在您的 PDF 檔案中新增自訂浮水印。 +home.watermark.desc=在你的 PDF 檔案中新增自訂浮水印。 watermark.tags=文字,重複,標籤,自有,版權,商標,img,jpg,圖片,照片 home.permissions.title=修改權限 -home.permissions.desc=修改您的 PDF 檔案權限 +home.permissions.desc=修改你的 PDF 檔案權限 permissions.tags=讀取,寫入,編輯,列印 home.removePages.title=移除 -home.removePages.desc=從您的 PDF 檔案中刪除不需要的頁面。 +home.removePages.desc=從你的 PDF 檔案中刪除不需要的頁面。 removePages.tags=移除頁面,刪除頁面 home.addPassword.title=新增密碼 -home.addPassword.desc=用密碼加密您的 PDF 檔案。 +home.addPassword.desc=用密碼加密你的 PDF 檔案。 addPassword.tags=安全,安全性 home.removePassword.title=移除密碼 -home.removePassword.desc=從您的 PDF 檔案中移除密碼保護。 +home.removePassword.desc=從你的 PDF 檔案中移除密碼保護。 removePassword.tags=安全,解密,安全性,取消密碼,刪除密碼 home.compressPdfs.title=壓縮 @@ -473,7 +473,7 @@ login.header=登入 login.signin=登入 login.rememberme=記住我 login.invalid=使用者名稱或密碼無效。 -login.locked=您的帳戶已被鎖定。 +login.locked=你的帳戶已被鎖定。 login.signinTitle=請登入 login.ssoSignIn=透過織網單一簽入 login.oauth2AutoCreateDisabled=OAuth 2.0 自動建立使用者已停用 @@ -664,15 +664,15 @@ scalePages.submit=送出 #certSign certSign.title=憑證簽章 -certSign.header=使用您的憑證簽章(進行中) +certSign.header=使用你的憑證簽章(進行中) certSign.selectPDF=選擇要簽章的 PDF 檔案: -certSign.jksNote=注意:如果您的證書類型未在下面列出,請使用 keytool 命令行工具將其轉換為 Java Keystore (.jks) 檔。 然後,選擇下面的 .jks 文件選項。 -certSign.selectKey=選擇您的私鑰文件(PKCS#8 格式,可能是 .pem 或 .der): -certSign.selectCert=選擇您的憑證文件(X.509 格式,可能是 .pem 或 .der): -certSign.selectP12=選擇您的 PKCS#12 金鑰庫文件(.p12 或 .pfx)(可選,如果提供,它應包含您的私鑰和憑證): +certSign.jksNote=注意:如果你的證書類型未在下面列出,請使用 keytool 命令行工具將其轉換為 Java Keystore (.jks) 檔。 然後,選擇下面的 .jks 文件選項。 +certSign.selectKey=選擇你的私鑰文件(PKCS#8 格式,可能是 .pem 或 .der): +certSign.selectCert=選擇你的憑證文件(X.509 格式,可能是 .pem 或 .der): +certSign.selectP12=選擇你的 PKCS#12 金鑰庫文件(.p12 或 .pfx)(可選,如果提供,它應包含你的私鑰和憑證): certSign.selectJKS=選擇你的 Java Keystore 檔 (.jks 或 .keystore): certSign.certType=憑證類型 -certSign.password=輸入您的金鑰庫或私鑰密碼(如果有): +certSign.password=輸入你的金鑰庫或私鑰密碼(如果有): certSign.showSig=顯示簽章 certSign.reason=原因 certSign.location=位置 @@ -871,7 +871,7 @@ rotate.submit=旋轉 #split-pdfs split.title=分割 PDF split.header=分割 PDF -split.desc.1=您選擇的數字是您希望進行分割的頁碼 +split.desc.1=你選擇的數字是你希望進行分割的頁碼 split.desc.2=因此,選擇 1,3,7-9 將會將一個 10 頁的文件分割為 6 個單獨的 PDF,包括: split.desc.3=文件 #1:頁面 1 split.desc.4=文件 #2:頁面 2 和 3 @@ -978,7 +978,7 @@ removePassword.submit=移除 #changeMetadata changeMetadata.title=標題: changeMetadata.header=變更中繼資料 -changeMetadata.selectText.1=請編輯您希望變更的變數 +changeMetadata.selectText.1=請編輯你希望變更的變數 changeMetadata.selectText.2=刪除所有中繼資料 changeMetadata.selectText.3=顯示自訂中繼資料: changeMetadata.author=作者: @@ -1103,13 +1103,13 @@ licenses.version=版本 licenses.license=許可證 #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=問卷調查 +survey.title=Stirling-PDF 問卷調查 +survey.description=Stirling-PDF 沒有追蹤功能,所以我們希望聽取用戶的意見來改進 Stirling-PDF! +survey.please=請考慮參加我們的問卷調查! +survey.disabled=(問卷調查彈出窗口將在後續更新中停用,但仍可在頁腳處使用) +survey.button=參加問卷調查 +survey.dontShowAgain=不要再次顯示 #error -- 2.46.1 From c1126e57bd742f2e22635d63501f4fd8d4f4616e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 16:01:23 +0100 Subject: [PATCH 035/231] :memo: Update README: Translation Progress Table (#1598) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f3640e4..7368dc2a 100644 --- a/README.md +++ b/README.md @@ -176,7 +176,7 @@ Stirling PDF currently supports 33! | French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | | Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | | Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) | -| Traditional Chinese (繁體中文) (zh_TW) | ![96%](https://geps.dev/progress/96) | +| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | | Catalan (Català) (ca_CA) | ![48%](https://geps.dev/progress/48) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | | Swedish (Svenska) (sv_SE) | ![39%](https://geps.dev/progress/39) | -- 2.46.1 From 543b96c033301110f17d43f210b9158907d400f5 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 27 Jul 2024 09:37:22 +0200 Subject: [PATCH 036/231] Add: Vietnam to the table (#1600) * Add: Vietnam to the table * Update labeler-config.yml --- .github/labeler-config.yml | 3 ++- README.md | 5 +++-- scripts/ignore_translation.toml | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index da9e5e3f..376ee372 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -1,6 +1,7 @@ Translation: - changed-files: - any-glob-to-any-file: 'src/main/resources/messages_*_*.properties' + - any-glob-to-any-file: 'scripts/ignore_translation.toml' Front End: - changed-files: @@ -45,4 +46,4 @@ Docker: Test: - changed-files: - any-glob-to-any-file: 'cucumber/**/*' - - any-glob-to-any-file: 'test*' \ No newline at end of file + - any-glob-to-any-file: 'test*' diff --git a/README.md b/README.md index 7368dc2a..847c88de 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR ## Supported Languages -Stirling PDF currently supports 33! +Stirling PDF currently supports 34! | Language | Progress | | ------------------------------------------- | -------------------------------------- | @@ -202,6 +202,7 @@ Stirling PDF currently supports 33! | Croatian (Hrvatski) (hr_HR) | ![95%](https://geps.dev/progress/95) | | Norwegian (Norsk) (no_NB) | ![96%](https://geps.dev/progress/96) | | Thai (ไทย) (th_TH) | ![100%](https://geps.dev/progress/100) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![99%](https://geps.dev/progress/99) | ## Contributing (creating issues, translations, fixing bugs, etc.) @@ -213,7 +214,7 @@ Stirling PDF allows easy customization of the app. Includes things like - Custom application name -- Custom slogans, icons, HTML, images CSS etc (via file overrides) +- Custom slogans, icons, HTML, images CSS etc (via file overrides) There are two options for this, either using the generated settings file ``settings.yml`` This file is located in the ``/configs`` directory and follows standard YAML formatting diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index 71be4a2a..aabd537d 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -233,6 +233,9 @@ ignore = [ [vi_VN] ignore = [ 'language.direction', + 'pipeline.title', + 'pipelineOptions.pipelineHeader', + 'showJS.tags', ] [zh_CN] -- 2.46.1 From 47de0f84db18ee8784471250fd7690d5b061a2eb Mon Sep 17 00:00:00 2001 From: DeH40 Date: Sat, 27 Jul 2024 16:11:16 +0800 Subject: [PATCH 037/231] Update messages_zh_CN.properties (#1599) Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- src/main/resources/messages_zh_CN.properties | 30 ++++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index e10b1bee..28af7518 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -192,21 +192,21 @@ adminUserSettings.changeUserRole=更改用户角色 adminUserSettings.authenticated=已验证 -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=数据库 导入/导出 +database.header=数据库 导入/导出 +database.fileName=文件名 +database.creationDate=创建时间 +database.fileSize=文件大小 +database.deleteBackupFile=删除备份文件 +database.importBackupFile=导入备份文件 +database.downloadBackupFile=下载备份文件 +database.info_1=导入数据时,确保结构正确至关重要。如果您不确定自己在做什么,请寻求专业人士的建议和支持。结构错误会导致应用程序故障,甚至完全无法运行应用程序。 +database.info_2=上传文件时,文件名并不重要。上传后,文件名将重命名为 backup_user_yyyyMMddHHmm.sql,以确保命名规范的一致性。 +database.submit=导入备份 +database.importIntoDatabaseSuccessed=导入数据库成功 +database.fileNotFound=未找到文件 +database.fileNullOrEmpty=文件不能为空 +database.failedImportFile=导入文件失败 ############# # HOME-PAGE # -- 2.46.1 From c899f605a9205f8845d9caa818c53a0d451a1a62 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 27 Jul 2024 09:11:41 +0100 Subject: [PATCH 038/231] :memo: Update README: Translation Progress Table (#1601) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 847c88de..c95b8b83 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,7 @@ Stirling PDF currently supports 34! | German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | | Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | -| Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) | +| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | | Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | | Catalan (Català) (ca_CA) | ![48%](https://geps.dev/progress/48) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -- 2.46.1 From 065f53e5771e8f70bf836143c47eb3f944570314 Mon Sep 17 00:00:00 2001 From: Ludy Date: Wed, 31 Jul 2024 19:49:52 +0200 Subject: [PATCH 039/231] Optimize Editor and Git Ignore Settings for Improved Consistency and Security (#1611) --- .github/labels.yml | 4 +++- .gitignore | 47 ++++++++++++++++++++++++++++++++------ .vscode/settings.json | 53 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.github/labels.yml b/.github/labels.yml index c7f23973..1d717e6f 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -88,4 +88,6 @@ description: "API-related issues or pull requests" - name: "Test" color: "FF9E1F" - description: "Testing-related issues or pull requests" \ No newline at end of file + description: "Testing-related issues or pull requests" +- name: "Stale" + color: "000000" diff --git a/.gitignore b/.gitignore index 1a241d6f..ba9d755d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ - - ### Eclipse ### .metadata bin/ @@ -22,7 +20,6 @@ customFiles/ configs/ watchedFolders/ - # Gradle .gradle .lock @@ -119,12 +116,48 @@ watchedFolders/ *.db /build -/.vscode -/.idea +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*.pyo + +# Virtual environments +.env* +.venv* +env*/ +venv*/ +ENV/ +env.bak/ +venv.bak/ + +# VS Code +/.vscode/**/* +!/.vscode/settings.json + +# IntelliJ IDEA +.idea/ +*.iml +out/ # Ignore Mac DS_Store files .DS_Store **/.DS_Store -#cucumber -/cucumber/reports/** \ No newline at end of file +# cucumber +/cucumber/reports/** + +# Certs +*.p12 +*.pem +*.crt +*.cer +*.der +*.key +*.csr + +# cache +.ruff_cache +.mypy_cache +.pytest_cache +.ipynb_checkpoints + diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..b0d31dae --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,53 @@ +{ + "java.compile.nullAnalysis.mode": "automatic", + "files.eol": "auto", + "java.configuration.updateBuildConfiguration": "interactive", + "black-formatter.args": ["--line-length", "127"], + "flake8.args": ["--max-line-length", "127"], + "pylint.args": ["max-line-length", "127"], + "[java]": { + "editor.tabSize": 4, + "editor.detectIndentation": false, + "editor.rulers": [127] + }, + "[python]": { + "editor.tabSize": 2, + "editor.detectIndentation": false, + "editor.rulers": [127] + }, + "[gradle-build]": { + "editor.tabSize": 4, + "editor.detectIndentation": false, + "editor.rulers": [127] + }, + "[gradle]": { + "editor.tabSize": 4, + "editor.detectIndentation": false, + "editor.rulers": [127] + }, + "[html]": { + "editor.tabSize": 2, + "editor.rulers": [127], + "files.trimFinalNewlines": false, + "files.insertFinalNewline": false + }, + "[javascript]": { + "editor.tabSize": 2, + "editor.rulers": [127] + }, + "[yaml]": { + "files.trimFinalNewlines": false, + "files.insertFinalNewline": false + }, + "diffEditor.maxComputationTime": 0, + "editor.wordSegmenterLocales": null, + "editor.guides.bracketPairs": "active", + "editor.guides.bracketPairsHorizontal": "active", + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "editor.indentSize": "tabSize", + "editor.stickyScroll.enabled": false, + "editor.minimap.enabled": false, + "editor.formatOnSave": true +} -- 2.46.1 From 0dfb4d77c059f8f994c471352cd27426462c8b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Wed, 31 Jul 2024 19:17:01 +0100 Subject: [PATCH 040/231] Added Irish Language (#1607) Adding Irish Language --- scripts/ignore_translation.toml | 6 + src/main/resources/messages_ga_IE.properties | 1126 +++++++++++++++++ src/main/resources/static/images/flags/ie.svg | 7 + .../templates/fragments/languages.html | 1 + 4 files changed, 1140 insertions(+) create mode 100644 src/main/resources/messages_ga_IE.properties create mode 100644 src/main/resources/static/images/flags/ie.svg diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index aabd537d..06a1addb 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -43,6 +43,12 @@ ignore = [ 'watermark.type.1', ] + +[ga_IE] +ignore = [ + 'language.direction', +] + [el_GR] ignore = [ 'language.direction', diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties new file mode 100644 index 00000000..08993244 --- /dev/null +++ b/src/main/resources/messages_ga_IE.properties @@ -0,0 +1,1126 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr = left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=Roghnaigh PDF(s) +multiPdfPrompt=Roghnaigh PDFs (2+) +multiPdfDropPrompt=Roghnaigh (nó tarraing & scaoil) gach PDF atá uait +imgPrompt=Roghnaigh Íomhá(í) +genericSubmit=Cuir isteach +processTimeWarning=Rabhadh: Féadfaidh an próiseas seo suas le nóiméad a ghlacadh ag brath ar mhéid an chomhaid +pageOrderPrompt=Ordú Leathanach Saincheaptha (Iontráil liosta uimhreacha leathanaigh nó Feidhmeanna ar nós 2n+1 le camóga deighilte): +pageSelectionPrompt=Roghnú Leathanach Saincheaptha (Iontráil liosta leathanach scartha le camóg d'uimhreacha 1,5,6 nó Feidhmeanna ar nós 2n+1): +goToPage=Téigh +true=Fíor +false=Bréagach +unknown=Anaithnid +save=Sábháil +saveToBrowser=Sábháil go Brabhsálaí +close=Dún +filesSelected=comhaid roghnaithe +noFavourites=Níor cuireadh aon cheanáin leis +downloadComplete=Íosluchtaigh Críochnaithe +bored=Leamh Ag Feitheamh? +alphabet=Aibítir +downloadPdf=Íoslódáil PDF +text=Téacs +font=Cló +selectFillter=-- Roghnaigh -- +pageNum=Uimhir an Leathanaigh +sizes.small=Beaga +sizes.medium=Mheán +sizes.large=Mór +sizes.x-large=X-Mór +error.pdfPassword=Tá pasfhocal ar an Doiciméad PDF agus níor soláthraíodh an pasfhocal nó bhí sé mícheart +delete=Scrios +username=Ainm úsáideora +password=Pasfhocal +welcome=Fáilte +property=Maoin +black=Dubh +white=Bán +red=Dearg +green=Glas +blue=Gorm +custom=Saincheaptha... +WorkInProgess=Obair idir lámha, B’fhéidir nach n-oibreoidh sí nó nach mbeidh bugaí ann, Tuairiscigh aon fhadhbanna le do thoil! +poweredBy=Cumhachtaithe ag +yes=Tá +no=Níl +changedCredsMessage=Dintiúir athraithe! +notAuthenticatedMessage=Úsáideoir gan fíordheimhniú. +userNotFoundMessage=Úsáideoir gan aimsiú. +incorrectPasswordMessage=Tá an pasfhocal reatha mícheart. +usernameExistsMessage=Tá Ainm Úsáideora Nua ann cheana féin. +invalidUsernameMessage=Ainm úsáideora neamhbhailí, ní féidir ach litreacha, uimhreacha agus na carachtair speisialta seo a leanas @._+- a bheith san ainm úsáideora nó ní mór gur seoladh ríomhphoist bailí é. +confirmPasswordErrorMessage=Ní mór Pasfhocal Nua agus Deimhnigh Pasfhocal Nua a bheith ag teacht leis. +deleteCurrentUserMessage=Ní féidir an t-úsáideoir atá logáilte isteach faoi láthair a scriosadh. +deleteUsernameExistsMessage=Níl an t-ainm úsáideora ann agus ní féidir é a scriosadh. +downgradeCurrentUserMessage=Ní féidir ról an úsáideora reatha a íosghrádú +downgradeCurrentUserLongMessage=Ní féidir ról an úsáideora reatha a íosghrádú. Mar sin, ní thaispeánfar an t-úsáideoir reatha. +userAlreadyExistsOAuthMessage=Tá an t-úsáideoir ann cheana mar úsáideoir OAuth2. +userAlreadyExistsWebMessage=Tá an t-úsáideoir ann cheana féin mar úsáideoir gréasáin. +error=Earráid +oops=Úps! +help=Cabhrú +goHomepage=Téigh go Leathanach Baile +joinDiscord=Cláraigh lenár bhfreastalaí Discord +seeDockerHub=Féach Docker Hub +visitGithub=Tabhair cuairt ar Github Stór +donate=Síntiúis +color=Dath +sponsor=Urraitheoir +info=Eolas + + + +############### +# Pipeline # +############### +pipeline.header=Roghchlár Píblíne (Beta) +pipeline.uploadButton=Uaslódáil Saincheaptha +pipeline.configureButton=Cumraigh +pipeline.defaultOption=Saincheaptha +pipeline.submitButton=Cuir isteach +pipeline.help=Cabhair Píblíne +pipeline.scanHelp=Cabhair Scanadh Fillteán +pipeline.deletePrompt=An bhfuil tú cinnte gur mhaith leat píblíne a scriosadh + +###################### +# Pipeline Options # +###################### +pipelineOptions.header=Cumraíocht Píblíne +pipelineOptions.pipelineNameLabel=Ainm Píblíne +pipelineOptions.saveSettings=Sábháil Socruithe Oibriúcháin +pipelineOptions.pipelineNamePrompt=Cuir isteach ainm na píblíne anseo +pipelineOptions.selectOperation=Roghnaigh Oibríocht +pipelineOptions.addOperationButton=Cuir oibríocht leis +pipelineOptions.pipelineHeader=Píblíne: +pipelineOptions.saveButton=Íosluchtaigh +pipelineOptions.validateButton=Bailíochtaigh + + + + +############# +# NAVBAR # +############# +navbar.favorite=Ceanáin +navbar.darkmode=Mód Dorcha +navbar.language=Teangacha +navbar.settings=Socruithe +navbar.allTools=Uirlisí +navbar.multiTool=Uirlisí Il +navbar.sections.organize=Eagraigh +navbar.sections.convertTo=Tiontaigh go PDF +navbar.sections.convertFrom=Tiontaigh ó PDF +navbar.sections.security=Comhartha & Slándáil +navbar.sections.advance=Casta +navbar.sections.edit=Féach ar & Cuir in Eagar + +############# +# SETTINGS # +############# +settings.title=Socruithe +settings.update=Nuashonrú ar fáil +settings.updateAvailable=Is é {0} an leagan suiteáilte reatha. Tá leagan nua ({1}) ar fáil. +settings.appVersion=Leagan Aipe: +settings.downloadOption.title=Roghnaigh rogha íoslódála (Le haghaidh íoslódálacha comhad amháin seachas zip): +settings.downloadOption.1=Oscail sa bhfuinneog chéanna +settings.downloadOption.2=Oscail i bhfuinneog nua +settings.downloadOption.3=Íoslódáil an comhad +settings.zipThreshold=Comhaid zip nuair a sháraíonn líon na gcomhad íoslódála +settings.signOut=Logáil Amach +settings.accountSettings=Socruithe cuntas +settings.bored.help=Cumasaíonn sé cluiche uibheacha Cásca +settings.cacheInputs.name=Sábháil ionchuir fhoirm +settings.cacheInputs.help=Cumasaigh ionchuir a úsáideadh roimhe seo a stóráil le haghaidh ritheanna amach anseo + +changeCreds.title=Athraigh Dintiúir +changeCreds.header=Nuashonraigh Sonraí do Chuntais +changeCreds.changePassword=Tá dintiúir réamhshocraithe logáil isteach á úsáid agat. Cuir isteach pasfhocal nua le do thoil +changeCreds.newUsername=Ainm Úsáideora Nua +changeCreds.oldPassword=Pasfhocal reatha +changeCreds.newPassword=Focal Faire Nua +changeCreds.confirmNewPassword=Deimhnigh Pasfhocal Nua +changeCreds.submit=Cuir Athruithe isteach + + + +account.title=Socruithe cuntas +account.accountSettings=Socruithe cuntas +account.adminSettings=Socruithe Riaracháin - Féach ar agus Cuir Úsáideoirí Leis +account.userControlSettings=Socruithe Rialaithe Úsáideora +account.changeUsername=Athraigh Ainm Úsáideora +account.newUsername=Ainm Úsáideora Nua +account.password=Pasfhocal Deimhnithe +account.oldPassword=Sean Pasfhocal +account.newPassword=Focal Faire Nua +account.changePassword=Athraigh do phasfhocal +account.confirmNewPassword=Deimhnigh Pasfhocal Nua +account.signOut=Logáil Amach +account.yourApiKey=D'Eochair API +account.syncTitle=Sioncronaigh socruithe brabhsálaí leis an gCuntas +account.settingsCompare=Comparáid Socruithe: +account.property=Maoin +account.webBrowserSettings=Socrú Brabhsálaí Gréasáin +account.syncToBrowser=Cuntas Sync -> Brabhsálaí +account.syncToAccount=Cuntas Sioncronaigh <- Brabhsálaí + + +adminUserSettings.title=Socruithe Rialaithe Úsáideora +adminUserSettings.header=Socruithe Rialaithe Úsáideoir Riaracháin +adminUserSettings.admin=Riarachán +adminUserSettings.user=Úsáideoir +adminUserSettings.addUser=Cuir Úsáideoir Nua leis +adminUserSettings.deleteUser=Scrios Úsáideoir +adminUserSettings.confirmDeleteUser=Ar cheart an t-úsáideoir a scriosadh? +adminUserSettings.usernameInfo=Ní féidir ach litreacha, uimhreacha agus na carachtair speisialta seo a leanas @._+- a bheith san ainm úsáideora nó ní mór gur seoladh ríomhphoist bailí é. +adminUserSettings.roles=Róil +adminUserSettings.role=Ról +adminUserSettings.actions=Gníomhartha +adminUserSettings.apiUser=Úsáideoir API Teoranta +adminUserSettings.extraApiUser=Úsáideoir API Teoranta breise +adminUserSettings.webOnlyUser=Úsáideoir Gréasáin Amháin +adminUserSettings.demoUser=Úsáideoir Taispeána (Gan socruithe saincheaptha) +adminUserSettings.internalApiUser=Úsáideoir API Inmheánach +adminUserSettings.forceChange=Cuir iallach ar an úsáideoir pasfhocal a athrú ar logáil isteach +adminUserSettings.submit=Sábháil Úsáideoir +adminUserSettings.changeUserRole=Athraigh Ról an Úsáideora +adminUserSettings.authenticated=Fíordheimhnithe + + +database.title=Iompórtáil / Easpórtáil Bunachar Sonraí +database.header=Iompórtáil / Easpórtáil Bunachar Sonraí +database.fileName=Ainm comhaid +database.creationDate=Dáta Cruthaithe +database.fileSize=Méid an Chomhaid +database.deleteBackupFile=Scrios Comhad Cúltaca +database.importBackupFile=Iompórtáil Comhad Cúltaca +database.downloadBackupFile=Íoslódáil an comhad cúltaca +database.info_1=Agus sonraí á n-allmhairiú, tá sé ríthábhachtach an struchtúr ceart a chinntiú. Mura bhfuil tú cinnte faoina bhfuil ar siúl agat, iarr comhairle agus tacaíocht ó ghairmí. Féadfaidh earráid sa struchtúr a bheith ina chúis le mífheidhmeanna iarratais, suas go dtí agus lena n-áirítear an neamhábaltacht iomlán an t-iarratas a rith. +database.info_2=Ní hionann ainm an chomhaid agus é á uaslódáil. Déanfar é a athainmniú ina dhiaidh sin chun an fhormáid backup_user_yyyyMMddHHmm.sql a leanúint, ag cinntiú go bhfuil coinbhinsiún ainmniúcháin comhsheasmhach ann. +database.submit=Iompórtáil Cúltaca +database.importIntoDatabaseSuccessed=D'éirigh leis an allmhairiú isteach sa bhunachar sonraí +database.fileNotFound=Comhad gan aimsiú +database.fileNullOrEmpty=Níor cheart go mbeadh an comhad ar neamhní nó folamh +database.failedImportFile=Theip ar iompórtáil an chomhaid + +############# +# HOME-PAGE # +############# +home.desc=Do shiopa ilfhreastail arna óstáil go háitiúil do do riachtanais PDF go léir. +home.searchBar=Cuardaigh gnéithe... + + +home.viewPdf.title=Féach PDF +home.viewPdf.desc=Féach ar, nótáil, cuir téacs nó íomhánna leis +viewPdf.tags=amharc, léamh, anótáil, téacs, íomhá + +home.multiTool.title=Il-uirlis PDF +home.multiTool.desc=Cumaisc, Rothlaigh, Atheagraigh, agus Bain leathanaigh +multiTool.tags=Il-Uirlis, Iloibríocht, Chomhéadain, cliceáil tarraing, ceann tosaigh, taobh an chliaint, idirghníomhach, intractable, bog + +home.merge.title=Cumaisc +home.merge.desc=Go héasca chumasadh go leor PDFanna isteach i gceann amháin. +merge.tags=chumasadh,Oibríochtaí Leathanaigh,Cúl-deireadh,taobh freastalaí + +home.split.title=Scoilt +home.split.desc=Scoilt comhaid PDF isteach i ndoiciméid iolracha +split.tags=Oibríochtaí leathanach, roinnt, Leathanach Il, gearrtha, taobh freastalaí + +home.rotate.title=Rothlaigh +home.rotate.desc=Rothlaigh do PDFs go héasca. +rotate.tags=taobh freastalaí + + +home.imageToPdf.title=Íomhá go PDF +home.imageToPdf.desc=Tiontaigh íomhá (PNG, JPEG, GIF) go PDF. +imageToPdf.tags=comhshó, img, jpg, pictiúr, grianghraf + +home.pdfToImage.title=PDF go íomhá +home.pdfToImage.desc=Tiontaigh PDF a íomhá. (PNG, JPEG, GIF) +pdfToImage.tags=comhshó, img, jpg, pictiúr, grianghraf + +home.pdfOrganiser.title=Eagraigh +home.pdfOrganiser.desc=Bain/Atheagraigh na leathanaigh in ord ar bith +pdfOrganiser.tags=déphléacsacha, cothrom, corr, sórtáil, bogadh + + +home.addImage.title=Cuir íomhá leis +home.addImage.desc=Cuireann sé íomhá ar shuíomh socraithe ar an PDF +addImage.tags=img, jpg, pictiúr, grianghraf + +home.watermark.title=Cuir Uisce leis +home.watermark.desc=Cuir comhartha uisce saincheaptha le do dhoiciméad PDF. +watermark.tags=Téacs, athrá, lipéad, úinéireacht, cóipcheart, trádmharc, img, jpg, pictiúr, grianghraf + +home.permissions.title=Athrú Ceadanna +home.permissions.desc=Athraigh ceadanna do dhoiciméad PDF +permissions.tags=léamh, scríobh, cuir in eagar, priontáil + + +home.removePages.title=Bain +home.removePages.desc=Scrios leathanaigh nach dteastaíonn ó do dhoiciméad PDF. +removePages.tags=Bain leathanaigh, scrios leathanaigh + +home.addPassword.title=Cuir Pasfhocal leis +home.addPassword.desc=Criptigh do dhoiciméad PDF le focal faire. +addPassword.tags=slán, slándáil + +home.removePassword.title=Bain Pasfhocal +home.removePassword.desc=Bain cosaint phasfhocal ó do dhoiciméad PDF. +removePassword.tags=slán, Díchriptiú, slándáil, Unpassword, scrios pasfhocal + +home.compressPdfs.title=Comhbhrúigh +home.compressPdfs.desc=Comhbhrúigh PDFanna chun a méid comhaid a laghdú. +compressPdfs.tags=squish, beag, beag bídeach + + +home.changeMetadata.title=Athraigh Meiteashonraí +home.changeMetadata.desc=Athraigh/Bain/Cuir meiteashonraí ó dhoiciméad PDF +changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats + +home.fileToPDF.title=Comhad a thiontú go PDF +home.fileToPDF.desc=Tiontaigh beagnach aon chomhad go PDF (DOCX, PNG, XLS, PPT, TXT agus go leor eile) +fileToPDF.tags=claochlú, formáid, doiciméad, pictiúr, sleamhnán, téacs, comhshó, oifig, docs, focal, excel, powerpoint + +home.ocr.title=Scananna OCR / Glanta +home.ocr.desc=Scanann glantachán agus aimsíonn sé téacs ó íomhánna laistigh de PDF agus cuireann sé isteach arís é mar théacs. +ocr.tags=aithint, téacs, íomhá, scanadh, léamh, a aithint, a bhrath, in eagar + + +home.extractImages.title=Sliocht Íomhánna +home.extractImages.desc=Sliochtann sé gach íomhá ó PDF agus sábhálann sé iad a zip +extractImages.tags=pictiúr, grianghraf, shábháil, cartlann, zip, gabháil, grab + +home.pdfToPDFA.title=PDF go PDF/A +home.pdfToPDFA.desc=Tiontaigh PDF go PDF/A le haghaidh stórála fadtéarmach +pdfToPDFA.tags=cartlann, fadtéarmach, caighdeánach, comhshó, stóráil, caomhnú + +home.PDFToWord.title=PDF a thiontú go Word +home.PDFToWord.desc=Tiontaigh PDF go formáidí Word (DOC, DOCX agus ODT) +PDFToWord.tags=doc, docx, odt, focal, claochlú, formáid, comhshó, oifig, microsoft, docfile + +home.PDFToPresentation.title=PDF a chur i láthair +home.PDFToPresentation.desc=Tiontaigh PDF go formáidí Léirithe (PPT, PPTX agus ODP) +PDFToPresentation.tags=sleamhnáin, seó, oifig, microsoft + +home.PDFToText.title=PDF go RTF (Téacs) +home.PDFToText.desc=Tiontaigh PDF go Téacs nó formáid RTF +PDFToText.tags=richformat, richtextformat, formáid téacs saibhir + +home.PDFToHTML.title=PDF go HTML +home.PDFToHTML.desc=Tiontaigh HTML i bhformáid PDF +PDFToHTML.tags=ábhar gréasáin, cairdiúil don bhrabhsálaí + + +home.PDFToXML.title=PDF go XML +home.PDFToXML.desc=Tiontaigh PDF i bhformáid XML +PDFToXML.tags=asbhaint sonraí, ábhar struchtúrtha, idirghabhála, claochlú, thiontú + +home.ScannerImageSplit.title=Braith / Scoilt grianghraif Scanta +home.ScannerImageSplit.desc=Scoilteann sé grianghraif iolracha ó laistigh de ghrianghraf/PDF +ScannerImageSplit.tags=ar leithligh, a bhrath go huathoibríoch, scanadh, il-grianghraf, eagrú + +home.sign.title=Comhartha +home.sign.desc=Cuireann síniú le PDF trí líníocht, téacs nó íomhá +sign.tags=údarú, tosaigh, síniú tarraingthe, comhartha téacs, íomhá-shíniú + +home.flatten.title=Comhcheangail +home.flatten.desc=Bain gach eilimint agus foirm idirghníomhach as PDF +flatten.tags=statach, díghníomhachtú, neamh-idirghníomhach, sruthlíniú + +home.repair.title=Deisiúchán +home.repair.desc=Déanann sé iarracht PDF truaillithe/briste a dheisiú +repair.tags=deisiú, athchóiriú, ceartú, aisghabháil + +home.removeBlanks.title=Bain leathanaigh Bhána +home.removeBlanks.desc=Aimsíonn agus baintear leathanaigh bhána de dhoiciméad +removeBlanks.tags=glanta, sruthlíniú, neamhábhar, eagrú + +home.removeAnnotations.title=Bain Anótálacha +home.removeAnnotations.desc=Baintear gach trácht/nóta de PDF +removeAnnotations.tags=tuairimí, aibhsiú, nótaí, marcáil, bain + +home.compare.title=Déan comparáid idir +home.compare.desc=Déanann sé na difríochtaí idir 2 Dhoiciméad PDF a chur i gcomparáid agus a thaispeáint +compare.tags=idirdhealú, codarsnacht, athruithe, anailís + +home.certSign.title=Sínigh le Deimhniú +home.certSign.desc=Síníonn sé PDF le Deimhniú/Eochair (PEM/P12) +certSign.tags=fíordheimhnigh, PEM, P12, oifigiúil, criptigh + +home.removeCertSign.title=Bain Comhartha Teastais +home.removeCertSign.desc=Bain síniú teastas ó PDF +removeCertSign.tags=fíordheimhnigh, PEM, P12, oifigiúil, dhíchriptiú + +home.pageLayout.title=Leagan Amach Illeathanaigh +home.pageLayout.desc=Cumaisc leathanaigh iolracha de dhoiciméad PDF isteach i leathanach amháin +pageLayout.tags=chumasc, ilchodach, aon-amharc, a eagrú + +home.scalePages.title=Coigeartaigh méid/scála an leathanaigh +home.scalePages.desc=Athraigh méid/scála leathanaigh agus/nó a bhfuil ann. +scalePages.tags=athraigh, modhnaigh, toise, cuir in oiriúint + +home.pipeline.title=Píblíne (Ardleibhéal) +home.pipeline.desc=Rith gníomhartha iolracha ar PDFanna trí scripteanna píblíne a shainiú +pipeline.tags=uathoibriú, seicheamh, scriptithe, baisc-phróiseas + +home.add-page-numbers.title=Cuir Uimhreacha Leathanaigh leis +home.add-page-numbers.desc=Cuir uimhreacha Leathanach leis an doiciméad i suíomh socraithe +add-page-numbers.tags=leathanach, lipéad, eagraigh, innéacs + +home.auto-rename.title=Comhad PDF a athainmniú go huathoibríoch +home.auto-rename.desc=Athainmníonn Auto comhad PDF bunaithe ar a cheanntásc braite +auto-rename.tags=auto-bhrath, ceanntásc-bhunaithe, a eagrú, a athlipéadú + +home.adjust-contrast.title=Coigeartaigh Dathanna/Codarsnacht +home.adjust-contrast.desc=Coigeartaigh Codarsnacht, Sáithiú agus Gile PDF +adjust-contrast.tags=dath-cheartú, tune, a mhodhnú, a fheabhsú + +home.crop.title=PDF a ghearradh +home.crop.desc=Bearr PDF chun a mhéid a laghdú (coimeádann an téacs!) +crop.tags=Baile Átha Troim, Laghdaigh, Cuir in eagar, Cruth + +home.autoSplitPDF.title=Leathanaigh Scoilte Uathoibríoch +home.autoSplitPDF.desc=Auto Scoilt PDF Scanta le Cód QR scoilteoir leathanach scanadh fisiciúil +autoSplitPDF.tags=QR-bhunaithe, ar leith, scanadh-deighleog, eagrú + +home.sanitizePdf.title=Sláintíocht +home.sanitizePdf.desc=Bain scripteanna agus gnéithe eile ó chomhaid PDF +sanitizePdf.tags=glan, slán, sábháilte, bain bagairtí + +home.URLToPDF.title=URL / Láithreán Gréasáin go PDF +home.URLToPDF.desc=Tiontaíonn aon http(s) URL go PDF +URLToPDF.tags=gréasán a ghabháil, a shábháil-leathanach, gréasán-go-doc, cartlann + +home.HTMLToPDF.title=HTML go PDF +home.HTMLToPDF.desc=Tiontaíonn aon chomhad HTML nó zip go PDF +HTMLToPDF.tags=marcáil, ábhar gréasáin, claochlú, tiontú + + +home.MarkdownToPDF.title=Marcáil síos go PDF +home.MarkdownToPDF.desc=Tiontaíonn aon chomhad Markdown go PDF +MarkdownToPDF.tags=marcáil, ábhar gréasáin, claochlú, tiontú + + +home.getPdfInfo.title=Faigh GACH Eolas ar PDF +home.getPdfInfo.desc=Grab aon fhaisnéis agus is féidir ar PDFs +getPdfInfo.tags=faisnéis, sonraí, staitisticí, staitisticí + + +home.extractPage.title=Sliocht leathanach(eacha) +home.extractPage.desc=Sleachta roghnaigh leathanaigh ó PDF +extractPage.tags=sliocht + + +home.PdfToSinglePage.title=PDF go leathanach mór amháin +home.PdfToSinglePage.desc=Cumasc gach leathanach PDF isteach i leathanach mór amháin +PdfToSinglePage.tags=leathanach amháin + + +home.showJS.title=Taispeáin Javascript +home.showJS.desc=Déanann sé cuardach agus taispeáint ar aon JS a instealladh isteach i PDF +showJS.tags=JS + +home.autoRedact.title=Auto Redact +home.autoRedact.desc=Auto Redacts (Blacks out) téacs i PDF bunaithe ar an téacs ionchuir +autoRedact.tags=Dearg, Folaigh, dubh amach, dubh, marcóir, i bhfolach + +home.tableExtraxt.title=Ó CSV go PDF +home.tableExtraxt.desc=Sleachta Táblaí ó PDF agus é a thiontú go CSV +tableExtraxt.tags=CSV, Eastóscadh Tábla, sliocht, tiontú + + +home.autoSizeSplitPDF.title=Auto Scoilte de réir Méid/Comhaireamh +home.autoSizeSplitPDF.desc=Scoilt PDF amháin i ndoiciméid iolracha bunaithe ar mhéid, líon na leathanach, nó comhaireamh doiciméad +autoSizeSplitPDF.tags=pdf, scoilt, doiciméad, eagraíocht + + +home.overlay-pdfs.title=Forleagan PDF +home.overlay-pdfs.desc=Forleagain PDF ar bharr PDF eile +overlay-pdfs.tags=Forleagan + +home.split-by-sections.title=Scoilt PDF de réir ailt +home.split-by-sections.desc=Roinn gach leathanach de PDF i gcodanna cothrománacha agus ingearacha níos lú +split-by-sections.tags=Roinn Scoilt, Roinn, Saincheap + +home.AddStampRequest.title=Cuir Stampa go PDF +home.AddStampRequest.desc=Cuir téacs leis nó cuir stampaí íomhá leis ag láithreacha socraithe +AddStampRequest.tags=Stampa, Cuir íomhá, íomhá lár, Uisce, PDF, Leabú, Saincheap + + +home.PDFToBook.title=PDF go Leabhar +home.PDFToBook.desc=Tiontaíonn sé PDF go formáidí Leabhar/Comic ag baint úsáide as calibre +PDFToBook.tags=Leabhar, Comic, Calibre, Tiontaigh, manga, amazon, kindle, epub, mobi, azw3, docx, rtf, txt, html, lit, fb2, pdb, lrf + +home.BookToPDF.title=Leabhar a thiontú go PDF +home.BookToPDF.desc=Tiontaíonn sé formáidí Leabhair/Comics go PDF ag baint úsáide as calibre +BookToPDF.tags=Leabhar, Comic, Calibre, Tiontaigh, manga, amazon, kindle, epub, mobi, azw3, docx, rtf, txt, html, lit, fb2, pdb, lrf + + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=Sínigh isteach +login.header=Sínigh isteach +login.signin=Sínigh isteach +login.rememberme=Cuimhnigh orm +login.invalid=Ainm úsáideora nó pasfhocal neamhbhailí. +login.locked=Tá do chuntas glasáilte. +login.signinTitle=Sínigh isteach le do thoil +login.ssoSignIn=Logáil isteach trí Chlárú Aonair +login.oauth2AutoCreateDisabled=OAUTH2 Uath-Chruthaigh Úsáideoir faoi Mhíchumas +login.oauth2RequestNotFound=Níor aimsíodh iarratas údaraithe +login.oauth2InvalidUserInfoResponse=Freagra Neamhbhailí Faisnéise Úsáideora +login.oauth2invalidRequest=Iarratas Neamhbhailí +login.oauth2AccessDenied=Rochtain Diúltaithe +login.oauth2InvalidTokenResponse=Freagra Comhartha Neamhbhailí +login.oauth2InvalidIdToken=Comhartha Aitheantais Neamhbhailí + + +#auto-redact +autoRedact.title=Auto Redact +autoRedact.header=Auto Redact +autoRedact.colorLabel=Dath +autoRedact.textsToRedactLabel=Téacs go Deighilt (línescartha) +autoRedact.textsToRedactPlaceholder=e.g. \nRúnda \nTrí-rúnda +autoRedact.useRegexLabel=Bain úsáid as Regex +autoRedact.wholeWordSearchLabel=Cuardach Focal Iomlán +autoRedact.customPaddingLabel=Stuáil Breise Saincheaptha +autoRedact.convertPDFToImageLabel=Tiontaigh PDF go PDF-Image (Úsáidte chun téacs a bhaint taobh thiar den bhosca) +autoRedact.submitButton=Cuir isteach + + +#showJS +showJS.title=Taispeáin Javascript +showJS.header=Taispeáin Javascript +showJS.downloadJS=Íosluchtaigh leabhar javascript +showJS.submit=Taispeáin + + +#pdfToSinglePage +pdfToSinglePage.title=PDF go leathanach amháin +pdfToSinglePage.header=PDF go leathanach amháin +pdfToSinglePage.submit=Tiontaigh go Leathanach Aonair + + +#pageExtracter +pageExtracter.title=Leathanaigh Sliocht +pageExtracter.header=Leathanaigh Sliocht +pageExtracter.submit=Sliocht +pageExtracter.placeholder=(m.sh. 1,2,8 nó 4,7,12-16 nó 2n-1) + + +#getPdfInfo +getPdfInfo.title=Faigh eolas ar PDF +getPdfInfo.header=Faigh eolas ar PDF +getPdfInfo.submit=Faigh Eolas +getPdfInfo.downloadJson=Íosluchtaigh ceol JSON + + +#markdown-to-pdf +MarkdownToPDF.title=Marcáil síos go PDF +MarkdownToPDF.header=Marcáil síos go PDF +MarkdownToPDF.submit=Tiontaigh +MarkdownToPDF.help=Obair idir lámha +MarkdownToPDF.credit=Úsáideann WeasyPrint + + + +#url-to-pdf +URLToPDF.title=URL go PDF +URLToPDF.header=URL go PDF +URLToPDF.submit=Tiontaigh +URLToPDF.credit=Úsáideann WeasyPrint + + +#html-to-pdf +HTMLToPDF.title=HTML go PDF +HTMLToPDF.header=HTML go PDF +HTMLToPDF.help=Glacann sé le comhaid HTML agus ZIPs ina bhfuil html/css/íomhánna srl riachtanach +HTMLToPDF.submit=Tiontaigh +HTMLToPDF.credit=Úsáideann WeasyPrint +HTMLToPDF.zoom=Leibhéal súmáil chun an suíomh Gréasáin a thaispeáint. +HTMLToPDF.pageWidth=Leithead an leathanaigh i ceintiméadar. (Bán go réamhshocrú) +HTMLToPDF.pageHeight=Airde an leathanaigh i ceintiméadar. (Bán go réamhshocrú) +HTMLToPDF.marginTop=Imeall barr an leathanaigh i milliméadair. (Bán go réamhshocrú) +HTMLToPDF.marginBottom=Imeall bun an leathanaigh i milliméadair. (Bán go réamhshocrú) +HTMLToPDF.marginLeft=Imeall clé an leathanaigh i milliméadair. (Bán go réamhshocrú) +HTMLToPDF.marginRight=Imeall ceart an leathanaigh i milliméadair. (Bán go réamhshocrú) +HTMLToPDF.printBackground=Íosluchtaigh cúlra do láithreáin ghréasáin. +HTMLToPDF.defaultHeader=Cumasaigh Ceanntásc Réamhshocraithe (Ainm agus uimhir an leathanaigh) +HTMLToPDF.cssMediaType=Athraigh cineál meáin CSS an leathanaigh. +HTMLToPDF.none=Dada +HTMLToPDF.print=Priontáil +HTMLToPDF.screen=Scáileán + + +#AddStampRequest +AddStampRequest.header=Stampa PDF +AddStampRequest.title=Stampa PDF +AddStampRequest.stampType=Cineál Stampa +AddStampRequest.stampText=Téacs Stampa +AddStampRequest.stampImage=Íomhá Stampa +AddStampRequest.alphabet=Aibítir +AddStampRequest.fontSize=Cló/Méid na hÍomhá +AddStampRequest.rotation=Rothlú +AddStampRequest.opacity=Teimhneacht +AddStampRequest.position=Post +AddStampRequest.overrideX=Sáraigh X Comhordanáid +AddStampRequest.overrideY=Sáraigh Y Comhordanáid +AddStampRequest.customMargin=Imeall an Chustaim +AddStampRequest.customColor=Dath Téacs Saincheaptha +AddStampRequest.submit=Cuir isteach + + +#sanitizePDF +sanitizePDF.title=PDF sláintíocht +sanitizePDF.header=Glanadh comhad PDF +sanitizePDF.selectText.1=Bain gníomhartha JavaScript +sanitizePDF.selectText.2=Bain comhaid leabaithe +sanitizePDF.selectText.3=Bain meiteashonraí +sanitizePDF.selectText.4=Bain naisc +sanitizePDF.selectText.5=Bain clónna +sanitizePDF.submit=PDF sláintíocht + + +#addPageNumbers +addPageNumbers.title=Cuir Uimhreacha Leathanaigh leis +addPageNumbers.header=Cuir Uimhreacha Leathanaigh leis +addPageNumbers.selectText.1=Roghnaigh comhad PDF: +addPageNumbers.selectText.2=Méid Imeall +addPageNumbers.selectText.3=Post +addPageNumbers.selectText.4=Uimhir Tosaigh +addPageNumbers.selectText.5=Leathanaigh go hUimhir +addPageNumbers.selectText.6=Téacs Saincheaptha +addPageNumbers.customTextDesc=Téacs Saincheaptha +addPageNumbers.numberPagesDesc=Cé na leathanaigh le huimhriú, réamhshocraithe 'gach duine', a ghlacann freisin 1-5 nó 2,5,9 etc +addPageNumbers.customNumberDesc=Réamhshocrú go {n}, glacann sé freisin le 'Leathanach {n} de {total}', 'Text-{n}', '{filename}-{n} +addPageNumbers.submit=Cuir Uimhreacha Leathanaigh leis + + +#auto-rename +auto-rename.title=Athainmnigh Uathainm +auto-rename.header=Auto Athainmnigh PDF +auto-rename.submit=Athainmnigh Uathainm + + +#adjustContrast +adjustContrast.title=Coigeartaigh Codarsnacht +adjustContrast.header=Coigeartaigh Codarsnacht +adjustContrast.contrast=Codarsnacht: +adjustContrast.brightness=Gile: +adjustContrast.saturation=Sáithiú: +adjustContrast.download=Íosluchtaigh + + +#crop +crop.title=Barraí +crop.header=PDF a ghearradh +crop.submit=Cuir isteach + + +#autoSplitPDF +autoSplitPDF.title=Auto Scoilt PDF +autoSplitPDF.header=Auto Scoilt PDF +autoSplitPDF.description=Priontáil, Ionsáigh, Scan, uaslódáil, agus lig dúinn do dhoiciméid a scaradh go huathoibríoch. Níl gá le sórtáil obair láimhe. +autoSplitPDF.selectText.1=Priontáil roinnt bileoga roinnteoirí thíos (tá dubh agus bán go breá). +autoSplitPDF.selectText.2=Scan do dhoiciméid go léir ag an am céanna tríd an leathán roinnteora a chur isteach eatarthu. +autoSplitPDF.selectText.3=Uaslódáil an comhad PDF mór scanta amháin agus lig do Stirling PDF an chuid eile a láimhseáil. +autoSplitPDF.selectText.4=Déantar leathanaigh roinnteoirí a bhrath agus a bhaint go huathoibríoch, rud a ráthaíonn doiciméad deiridh néata. +autoSplitPDF.formPrompt=Cuir PDF isteach ina bhfuil roinnteoirí Leathanaigh Stirling-PDF: +autoSplitPDF.duplexMode=Mód Duplex (scanadh tosaigh agus cúil) +autoSplitPDF.dividerDownload1=Íoslódáil 'Auto Scoilteoir Roinnteoir (íosmhéid).pdf' +autoSplitPDF.dividerDownload2=Íoslódáil 'Auto Splitter Divider (le treoracha).pdf' +autoSplitPDF.submit=Cuir isteach + + +#pipeline +pipeline.title=Píblíne + + +#pageLayout +pageLayout.title=Leagan Amach Illeathanaigh +pageLayout.header=Leagan Amach Illeathanaigh +pageLayout.pagesPerSheet=Leathanaigh in aghaidh na bileoige: +pageLayout.addBorder=Cuir Teorainneacha leis +pageLayout.submit=Cuir isteach + + +#scalePages +scalePages.title=Coigeartaigh scála an leathanaigh +scalePages.header=Coigeartaigh scála an leathanaigh +scalePages.pageSize=Méid leathanach den doiciméad. +scalePages.scaleFactor=Leibhéal súmáil (barr) de leathanach. +scalePages.submit=Cuir isteach + + +#certSign +certSign.title=Síniú Teastais +certSign.header=Sínigh PDF le do theastas (Obair ar siúl) +certSign.selectPDF=Roghnaigh Comhad PDF le síniú: +certSign.jksNote=Nóta: Mura bhfuil do chineál teastais liostaithe thíos, le do thoil é a thiontú go comhad Java Keystore (.jks) ag baint úsáide as an uirlis líne ordaithe keytool. Ansin, roghnaigh an rogha comhad .jks thíos. +certSign.selectKey=Roghnaigh Do Chomhad Eochracha Príobháidí (Formáid PKCS#8, b'fhéidir .pem nó .der): +certSign.selectCert=Roghnaigh Do Chomhad Teastais (formáid X.509, d'fhéadfadh sé a bheith .pem nó .der): +certSign.selectP12=Roghnaigh Do Chomhad Siopa Eochracha PKCS#12 (.p12 nó .pfx) (Roghnach, Má chuirtear ar fáil é, ba cheart go mbeadh d'eochair phríobháideach agus teastas ann): +certSign.selectJKS=Roghnaigh Do Chomhad Keystore Java (.jks nó .keystore): +certSign.certType=Cineál Teastais +certSign.password=Cuir isteach do Phasfhocal Stórais Eochracha nó Eochracha Príobháidí (más ann dó): +certSign.showSig=Taispeáin Síniú +certSign.reason=Cúis +certSign.location=Suíomh +certSign.name=Ainm +certSign.submit=Sínigh PDF + + +#removeCertSign +removeCertSign.title=Bain Síniú Teastais +removeCertSign.header=Bain an deimhniú digiteach ó PDF +removeCertSign.selectPDF=Roghnaigh comhad PDF: +removeCertSign.submit=Bain Síniú + + +#removeBlanks +removeBlanks.title=Bain Bearnaí +removeBlanks.header=Bain Leathanaigh Bhána +removeBlanks.threshold=Tairseach Bánachta picteilíní: +removeBlanks.thresholdDesc=An tairseach chun a chinneadh cé chomh bán is gá picteilín bán a bheith le rangú mar 'Bán'. 0 +removeBlanks.whitePercent=Céatadán Bán (%): +removeBlanks.whitePercentDesc=Céatadán an leathanaigh a chaithfidh picteilíní 'bán' a bheith ann lena bhaint +removeBlanks.submit=Bain Bearnaí + + +#removeAnnotations +removeAnnotations.title=Bain Anótálacha +removeAnnotations.header=Bain Anótálacha +removeAnnotations.submit=Bain + + +#compare +compare.title=Déan comparáid idir +compare.header=Déan comparáid idir comhaid PDF +compare.highlightColor.1=Dath Aibhsithe 1: +compare.highlightColor.2=Dath Aibhsithe 2: +compare.document.1=Doiciméad 1 +compare.document.2=Doiciméad 2 +compare.submit=Déan comparáid idir + +#BookToPDF +BookToPDF.title=Leabhair agus comics a PDF +BookToPDF.header=Leabhar a thiontú go PDF +BookToPDF.credit=Úsáideann Calibre +BookToPDF.submit=Tiontaigh + +#PDFToBook +PDFToBook.title=PDF go Leabhar +PDFToBook.header=PDF go Leabhar +PDFToBook.selectText.1=Formáid +PDFToBook.credit=Úsáideann Calibre +PDFToBook.submit=Tiontaigh + +#sign +sign.title=Comhartha +sign.header=Sínigh comhaid PDF +sign.upload=Uaslódáil Íomhá +sign.draw=Tarraing Síniú +sign.text=Ionchur Téacs +sign.clear=Glan +sign.add=Cuir + + +#repair +repair.title=Deisiúchán +repair.header=PDF a dheisiú +repair.submit=Deisiúchán + + +#flatten +flatten.title=Flatten +flatten.header=PDF cothromú +flatten.flattenOnlyForms=Flatten foirmeacha amháin +flatten.submit=Flatten + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=Tairseach Uillinn: +ScannerImageSplit.selectText.2=Socraíonn sé an uillinn iomlán íosta a theastaíonn chun an íomhá a rothlú (réamhshocraithe: 10). +ScannerImageSplit.selectText.3=Caoinfhulaingt: +ScannerImageSplit.selectText.4=Cinneann an raon éagsúlachta dath timpeall an dath cúlra measta (réamhshocraithe: 30). +ScannerImageSplit.selectText.5=Achar Íosta: +ScannerImageSplit.selectText.6=Socraíonn sé an tairseach achair íosta le haghaidh grianghraf (réamhshocraithe: 10000). +ScannerImageSplit.selectText.7=Íos-Limistéar Comhrianta: +ScannerImageSplit.selectText.8=Socraíonn sé an tairseach íosta achar comhrianta le haghaidh grianghraf +ScannerImageSplit.selectText.9=Méid na Teorann: +ScannerImageSplit.selectText.10=Socraíonn sé méid na teorann a chuirtear leis agus a bhaintear chun teorainneacha bán a chosc san aschur (réamhshocraithe: 1). + + +#OCR +ocr.title=OCR / Glanta Scan +ocr.header=Scananna Glanta / OCR (Aithint Optúil Carachtair) +ocr.selectText.1=Roghnaigh teangacha atá le brath laistigh den PDF (Is iad na cinn a liostaítear na cinn a aimsítear faoi láthair): +ocr.selectText.2=Comhad téacs a tháirgeadh ina bhfuil téacs OCR taobh leis an PDF a cuireadh le OCR +ocr.selectText.3=Scanadh leathanaigh chearta ag uillinn sceabhach trína rothlú ar ais ina n-áit +ocr.selectText.4=Glan an leathanach ionas gur lú an seans go bhfaighidh OCR téacs i torann cúlra. (Gan athrú aschuir) +ocr.selectText.5=Glan an leathanach ionas gur lú an seans go bhfaighidh OCR téacs le torann cúlra, go gcoimeádann sé glantachán san aschur. +ocr.selectText.6=Déanann sé neamhaird ar leathanaigh a bhfuil téacs idirghníomhach orthu, agus ar leathanaigh OCR amháin ar íomhánna iad +ocr.selectText.7=Fórsa OCR, bainfidh OCR Gach leathanach ag baint na buneilimintí téacs uile +ocr.selectText.8=Gnáth (Tharla earráid má tá téacs sa PDF) +ocr.selectText.9=Socruithe Breise +ocr.selectText.10=Mód OCR +ocr.selectText.11=Bain íomhánna tar éis OCR (Bain GACH íomhá, ní úsáideach ach amháin má tá siad mar chuid den chéim tiontaithe) +ocr.selectText.12=Cineál Rindreála (Ardleibhéal) +ocr.help=Léigh le do thoil an doiciméadú seo ar conas é seo a úsáid do theangacha eile agus/nó úsáid nach bhfuil i ndugairí +ocr.credit=Úsáideann an tseirbhís seo OCRmyPDF agus Tesseract le haghaidh OCR. +ocr.submit=Próiseáil PDF le OCR + + +#extractImages +extractImages.title=Sliocht Íomhánna +extractImages.header=Sliocht Íomhánna +extractImages.selectText=Roghnaigh formáid íomhá chun íomhánna bainte a thiontú go +extractImages.submit=Sliocht + + +#File to PDF +fileToPDF.title=Comhad go PDF +fileToPDF.header=Tiontaigh aon chomhad go PDF +fileToPDF.credit=Úsáideann an tseirbhís seo LibreOffice agus Unoconv chun comhaid a thiontú. +fileToPDF.supportedFileTypesInfo=Cineálacha Comhaid Tacaithe +fileToPDF.supportedFileTypes=Ba cheart go n-áireofaí na cineálacha comhaid a dtacaítear leo thíos, áfach, le haghaidh liosta nuashonraithe iomlán de na formáidí a dtacaítear leo, féach le do thoil ar dhoiciméadú LibreOffice +fileToPDF.submit=Tiontaigh go PDF + + +#compress +compress.title=Comhbhrúigh +compress.header=Comhbhrúigh PDF +compress.credit=Úsáideann an tseirbhís seo Ghostscript le haghaidh Comhbhrú/Optimization PDF. +compress.selectText.1=Mód Láimhe - Ó 1 go 4 +compress.selectText.2=Leibhéal optamaithe: +compress.selectText.3=4 (Uafásach le haghaidh íomhánna téacs) +compress.selectText.4=Mód uathoibríoch - Coigeartaíonn Auto cáilíocht chun PDF a fháil go dtí an méid cruinn +compress.selectText.5=Méid PDF a bhfuiltear ag súil leis (m.sh. 25MB, 10.8MB, 25KB) +compress.submit=Comhbhrúigh + + +#Add image +addImage.title=Cuir Íomhá leis +addImage.header=Cuir íomhá i bhformáid PDF +addImage.everyPage=Gach Leathanach? +addImage.upload=Cuir íomhá leis +addImage.submit=Cuir íomhá leis + + +#merge +merge.title=Cumaisc +merge.header=Cumaisc PDFanna iolracha (2+) +merge.sortByName=Sórtáil de réir ainm +merge.sortByDate=Sórtáil de réir dáta +merge.removeCertSign=Bain síniú digiteach sa chomhad cumaiscthe? +merge.submit=Cumaisc + + +#pdfOrganiser +pdfOrganiser.title=Eagraigh Leathanach +pdfOrganiser.header=Eagraí leathanach PDF +pdfOrganiser.submit=Athshocrú Leathanaigh +pdfOrganiser.mode=Mód +pdfOrganiser.mode.1=Ordú Leathanach Saincheaptha +pdfOrganiser.mode.2=Ordú Droim ar Ais +pdfOrganiser.mode.3=Sórtáil Duplex +pdfOrganiser.mode.4=Sórtáil Leabhrán +pdfOrganiser.mode.5=Sórtáil Leabhrán Stitch Taobh +pdfOrganiser.mode.6=Scoilt Corr-Fiú +pdfOrganiser.mode.7=Bain Ar dtús +pdfOrganiser.mode.8=Bain Last +pdfOrganiser.mode.9=Bain An Chéad agus an Deireadh +pdfOrganiser.mode.10=Corr-Fiú Cumaisc +pdfOrganiser.placeholder=(m.sh. 1,3,2 nó 4-8,2,10-12 nó 2n-1) + + +#multiTool +multiTool.title=Il-uirlis PDF +multiTool.header=Il-uirlis PDF +multiTool.uploadPrompts=Ainm comhaid + +#view pdf +viewPdf.title=Féach PDF +viewPdf.header=Féach PDF + +#pageRemover +pageRemover.title=Bainteoir Leathanach +pageRemover.header=PDF leathanach remover +pageRemover.pagesToDelete=Leathanaigh le scriosadh (Cuir isteach liosta uimhreacha leathanaigh atá deighilte le camóga): : +pageRemover.submit=Scrios Leathanaigh +pageRemover.placeholder=(m.sh. 1,2,6 nó 1-10,15-30) + + +#rotate +rotate.title=Rothlaigh PDF +rotate.header=Rothlaigh PDF +rotate.selectAngle=Roghnaigh uillinn rothlaithe (i iolraí de 90 céim): +rotate.submit=Rothlaigh + + +#split-pdfs +split.title=Scoilt PDF +split.header=Scoilt PDF +split.desc.1=Is iad na huimhreacha a roghnaíonn tú an uimhir leathanaigh ar mian leat scoilt a dhéanamh air +split.desc.2=Dá bhrí sin, dá roghnófaí 1,3,7-9, roinnfí doiciméad 10 leathanach ina 6 PDF ar leith le: +split.desc.3=Doiciméad #1: Leathanach 1 +split.desc.4=Doiciméad #2: Leathanach 2 agus 3 +split.desc.5=Doiciméad #3: Leathanach 4, 5, 6 agus 7 +split.desc.6=Doiciméad #4: Leathanach 8 +split.desc.7=Doiciméad #5: Leathanach 9 +split.desc.8=Doiciméad #6: Leathanach 10 +split.splitPages=Iontráil leathanaigh le scoilt ar: +split.submit=Scoilt + + +#merge +imageToPDF.title=Íomhá go PDF +imageToPDF.header=Íomhá go PDF +imageToPDF.submit=Tiontaigh +imageToPDF.selectLabel=Roghanna Oiriúnú Íomhá +imageToPDF.fillPage=Líon Leathanach +imageToPDF.fitDocumentToImage=Fit Leathanach don Íomhá +imageToPDF.maintainAspectRatio=Cóimheasa Gnéis a chothabháil +imageToPDF.selectText.2=PDF rothlú uathoibríoch +imageToPDF.selectText.3=Loighic ilchomhad (cumasaithe ach amháin má oibríonn tú le híomhánna iolracha) +imageToPDF.selectText.4=Chumasadh go PDF amháin +imageToPDF.selectText.5=Tiontaigh go PDF ar leith + + +#pdfToImage +pdfToImage.title=PDF go íomhá +pdfToImage.header=PDF go íomhá +pdfToImage.selectText=Formáid Íomhá +pdfToImage.singleOrMultiple=Cineál toraidh Leathanach go hÍomhá +pdfToImage.single=Mhór Aonair a Chomhcheanglaíonn gach leathanach +pdfToImage.multi=Ilíomhánna, íomhá amháin in aghaidh an leathanaigh +pdfToImage.colorType=Cineál dath +pdfToImage.color=Dath +pdfToImage.grey=Scála Liath +pdfToImage.blackwhite=Dubh agus Bán (D’fhéadfadh sonraí a chailleadh!) +pdfToImage.submit=Tiontaigh + + +#addPassword +addPassword.title=Cuir Pasfhocal leis +addPassword.header=Cuir pasfhocal leis (Criptigh) +addPassword.selectText.1=Roghnaigh PDF le criptiú +addPassword.selectText.2=Pasfhocal Úsáideora +addPassword.selectText.3=Fad Eochracha Criptithe +addPassword.selectText.4=Tá luachanna níos airde níos láidre, ach tá comhoiriúnacht níos fearr ag luachanna níos ísle. +addPassword.selectText.5=Ceadanna le socrú (Moltar iad a úsáid in éineacht le pasfhocal an Úinéara) +addPassword.selectText.6=Cosc a chur le chéile doiciméad +addPassword.selectText.7=Cosc a chur ar eastóscadh ábhar +addPassword.selectText.8=Cosc a chur ar eastóscadh le haghaidh inrochtaineachta +addPassword.selectText.9=Cosc ar fhoirm a líonadh +addPassword.selectText.10=Cosc a chur ar mhodhnú +addPassword.selectText.11=Cosc a chur ar mhodhnú anótála +addPassword.selectText.12=Cosc a chur ar phriontáil +addPassword.selectText.13=Cosc a chur ar phriontáil bhformáidí éagsúla +addPassword.selectText.14=Pasfhocal Úinéir +addPassword.selectText.15=Cuireann sé srian lenar féidir a dhéanamh leis an doiciméad nuair a osclaítear é (Ní thacaíonn gach léitheoir leis) +addPassword.selectText.16=Cuireann sé srian le hoscailt an doiciméid féin +addPassword.submit=Criptigh + + +#watermark +watermark.title=Cuir Uisce leis +watermark.header=Cuir Uisce leis +watermark.selectText.1=Roghnaigh PDF chun comhartha uisce a chur leis: +watermark.selectText.2=Téacs Comhartha Uisce: +watermark.selectText.3=Méid cló: +watermark.selectText.4=Rothlú (0-360): +watermark.selectText.5=widthSpacer (Spás idir gach comhartha uisce go cothrománach): +watermark.selectText.6=spásaire airde (Spás idir gach comhartha uisce go hingearach): +watermark.selectText.7=Teimhneacht (0% - 100%): +watermark.selectText.8=Cineál Comhartha Uisce: +watermark.selectText.9=Íomhá Comhartha Uisce: +watermark.submit=Cuir Uisce leis +watermark.type.1=Téacs +watermark.type.2=Íomha + + +#Change permissions +permissions.title=Athrú Ceadanna +permissions.header=Athrú Ceadanna +permissions.warning=Má thugtar rabhadh nach féidir na ceadanna seo a athrú, moltar pasfhocal a shocrú dóibh trí leathanach an bhreiseáin phasfhocal +permissions.selectText.1=Roghnaigh PDF chun ceadanna a athrú +permissions.selectText.2=Ceadanna a shocrú +permissions.selectText.3=Cosc a chur le chéile doiciméad +permissions.selectText.4=Cosc a chur ar eastóscadh ábhar +permissions.selectText.5=Cosc a chur ar eastóscadh le haghaidh inrochtaineachta +permissions.selectText.6=Cosc ar fhoirm a líonadh +permissions.selectText.7=Cosc a chur ar mhodhnú +permissions.selectText.8=Cosc a chur ar mhodhnú anótála +permissions.selectText.9=Cosc a chur ar phriontáil +permissions.selectText.10=Cosc a chur ar phriontáil bhformáidí éagsúla +permissions.submit=Athrú + + +#remove password +removePassword.title=Bain pasfhocal +removePassword.header=Bain pasfhocal (Díchriptigh) +removePassword.selectText.1=Roghnaigh PDF le Díchriptiú +removePassword.selectText.2=Pasfhocal +removePassword.submit=Bain + + +#changeMetadata +changeMetadata.title=Athraigh Meiteashonraí +changeMetadata.header=Athraigh Meiteashonraí +changeMetadata.selectText.1=Cuir na hathróga is mian leat a athrú in eagar +changeMetadata.selectText.2=Scrios na meiteashonraí go léir +changeMetadata.selectText.3=Taispeáin Meiteashonraí Saincheaptha: +changeMetadata.author=Údar: +changeMetadata.creationDate=Dáta Cruthaithe (bbbb/MM/ll HH:mm:ss): +changeMetadata.creator=Cruthaitheoir: +changeMetadata.keywords=Eochairfhocail: +changeMetadata.modDate=Dáta Mionathraithe (bbbb/MM/ll HH:mm:ss): +changeMetadata.producer=léiritheoir: +changeMetadata.subject=Ábhar: +changeMetadata.trapped=Gafa: +changeMetadata.selectText.4=Meiteashonraí Eile: +changeMetadata.selectText.5=Cuir Iontráil Meiteashonraí Saincheaptha leis +changeMetadata.submit=Athrú + + +#pdfToPDFA +pdfToPDFA.title=PDF Go PDF/A +pdfToPDFA.header=PDF Go PDF/A +pdfToPDFA.credit=Úsáideann an tseirbhís seo OCRmyPDF chun PDF/A a thiontú +pdfToPDFA.submit=Tiontaigh +pdfToPDFA.tip=Faoi láthair ní oibríonn sé le haghaidh ionchuir iolracha ag an am céanna +pdfToPDFA.outputFormat=Formáid aschuir +pdfToPDFA.pdfWithDigitalSignature=Tá síniú digiteach ar an PDF. Bainfear é seo sa chéad chéim eile. + + +#PDFToWord +PDFToWord.title=PDF a thiontú go word +PDFToWord.header=PDF a thiontú go word +PDFToWord.selectText.1=Formáid comhaid aschuir +PDFToWord.credit=Úsáideann an tseirbhís seo LibreOffice chun comhaid a thiontú. +PDFToWord.submit=Tiontaigh + + +#PDFToPresentation +PDFToPresentation.title=PDF a chur i láthair +PDFToPresentation.header=PDF a chur i láthair +PDFToPresentation.selectText.1=Formáid comhaid aschuir +PDFToPresentation.credit=Úsáideann an tseirbhís seo LibreOffice chun comhaid a thiontú. +PDFToPresentation.submit=Tiontaigh + + +#PDFToText +PDFToText.title=PDF go RTF (Téacs) +PDFToText.header=PDF go RTF (Téacs) +PDFToText.selectText.1=Formáid comhaid aschuir +PDFToText.credit=Úsáideann an tseirbhís seo LibreOffice chun comhaid a thiontú. +PDFToText.submit=Tiontaigh + + +#PDFToHTML +PDFToHTML.title=Ó HTML go PDF +PDFToHTML.header=Ó HTML go PDF +PDFToHTML.credit=Úsáideann an tseirbhís seo PDF go html chun comhaid a thiontú. +PDFToHTML.submit=Tiontaigh + + +#PDFToXML +PDFToXML.title=Ó XML go PDF +PDFToXML.header=Ó XML go PDF +PDFToXML.credit=Úsáideann an tseirbhís seo LibreOffice chun comhaid a thiontú. +PDFToXML.submit=Tiontaigh + +#PDFToCSV +PDFToCSV.title=Ó CSV go PDF +PDFToCSV.header=Ó CSV go PDF +PDFToCSV.prompt=Roghnaigh leathanach chun tábla a bhaint as +PDFToCSV.submit=Sliocht + +#split-by-size-or-count +split-by-size-or-count.title=Scoilt PDF de réir Méid nó Comhairimh +split-by-size-or-count.header=Scoilt PDF de réir Méid nó Comhairimh +split-by-size-or-count.type.label=Roghnaigh Cineál Scoilt +split-by-size-or-count.type.size=De réir Méid +split-by-size-or-count.type.pageCount=De réir Comhaireamh Leathanaigh +split-by-size-or-count.type.docCount=De réir Líon na nDoiciméad +split-by-size-or-count.value.label=Cuir isteach Luach +split-by-size-or-count.value.placeholder=Cuir isteach méid (m.sh., 2MB nó 3KB) nó comhaireamh (m.sh., 5) +split-by-size-or-count.submit=Cuir isteach + + +#overlay-pdfs +overlay-pdfs.header=Forleagan comhaid PDF +overlay-pdfs.baseFile.label=Roghnaigh Bonn Comhad PDF +overlay-pdfs.overlayFiles.label=Roghnaigh Forleagan Comhaid PDF +overlay-pdfs.mode.label=Roghnaigh Mód Forleagan +overlay-pdfs.mode.sequential=Forleagan Seicheamhach +overlay-pdfs.mode.interleaved=Forleagan Interleaved +overlay-pdfs.mode.fixedRepeat=Forleagan Athdhéanta Seasta +overlay-pdfs.counts.label=Áireamh Forleagan (do Mhód Athdhéanta Seasta) +overlay-pdfs.counts.placeholder=Cuir isteach comhairimh scartha le camóga (m.sh., 2,3,1) +overlay-pdfs.position.label=Roghnaigh Post Forleagan +overlay-pdfs.position.foreground=Tulra +overlay-pdfs.position.background=Cúlra +overlay-pdfs.submit=Cuir isteach + + +#split-by-sections +split-by-sections.title=Scoilt PDF de réir ailt +split-by-sections.header=Scoilt PDF i gcodanna +split-by-sections.horizontal.label=Rannáin Chothrománacha +split-by-sections.vertical.label=Rannáin Ingearach +split-by-sections.horizontal.placeholder=Cuir isteach líon na rannán cothrománach +split-by-sections.vertical.placeholder=Cuir isteach líon na rannáin ingearacha +split-by-sections.submit=Scoilt PDF +split-by-sections.merge=Chumasadh i gceann PDF + + +#printFile +printFile.title=Priontáil Comhad +printFile.header=Priontáil an Comhad go Printéir +printFile.selectText.1=Roghnaigh Comhad le Priontáil +printFile.selectText.2=Cuir isteach Ainm an Phrintéara +printFile.submit=Priontáil + + +#licenses +licenses.nav=Ceadúnais +licenses.title=Ceadúnais 3ú Páirtí +licenses.header=Ceadúnais 3ú Páirtí +licenses.module=Modúl +licenses.version=Leagan +licenses.license=Ceadúnas + +#survey +survey.nav=Suirbhé +survey.title=Suirbhé Stirling-PDF +survey.description=Níl aon rian ar Stirling-PDF agus mar sin ba mhaith linn cloisteáil ónár n-úsáideoirí chun feabhas a chur ar Stirling-PDF! +survey.please=Smaoinigh ar ár suirbhé a dhéanamh le do thoil! +survey.disabled=(Díchumasófar aníos an tsuirbhé sna nuashonruithe seo a leanas ach beidh siad ar fáil ag bun an leathanaigh) +survey.button=Tóg Suirbhé +survey.dontShowAgain=Ná taispeáin arís + + +#error +error.sorry=Gabh mo leithscéal as an gceist! +error.needHelp=Cabhair uait / Ar aimsíodh fadhb? +error.contactTip=Má tá trioblóid agat fós, ná bíodh leisce ort teagmháil a dhéanamh linn le haghaidh cabhrach. Is féidir leat ticéad a chur isteach ar ár leathanach GitHub nó déan teagmháil linn trí Discord: +error.404.head=404 - Leathanach Gan Aimsiú | Úps, thuislíomar sa chód! +error.404.1=Is cosúil nach féidir linn teacht ar an leathanach atá uait. +error.404.2=Chuaigh rud eigin mícheart +error.github=Cuir ticéad isteach ar GitHub +error.showStack=Taispeáin Stack Trace +error.copyStack=Cóipeáil Stack Trace +error.githubSubmit=GitHub - Cuir ticéad isteach +error.discordSubmit=Discord - Cuir post Tacaíochta diff --git a/src/main/resources/static/images/flags/ie.svg b/src/main/resources/static/images/flags/ie.svg new file mode 100644 index 00000000..049be14d --- /dev/null +++ b/src/main/resources/static/images/flags/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html index 264a0f8b..e5babada 100644 --- a/src/main/resources/templates/fragments/languages.html +++ b/src/main/resources/templates/fragments/languages.html @@ -11,6 +11,7 @@ icon Español icon Français icon Indonesia + icon Irish icon Italiano icon Nederlands icon Polski -- 2.46.1 From d8087d8c55aa7102b20842f287f97485f35b76ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 21:25:37 +0100 Subject: [PATCH 041/231] :memo: Update README: Translation Progress Table (#1613) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- scripts/ignore_translation.toml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index 06a1addb..0479527e 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -43,12 +43,6 @@ ignore = [ 'watermark.type.1', ] - -[ga_IE] -ignore = [ - 'language.direction', -] - [el_GR] ignore = [ 'language.direction', @@ -93,6 +87,11 @@ ignore = [ 'watermark.type.2', ] +[ga_IE] +ignore = [ + 'language.direction', +] + [hi_IN] ignore = [ 'language.direction', -- 2.46.1 From 9ff2cb63d076d47d715f0ff4a25bbffe6a7528d0 Mon Sep 17 00:00:00 2001 From: congyuluo <78986434+congyuluo@users.noreply.github.com> Date: Wed, 31 Jul 2024 13:25:48 -0700 Subject: [PATCH 042/231] Refactored Identifiers (#1609) --- .../stirling/software/SPDF/SPdfApplication.java | 8 ++++---- .../software/SPDF/config/CleanUrlInterceptor.java | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java index fb682998..f49fe300 100644 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ b/src/main/java/stirling/software/SPDF/SPdfApplication.java @@ -79,13 +79,13 @@ public class SPdfApplication { // custom javs settings file if (Files.exists(Paths.get("configs/custom_settings.yml"))) { - String existing = propertyFiles.getOrDefault("spring.config.additional-location", ""); - if (!existing.isEmpty()) { - existing += ","; + String existingLocation = propertyFiles.getOrDefault("spring.config.additional-location", ""); + if (!existingLocation.isEmpty()) { + existingLocation += ","; } propertyFiles.put( "spring.config.additional-location", - existing + "file:configs/custom_settings.yml"); + existingLocation + "file:configs/custom_settings.yml"); } else { logger.warn("Custom configuration file 'configs/custom_settings.yml' does not exist."); } diff --git a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java b/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java index 8c1ed05f..0fb1e26f 100644 --- a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java +++ b/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java @@ -32,25 +32,25 @@ public class CleanUrlInterceptor implements HandlerInterceptor { String queryString = request.getQueryString(); if (queryString != null && !queryString.isEmpty()) { String requestURI = request.getRequestURI(); - Map parameters = new HashMap<>(); + Map allowedParameters = new HashMap<>(); // Keep only the allowed parameters String[] queryParameters = queryString.split("&"); for (String param : queryParameters) { - String[] keyValue = param.split("="); - if (keyValue.length != 2) { + String[] keyValuePair = param.split("="); + if (keyValuePair.length != 2) { continue; } - if (ALLOWED_PARAMS.contains(keyValue[0])) { - parameters.put(keyValue[0], keyValue[1]); + if (ALLOWED_PARAMS.contains(keyValuePair[0])) { + allowedParameters.put(keyValuePair[0], keyValuePair[1]); } } // If there are any parameters that are not allowed - if (parameters.size() != queryParameters.length) { + if (allowedParameters.size() != queryParameters.length) { // Construct new query string StringBuilder newQueryString = new StringBuilder(); - for (Map.Entry entry : parameters.entrySet()) { + for (Map.Entry entry : allowedParameters.entrySet()) { if (newQueryString.length() > 0) { newQueryString.append("&"); } -- 2.46.1 From 3df0474ed20ae36c8c456d8b90251fcadcd7e631 Mon Sep 17 00:00:00 2001 From: LizardWizardGB <135264545+LizardWizardGB@users.noreply.github.com> Date: Wed, 31 Jul 2024 22:25:57 +0200 Subject: [PATCH 043/231] Danish language (#1606) * Update languages.html Added an entry for "Danish". * Update languages.html filename of flag was wrong. * Danish flag svg * Create messages_da_DK.properties Initial commit of danish translation. * Update messages_da_DK.properties * Update messages_da_DK.properties --- src/main/resources/messages_da_DK.properties | 1126 +++++++++++++++++ src/main/resources/static/images/flags/dk.svg | 5 + .../templates/fragments/languages.html | 1 + 3 files changed, 1132 insertions(+) create mode 100644 src/main/resources/messages_da_DK.properties create mode 100644 src/main/resources/static/images/flags/dk.svg diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties new file mode 100644 index 00000000..b89e26ef --- /dev/null +++ b/src/main/resources/messages_da_DK.properties @@ -0,0 +1,1126 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr = left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=Vælg PDF-fil(er) +multiPdfPrompt=Vælg PDF-filerne (2+) +multiPdfDropPrompt=Vælg (eller drag & drop) alle PDF-filerne du skal bruge +imgPrompt=Vælg Billede(r) +genericSubmit=Indsend +processTimeWarning=Advarsel: Denne proces kan tage op til et helt minut, alt efter størrelsen på filen +pageOrderPrompt=Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) : +pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +goToPage=Gå +true=Sandt +false=Falsk +unknown=Ukendt +save=Gem +saveToBrowser=Save to Browser +close=Luk +filesSelected=Filer valgt +noFavourites=Ingen favoritter tilføjet +downloadComplete=Download fuldført +bored=Træt af at vente? +alphabet=Alfabet +downloadPdf=Download PDF +text=Tekst +font=Font +selectFillter=-- Vælg -- +pageNum=Sidenummer +sizes.small=Lille +sizes.medium=Mellem +sizes.large=Stor +sizes.x-large=X-Stor +error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect +delete=Slet +username=Brugernavn +password=Adgangskode +welcome=Velkommen +property=Property +black=Sort +white=Hvis +red=Rød +green=Græn +blue=Blå +custom=Custom... +WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! +poweredBy=Powered by +yes=Ja +no=Nej +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=Bruger ikke autoriseret. +userNotFoundMessage=Bruger ikke fundet. +incorrectPasswordMessage=Nuværende adgangskode er forkert. +usernameExistsMessage=Nyt brugernavn findes allerede. +invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +confirmPasswordErrorMessage=New Password and Confirm New Password must match. +deleteCurrentUserMessage=Cannot delete currently logged in user. +deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +downgradeCurrentUserMessage=Cannot downgrade current user's role +downgradeCurrentUserLongMessage=Cannot downgrade current user's role. Hence, current user will not be shown. +userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. +userAlreadyExistsWebMessage=The user already exists as an web user. +error=Fejl +oops=Ups! +help=Hjælp +goHomepage=Gå til hovedsiden +joinDiscord=Join our Discord server +seeDockerHub=Se Docker Hub +visitGithub=Besøg Github Repository +donate=Donér +color=Farve +sponsor=Sponsor +info=Info + + + +############### +# Pipeline # +############### +pipeline.header=Pipeline Menu (Beta) +pipeline.uploadButton=Upload Custom +pipeline.configureButton=Configure +pipeline.defaultOption=Custom +pipeline.submitButton=Submit +pipeline.help=Pipeline Help +pipeline.scanHelp=Folder Scanning Help +pipeline.deletePrompt=Are you sure you want to delete pipeline + +###################### +# Pipeline Options # +###################### +pipelineOptions.header=Pipeline Configuration +pipelineOptions.pipelineNameLabel=Pipeline Name +pipelineOptions.saveSettings=Save Operation Settings +pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation +pipelineOptions.addOperationButton=Add operation +pipelineOptions.pipelineHeader=Pipeline: +pipelineOptions.saveButton=Download +pipelineOptions.validateButton=Validate + + + + +############# +# NAVBAR # +############# +navbar.favorite=Favorites +navbar.darkmode=Dark Mode +navbar.language=Languages +navbar.settings=Settings +navbar.allTools=Tools +navbar.multiTool=Multi Tools +navbar.sections.organize=Organize +navbar.sections.convertTo=Convert to PDF +navbar.sections.convertFrom=Convert from PDF +navbar.sections.security=Sign & Security +navbar.sections.advance=Advanced +navbar.sections.edit=View & Edit + +############# +# SETTINGS # +############# +settings.title=Settings +settings.update=Update available +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.appVersion=App Version: +settings.downloadOption.title=Choose download option (For single file non zip downloads): +settings.downloadOption.1=Open in same window +settings.downloadOption.2=Open in new window +settings.downloadOption.3=Download file +settings.zipThreshold=Zip files when the number of downloaded files exceeds +settings.signOut=Sign Out +settings.accountSettings=Account Settings +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changePassword=You are using default login credentials. Please enter a new password +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + +account.title=Account Settings +account.accountSettings=Account Settings +account.adminSettings=Admin Settings - View and Add Users +account.userControlSettings=User Control Settings +account.changeUsername=Change Username +account.newUsername=New Username +account.password=Confirmation Password +account.oldPassword=Old password +account.newPassword=New Password +account.changePassword=Change Password +account.confirmNewPassword=Confirm New Password +account.signOut=Sign Out +account.yourApiKey=Your API Key +account.syncTitle=Sync browser settings with Account +account.settingsCompare=Settings Comparison: +account.property=Property +account.webBrowserSettings=Web Browser Setting +account.syncToBrowser=Sync Account -> Browser +account.syncToAccount=Sync Account <- Browser + + +adminUserSettings.title=User Control Settings +adminUserSettings.header=Admin User Control Settings +adminUserSettings.admin=Admin +adminUserSettings.user=User +adminUserSettings.addUser=Add New User +adminUserSettings.deleteUser=Delete User +adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +adminUserSettings.roles=Roles +adminUserSettings.role=Role +adminUserSettings.actions=Actions +adminUserSettings.apiUser=Limited API User +adminUserSettings.extraApiUser=Additional Limited API User +adminUserSettings.webOnlyUser=Web Only User +adminUserSettings.demoUser=Demo User (No custom settings) +adminUserSettings.internalApiUser=Internal API User +adminUserSettings.forceChange=Force user to change password on login +adminUserSettings.submit=Save User +adminUserSettings.changeUserRole=Change User's Role +adminUserSettings.authenticated=Authenticated + + +database.title=Database Import/Export +database.header=Database Import/Export +database.fileName=File Name +database.creationDate=Creation Date +database.fileSize=File Size +database.deleteBackupFile=Delete Backup File +database.importBackupFile=Import Backup File +database.downloadBackupFile=Download Backup File +database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. +database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. +database.submit=Import Backup +database.importIntoDatabaseSuccessed=Import into database successed +database.fileNotFound=File not found +database.fileNullOrEmpty=File must not be null or empty +database.failedImportFile=Failed to import file + +############# +# HOME-PAGE # +############# +home.desc=Your locally hosted one-stop-shop for all your PDF needs. +home.searchBar=Search for features... + + +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + +home.multiTool.title=PDF Multi Tool +home.multiTool.desc=Merge, Rotate, Rearrange, and Remove pages +multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move + +home.merge.title=Merge +home.merge.desc=Easily merge multiple PDFs into one. +merge.tags=merge,Page operations,Back end,server side + +home.split.title=Split +home.split.desc=Split PDFs into multiple documents +split.tags=Page operations,divide,Multi Page,cut,server side + +home.rotate.title=Rotate +home.rotate.desc=Easily rotate your PDFs. +rotate.tags=server side + + +home.imageToPdf.title=Image to PDF +home.imageToPdf.desc=Convert a image (PNG, JPEG, GIF) to PDF. +imageToPdf.tags=conversion,img,jpg,picture,photo + +home.pdfToImage.title=PDF to Image +home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF) +pdfToImage.tags=conversion,img,jpg,picture,photo + +home.pdfOrganiser.title=Organise +home.pdfOrganiser.desc=Remove/Rearrange pages in any order +pdfOrganiser.tags=duplex,even,odd,sort,move + + +home.addImage.title=Add image +home.addImage.desc=Adds a image onto a set location on the PDF +addImage.tags=img,jpg,picture,photo + +home.watermark.title=Add Watermark +home.watermark.desc=Add a custom watermark to your PDF document. +watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo + +home.permissions.title=Change Permissions +home.permissions.desc=Change the permissions of your PDF document +permissions.tags=read,write,edit,print + + +home.removePages.title=Remove +home.removePages.desc=Delete unwanted pages from your PDF document. +removePages.tags=Remove pages,delete pages + +home.addPassword.title=Add Password +home.addPassword.desc=Encrypt your PDF document with a password. +addPassword.tags=secure,security + +home.removePassword.title=Remove Password +home.removePassword.desc=Remove password protection from your PDF document. +removePassword.tags=secure,Decrypt,security,unpassword,delete password + +home.compressPdfs.title=Compress +home.compressPdfs.desc=Compress PDFs to reduce their file size. +compressPdfs.tags=squish,small,tiny + + +home.changeMetadata.title=Change Metadata +home.changeMetadata.desc=Change/Remove/Add metadata from a PDF document +changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats + +home.fileToPDF.title=Convert file to PDF +home.fileToPDF.desc=Convert nearly any file to PDF (DOCX, PNG, XLS, PPT, TXT and more) +fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint + +home.ocr.title=OCR / Cleanup scans +home.ocr.desc=Cleanup scans and detects text from images within a PDF and re-adds it as text. +ocr.tags=recognition,text,image,scan,read,identify,detection,editable + + +home.extractImages.title=Extract Images +home.extractImages.desc=Extracts all images from a PDF and saves them to zip +extractImages.tags=picture,photo,save,archive,zip,capture,grab + +home.pdfToPDFA.title=PDF to PDF/A +home.pdfToPDFA.desc=Convert PDF to PDF/A for long-term storage +pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation + +home.PDFToWord.title=PDF to Word +home.PDFToWord.desc=Convert PDF to Word formats (DOC, DOCX and ODT) +PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile + +home.PDFToPresentation.title=PDF to Presentation +home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP) +PDFToPresentation.tags=slides,show,office,microsoft + +home.PDFToText.title=PDF to RTF (Text) +home.PDFToText.desc=Convert PDF to Text or RTF format +PDFToText.tags=richformat,richtextformat,rich text format + +home.PDFToHTML.title=PDF to HTML +home.PDFToHTML.desc=Convert PDF to HTML format +PDFToHTML.tags=web content,browser friendly + + +home.PDFToXML.title=PDF to XML +home.PDFToXML.desc=Convert PDF to XML format +PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert + +home.ScannerImageSplit.title=Detect/Split Scanned photos +home.ScannerImageSplit.desc=Splits multiple photos from within a photo/PDF +ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize + +home.sign.title=Sign +home.sign.desc=Adds signature to PDF by drawing, text or image +sign.tags=authorize,initials,drawn-signature,text-sign,image-signature + +home.flatten.title=Flatten +home.flatten.desc=Remove all interactive elements and forms from a PDF +flatten.tags=static,deactivate,non-interactive,streamline + +home.repair.title=Repair +home.repair.desc=Tries to repair a corrupt/broken PDF +repair.tags=fix,restore,correction,recover + +home.removeBlanks.title=Remove Blank pages +home.removeBlanks.desc=Detects and removes blank pages from a document +removeBlanks.tags=cleanup,streamline,non-content,organize + +home.removeAnnotations.title=Remove Annotations +home.removeAnnotations.desc=Removes all comments/annotations from a PDF +removeAnnotations.tags=comments,highlight,notes,markup,remove + +home.compare.title=Compare +home.compare.desc=Compares and shows the differences between 2 PDF Documents +compare.tags=differentiate,contrast,changes,analysis + +home.certSign.title=Sign with Certificate +home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) +certSign.tags=authenticate,PEM,P12,official,encrypt + +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + +home.pageLayout.title=Multi-Page Layout +home.pageLayout.desc=Merge multiple pages of a PDF document into a single page +pageLayout.tags=merge,composite,single-view,organize + +home.scalePages.title=Adjust page size/scale +home.scalePages.desc=Change the size/scale of a page and/or its contents. +scalePages.tags=resize,modify,dimension,adapt + +home.pipeline.title=Pipeline (Advanced) +home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts +pipeline.tags=automate,sequence,scripted,batch-process + +home.add-page-numbers.title=Add Page Numbers +home.add-page-numbers.desc=Add Page numbers throughout a document in a set location +add-page-numbers.tags=paginate,label,organize,index + +home.auto-rename.title=Auto Rename PDF File +home.auto-rename.desc=Auto renames a PDF file based on its detected header +auto-rename.tags=auto-detect,header-based,organize,relabel + +home.adjust-contrast.title=Adjust Colors/Contrast +home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF +adjust-contrast.tags=color-correction,tune,modify,enhance + +home.crop.title=Crop PDF +home.crop.desc=Crop a PDF to reduce its size (maintains text!) +crop.tags=trim,shrink,edit,shape + +home.autoSplitPDF.title=Auto Split Pages +home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code +autoSplitPDF.tags=QR-based,separate,scan-segment,organize + +home.sanitizePdf.title=Sanitize +home.sanitizePdf.desc=Remove scripts and other elements from PDF files +sanitizePdf.tags=clean,secure,safe,remove-threats + +home.URLToPDF.title=URL/Website To PDF +home.URLToPDF.desc=Converts any http(s)URL to PDF +URLToPDF.tags=web-capture,save-page,web-to-doc,archive + +home.HTMLToPDF.title=HTML to PDF +home.HTMLToPDF.desc=Converts any HTML file or zip to PDF +HTMLToPDF.tags=markup,web-content,transformation,convert + + +home.MarkdownToPDF.title=Markdown to PDF +home.MarkdownToPDF.desc=Converts any Markdown file to PDF +MarkdownToPDF.tags=markup,web-content,transformation,convert + + +home.getPdfInfo.title=Get ALL Info on PDF +home.getPdfInfo.desc=Grabs any and all information possible on PDFs +getPdfInfo.tags=infomation,data,stats,statistics + + +home.extractPage.title=Extract page(s) +home.extractPage.desc=Extracts select pages from PDF +extractPage.tags=extract + + +home.PdfToSinglePage.title=PDF to Single Large Page +home.PdfToSinglePage.desc=Merges all PDF pages into one large single page +PdfToSinglePage.tags=single page + + +home.showJS.title=Show Javascript +home.showJS.desc=Searches and displays any JS injected into a PDF +showJS.tags=JS + +home.autoRedact.title=Auto Redact +home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text +autoRedact.tags=Redact,Hide,black out,black,marker,hidden + +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV +tableExtraxt.tags=CSV,Table Extraction,extract,convert + + +home.autoSizeSplitPDF.title=Auto Split by Size/Count +home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF +overlay-pdfs.tags=Overlay + +home.split-by-sections.title=Split PDF by Sections +home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections +split-by-sections.tags=Section Split, Divide, Customize + +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + +home.PDFToBook.title=PDF to Book +home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre +PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf + +home.BookToPDF.title=Book to PDF +home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre +BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf + + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=Sign in +login.header=Sign in +login.signin=Sign in +login.rememberme=Remember me +login.invalid=Invalid username or password. +login.locked=Your account has been locked. +login.signinTitle=Please sign in +login.ssoSignIn=Login via Single Sign-on +login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled +login.oauth2RequestNotFound=Authorization request not found +login.oauth2InvalidUserInfoResponse=Invalid User Info Response +login.oauth2invalidRequest=Invalid Request +login.oauth2AccessDenied=Access Denied +login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token + + +#auto-redact +autoRedact.title=Auto Redact +autoRedact.header=Auto Redact +autoRedact.colorLabel=Colour +autoRedact.textsToRedactLabel=Text to Redact (line-separated) +autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret +autoRedact.useRegexLabel=Use Regex +autoRedact.wholeWordSearchLabel=Whole Word Search +autoRedact.customPaddingLabel=Custom Extra Padding +autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) +autoRedact.submitButton=Submit + + +#showJS +showJS.title=Show Javascript +showJS.header=Show Javascript +showJS.downloadJS=Download Javascript +showJS.submit=Show + + +#pdfToSinglePage +pdfToSinglePage.title=PDF To Single Page +pdfToSinglePage.header=PDF To Single Page +pdfToSinglePage.submit=Convert To Single Page + + +#pageExtracter +pageExtracter.title=Extract Pages +pageExtracter.header=Extract Pages +pageExtracter.submit=Extract +pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) + + +#getPdfInfo +getPdfInfo.title=Get Info on PDF +getPdfInfo.header=Get Info on PDF +getPdfInfo.submit=Get Info +getPdfInfo.downloadJson=Download JSON + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown To PDF +MarkdownToPDF.header=Markdown To PDF +MarkdownToPDF.submit=Convert +MarkdownToPDF.help=Work in progress +MarkdownToPDF.credit=Uses WeasyPrint + + + +#url-to-pdf +URLToPDF.title=URL To PDF +URLToPDF.header=URL To PDF +URLToPDF.submit=Convert +URLToPDF.credit=Uses WeasyPrint + + +#html-to-pdf +HTMLToPDF.title=HTML To PDF +HTMLToPDF.header=HTML To PDF +HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required +HTMLToPDF.submit=Convert +HTMLToPDF.credit=Uses WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen + + +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + + +#sanitizePDF +sanitizePDF.title=Sanitize PDF +sanitizePDF.header=Sanitize a PDF file +sanitizePDF.selectText.1=Remove JavaScript actions +sanitizePDF.selectText.2=Remove embedded files +sanitizePDF.selectText.3=Remove metadata +sanitizePDF.selectText.4=Remove links +sanitizePDF.selectText.5=Remove fonts +sanitizePDF.submit=Sanitize PDF + + +#addPageNumbers +addPageNumbers.title=Add Page Numbers +addPageNumbers.header=Add Page Numbers +addPageNumbers.selectText.1=Select PDF file: +addPageNumbers.selectText.2=Margin Size +addPageNumbers.selectText.3=Position +addPageNumbers.selectText.4=Starting Number +addPageNumbers.selectText.5=Pages to Number +addPageNumbers.selectText.6=Custom Text +addPageNumbers.customTextDesc=Custom Text +addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc +addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} +addPageNumbers.submit=Add Page Numbers + + +#auto-rename +auto-rename.title=Auto Rename +auto-rename.header=Auto Rename PDF +auto-rename.submit=Auto Rename + + +#adjustContrast +adjustContrast.title=Adjust Contrast +adjustContrast.header=Adjust Contrast +adjustContrast.contrast=Contrast: +adjustContrast.brightness=Brightness: +adjustContrast.saturation=Saturation: +adjustContrast.download=Download + + +#crop +crop.title=Crop +crop.header=Crop PDF +crop.submit=Submit + + +#autoSplitPDF +autoSplitPDF.title=Auto Split PDF +autoSplitPDF.header=Auto Split PDF +autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. +autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). +autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. +autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. +autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. +autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: +autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) +autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' +autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' +autoSplitPDF.submit=Submit + + +#pipeline +pipeline.title=Pipeline + + +#pageLayout +pageLayout.title=Multi Page Layout +pageLayout.header=Multi Page Layout +pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.addBorder=Add Borders +pageLayout.submit=Submit + + +#scalePages +scalePages.title=Adjust page-scale +scalePages.header=Adjust page-scale +scalePages.pageSize=Size of a page of the document. +scalePages.scaleFactor=Zoom level (crop) of a page. +scalePages.submit=Submit + + +#certSign +certSign.title=Certificate Signing +certSign.header=Sign a PDF with your certificate (Work in progress) +certSign.selectPDF=Select a PDF File for Signing: +certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.selectKey=Select Your Private Key File (PKCS#8 format, could be .pem or .der): +certSign.selectCert=Select Your Certificate File (X.509 format, could be .pem or .der): +certSign.selectP12=Select Your PKCS#12 Keystore File (.p12 or .pfx) (Optional, If provided, it should contain your private key and certificate): +certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.certType=Certificate Type +certSign.password=Enter Your Keystore or Private Key Password (If Any): +certSign.showSig=Show Signature +certSign.reason=Reason +certSign.location=Location +certSign.name=Name +certSign.submit=Sign PDF + + +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + +#removeBlanks +removeBlanks.title=Remove Blanks +removeBlanks.header=Remove Blank Pages +removeBlanks.threshold=Pixel Whiteness Threshold: +removeBlanks.thresholdDesc=Threshold for determining how white a white pixel must be to be classed as 'White'. 0 = Black, 255 pure white. +removeBlanks.whitePercent=White Percent (%): +removeBlanks.whitePercentDesc=Percent of page that must be 'white' pixels to be removed +removeBlanks.submit=Remove Blanks + + +#removeAnnotations +removeAnnotations.title=Remove Annotations +removeAnnotations.header=Remove Annotations +removeAnnotations.submit=Remove + + +#compare +compare.title=Compare +compare.header=Compare PDFs +compare.highlightColor.1=Highlight Color 1: +compare.highlightColor.2=Highlight Color 2: +compare.document.1=Document 1 +compare.document.2=Document 2 +compare.submit=Compare + +#BookToPDF +BookToPDF.title=Books and Comics to PDF +BookToPDF.header=Book to PDF +BookToPDF.credit=Uses Calibre +BookToPDF.submit=Convert + +#PDFToBook +PDFToBook.title=PDF to Book +PDFToBook.header=PDF to Book +PDFToBook.selectText.1=Format +PDFToBook.credit=Uses Calibre +PDFToBook.submit=Convert + +#sign +sign.title=Sign +sign.header=Sign PDFs +sign.upload=Upload Image +sign.draw=Draw Signature +sign.text=Text Input +sign.clear=Clear +sign.add=Add + + +#repair +repair.title=Repair +repair.header=Repair PDFs +repair.submit=Repair + + +#flatten +flatten.title=Flatten +flatten.header=Flatten PDF +flatten.flattenOnlyForms=Flatten only forms +flatten.submit=Flatten + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=Angle Threshold: +ScannerImageSplit.selectText.2=Sets the minimum absolute angle required for the image to be rotated (default: 10). +ScannerImageSplit.selectText.3=Tolerance: +ScannerImageSplit.selectText.4=Determines the range of color variation around the estimated background color (default: 30). +ScannerImageSplit.selectText.5=Minimum Area: +ScannerImageSplit.selectText.6=Sets the minimum area threshold for a photo (default: 10000). +ScannerImageSplit.selectText.7=Minimum Contour Area: +ScannerImageSplit.selectText.8=Sets the minimum contour area threshold for a photo +ScannerImageSplit.selectText.9=Border Size: +ScannerImageSplit.selectText.10=Sets the size of the border added and removed to prevent white borders in the output (default: 1). + + +#OCR +ocr.title=OCR / Scan Cleanup +ocr.header=Cleanup Scans / OCR (Optical Character Recognition) +ocr.selectText.1=Select languages that are to be detected within the PDF (Ones listed are the ones currently detected): +ocr.selectText.2=Produce text file containing OCR text alongside the OCR'ed PDF +ocr.selectText.3=Correct pages were scanned at a skewed angle by rotating them back into place +ocr.selectText.4=Clean page so its less likely that OCR will find text in background noise. (No output change) +ocr.selectText.5=Clean page so its less likely that OCR will find text in background noise, maintains cleanup in output. +ocr.selectText.6=Ignores pages that have interactive text on them, only OCRs pages that are images +ocr.selectText.7=Force OCR, will OCR Every page removing all original text elements +ocr.selectText.8=Normal (Will error if PDF contains text) +ocr.selectText.9=Additional Settings +ocr.selectText.10=OCR Mode +ocr.selectText.11=Remove images after OCR (Removes ALL images, only useful if part of conversion step) +ocr.selectText.12=Render Type (Advanced) +ocr.help=Please read this documentation on how to use this for other languages and/or use not in docker +ocr.credit=This service uses OCRmyPDF and Tesseract for OCR. +ocr.submit=Process PDF with OCR + + +#extractImages +extractImages.title=Extract Images +extractImages.header=Extract Images +extractImages.selectText=Select image format to convert extracted images to +extractImages.submit=Extract + + +#File to PDF +fileToPDF.title=File to PDF +fileToPDF.header=Convert any file to PDF +fileToPDF.credit=This service uses LibreOffice and Unoconv for file conversion. +fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypes=Supported file types should include the below however for a full updated list of supported formats, please refer to the LibreOffice documentation +fileToPDF.submit=Convert to PDF + + +#compress +compress.title=Compress +compress.header=Compress PDF +compress.credit=This service uses Ghostscript for PDF Compress/Optimisation. +compress.selectText.1=Manual Mode - From 1 to 4 +compress.selectText.2=Optimization level: +compress.selectText.3=4 (Terrible for text images) +compress.selectText.4=Auto mode - Auto adjusts quality to get PDF to exact size +compress.selectText.5=Expected PDF Size (e.g. 25MB, 10.8MB, 25KB) +compress.submit=Compress + + +#Add image +addImage.title=Add Image +addImage.header=Add image to PDF +addImage.everyPage=Every Page? +addImage.upload=Add image +addImage.submit=Add image + + +#merge +merge.title=Merge +merge.header=Merge multiple PDFs (2+) +merge.sortByName=Sort by name +merge.sortByDate=Sort by date +merge.removeCertSign=Remove digital signature in the merged file? +merge.submit=Merge + + +#pdfOrganiser +pdfOrganiser.title=Page Organiser +pdfOrganiser.header=PDF Page Organiser +pdfOrganiser.submit=Rearrange Pages +pdfOrganiser.mode=Mode +pdfOrganiser.mode.1=Custom Page Order +pdfOrganiser.mode.2=Reverse Order +pdfOrganiser.mode.3=Duplex Sort +pdfOrganiser.mode.4=Booklet Sort +pdfOrganiser.mode.5=Side Stitch Booklet Sort +pdfOrganiser.mode.6=Odd-Even Split +pdfOrganiser.mode.7=Remove First +pdfOrganiser.mode.8=Remove Last +pdfOrganiser.mode.9=Remove First and Last +pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) + + +#multiTool +multiTool.title=PDF Multi Tool +multiTool.header=PDF Multi Tool +multiTool.uploadPrompts=File Name + +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF + +#pageRemover +pageRemover.title=Page Remover +pageRemover.header=PDF Page remover +pageRemover.pagesToDelete=Pages to delete (Enter a comma-separated list of page numbers) : +pageRemover.submit=Delete Pages +pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) + + +#rotate +rotate.title=Rotate PDF +rotate.header=Rotate PDF +rotate.selectAngle=Select rotation angle (in multiples of 90 degrees): +rotate.submit=Rotate + + +#split-pdfs +split.title=Split PDF +split.header=Split PDF +split.desc.1=The numbers you select are the page number you wish to do a split on +split.desc.2=As such selecting 1,3,7-9 would split a 10 page document into 6 separate PDFS with: +split.desc.3=Document #1: Page 1 +split.desc.4=Document #2: Page 2 and 3 +split.desc.5=Document #3: Page 4, 5, 6 and 7 +split.desc.6=Document #4: Page 8 +split.desc.7=Document #5: Page 9 +split.desc.8=Document #6: Page 10 +split.splitPages=Enter pages to split on: +split.submit=Split + + +#merge +imageToPDF.title=Image to PDF +imageToPDF.header=Image to PDF +imageToPDF.submit=Convert +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios +imageToPDF.selectText.2=Auto rotate PDF +imageToPDF.selectText.3=Multi file logic (Only enabled if working with multiple images) +imageToPDF.selectText.4=Merge into single PDF +imageToPDF.selectText.5=Convert to separate PDFs + + +#pdfToImage +pdfToImage.title=PDF to Image +pdfToImage.header=PDF to Image +pdfToImage.selectText=Image Format +pdfToImage.singleOrMultiple=Page to Image result type +pdfToImage.single=Single Big Image Combing all pages +pdfToImage.multi=Multiple Images, one image per page +pdfToImage.colorType=Colour type +pdfToImage.color=Colour +pdfToImage.grey=Greyscale +pdfToImage.blackwhite=Black and White (May lose data!) +pdfToImage.submit=Convert + + +#addPassword +addPassword.title=Add Password +addPassword.header=Add password (Encrypt) +addPassword.selectText.1=Select PDF to encrypt +addPassword.selectText.2=User Password +addPassword.selectText.3=Encryption Key Length +addPassword.selectText.4=Higher values are stronger, but lower values have better compatibility. +addPassword.selectText.5=Permissions to set (Recommended to be used along with Owner password) +addPassword.selectText.6=Prevent assembly of document +addPassword.selectText.7=Prevent content extraction +addPassword.selectText.8=Prevent extraction for accessibility +addPassword.selectText.9=Prevent filling in form +addPassword.selectText.10=Prevent modification +addPassword.selectText.11=Prevent annotation modification +addPassword.selectText.12=Prevent printing +addPassword.selectText.13=Prevent printing different formats +addPassword.selectText.14=Owner Password +addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) +addPassword.selectText.16=Restricts the opening of the document itself +addPassword.submit=Encrypt + + +#watermark +watermark.title=Add Watermark +watermark.header=Add Watermark +watermark.selectText.1=Select PDF to add watermark to: +watermark.selectText.2=Watermark Text: +watermark.selectText.3=Font Size: +watermark.selectText.4=Rotation (0-360): +watermark.selectText.5=widthSpacer (Space between each watermark horizontally): +watermark.selectText.6=heightSpacer (Space between each watermark vertically): +watermark.selectText.7=Opacity (0% - 100%): +watermark.selectText.8=Watermark Type: +watermark.selectText.9=Watermark Image: +watermark.submit=Add Watermark +watermark.type.1=Text +watermark.type.2=Image + + +#Change permissions +permissions.title=Change Permissions +permissions.header=Change Permissions +permissions.warning=Warning to have these permissions be unchangeable it is recommended to set them with a password via the add-password page +permissions.selectText.1=Select PDF to change permissions +permissions.selectText.2=Permissions to set +permissions.selectText.3=Prevent assembly of document +permissions.selectText.4=Prevent content extraction +permissions.selectText.5=Prevent extraction for accessibility +permissions.selectText.6=Prevent filling in form +permissions.selectText.7=Prevent modification +permissions.selectText.8=Prevent annotation modification +permissions.selectText.9=Prevent printing +permissions.selectText.10=Prevent printing different formats +permissions.submit=Change + + +#remove password +removePassword.title=Remove password +removePassword.header=Remove password (Decrypt) +removePassword.selectText.1=Select PDF to Decrypt +removePassword.selectText.2=Password +removePassword.submit=Remove + + +#changeMetadata +changeMetadata.title=Change Metadata +changeMetadata.header=Change Metadata +changeMetadata.selectText.1=Please edit the variables you wish to change +changeMetadata.selectText.2=Delete all metadata +changeMetadata.selectText.3=Show Custom Metadata: +changeMetadata.author=Author: +changeMetadata.creationDate=Creation Date (yyyy/MM/dd HH:mm:ss): +changeMetadata.creator=Creator: +changeMetadata.keywords=Keywords: +changeMetadata.modDate=Modification Date (yyyy/MM/dd HH:mm:ss): +changeMetadata.producer=Producer: +changeMetadata.subject=Subject: +changeMetadata.trapped=Trapped: +changeMetadata.selectText.4=Other Metadata: +changeMetadata.selectText.5=Add Custom Metadata Entry +changeMetadata.submit=Change + + +#pdfToPDFA +pdfToPDFA.title=PDF To PDF/A +pdfToPDFA.header=PDF To PDF/A +pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion +pdfToPDFA.submit=Convert +pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. + + +#PDFToWord +PDFToWord.title=PDF to Word +PDFToWord.header=PDF to Word +PDFToWord.selectText.1=Output file format +PDFToWord.credit=This service uses LibreOffice for file conversion. +PDFToWord.submit=Convert + + +#PDFToPresentation +PDFToPresentation.title=PDF to Presentation +PDFToPresentation.header=PDF to Presentation +PDFToPresentation.selectText.1=Output file format +PDFToPresentation.credit=This service uses LibreOffice for file conversion. +PDFToPresentation.submit=Convert + + +#PDFToText +PDFToText.title=PDF to RTF (Text) +PDFToText.header=PDF to RTF (Text) +PDFToText.selectText.1=Output file format +PDFToText.credit=This service uses LibreOffice for file conversion. +PDFToText.submit=Convert + + +#PDFToHTML +PDFToHTML.title=PDF to HTML +PDFToHTML.header=PDF to HTML +PDFToHTML.credit=This service uses pdftohtml for file conversion. +PDFToHTML.submit=Convert + + +#PDFToXML +PDFToXML.title=PDF to XML +PDFToXML.header=PDF to XML +PDFToXML.credit=This service uses LibreOffice for file conversion. +PDFToXML.submit=Convert + +#PDFToCSV +PDFToCSV.title=PDF to CSV +PDFToCSV.header=PDF to CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Extract + +#split-by-size-or-count +split-by-size-or-count.title=Split PDF by Size or Count +split-by-size-or-count.header=Split PDF by Size or Count +split-by-size-or-count.type.label=Select Split Type +split-by-size-or-count.type.size=By Size +split-by-size-or-count.type.pageCount=By Page Count +split-by-size-or-count.type.docCount=By Document Count +split-by-size-or-count.value.label=Enter Value +split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) +split-by-size-or-count.submit=Submit + + +#overlay-pdfs +overlay-pdfs.header=Overlay PDF Files +overlay-pdfs.baseFile.label=Select Base PDF File +overlay-pdfs.overlayFiles.label=Select Overlay PDF Files +overlay-pdfs.mode.label=Select Overlay Mode +overlay-pdfs.mode.sequential=Sequential Overlay +overlay-pdfs.mode.interleaved=Interleaved Overlay +overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay +overlay-pdfs.counts.label=Antal overlejringer (for Fixed Repeat Mode) +overlay-pdfs.counts.placeholder=Indtast kommaseparerede tællinger (f.eks. 2,3,1) +overlay-pdfs.position.label=Vælg overlejringsposition +overlay-pdfs.position.foreground=Forgrund +overlay-pdfs.position.background=Baggrund +overlay-pdfs.submit=Indsend + + +#split-by-sections +split-by-sections.title=Del PDF i Sektioner +split-by-sections.header=Del PDF ind i Sektioner +split-by-sections.horizontal.label=Horisontal Deling +split-by-sections.vertical.label=Vertikal Deling +split-by-sections.horizontal.placeholder=Indtast antal horisontale delinger +split-by-sections.vertical.placeholder=Indtast antal af vertikale delinger +split-by-sections.submit=Del PDF +split-by-sections.merge=Slå sammen til én PDF + + +#printFile +printFile.title=Udskriv Fil +printFile.header=Udskriv Fil til Printer +printFile.selectText.1=Vælg Fil som skal Udskrives +printFile.selectText.2=Indtast printernavn +printFile.submit=Udskriv + + +#licenses +licenses.nav=Licenser +licenses.title=Trejdepartslicenser +licenses.header=Trejdepartslicenser +licenses.module=Modul +licenses.version=Version +licenses.license=License + +#survey +survey.nav=Survey +survey.title=Stirling-PDF Survey +survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! +survey.please=Please consider taking our survey! +survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) +survey.button=Take Survey +survey.dontShowAgain=Don't show again + + +#error +error.sorry=Beklager fejlen! +error.needHelp=Brug for hjælp / Fundet et problem? +error.contactTip=Hvis du stadig har problemer, skal du endelig tage kontakt til os, for at få hjælp. Du kan oprette en ticket på vores Github-side eller tage kontakt til os via Discord: +error.404.head=404 - Siden ikke fundet | Ups, vi er viklet helt ind i kode! +error.404.1=Vi kan ikke finde siden du leder efter. +error.404.2=Noget gik galt +error.github=Indsend en ticket på GitHub +error.showStack=Vis Stack Trace +error.copyStack=Kopier Stack Trace +error.githubSubmit=GitHub - Indsend en ticket +error.discordSubmit=Discord - Indsend Support post diff --git a/src/main/resources/static/images/flags/dk.svg b/src/main/resources/static/images/flags/dk.svg new file mode 100644 index 00000000..563277f8 --- /dev/null +++ b/src/main/resources/static/images/flags/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html index e5babada..e625adf7 100644 --- a/src/main/resources/templates/fragments/languages.html +++ b/src/main/resources/templates/fragments/languages.html @@ -4,6 +4,7 @@ icon Català icon 简体中文 icon 繁體中文 + icon Dansk icon Deutsch icon English (GB) icon English (US) -- 2.46.1 From 39cbb5e7d98a08ae24ada51f398c2962b832a864 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 00:10:12 +0100 Subject: [PATCH 044/231] :memo: Update README: Translation Progress Table (#1615) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- scripts/ignore_translation.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index 0479527e..0a9512c2 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -25,6 +25,11 @@ ignore = [ 'text', ] +[da_DK] +ignore = [ + 'language.direction', +] + [de_DE] ignore = [ 'AddStampRequest.alphabet', -- 2.46.1 From c54c18b2475346f9e0eacf09b982b9e85a8a2943 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 3 Aug 2024 11:16:26 +0200 Subject: [PATCH 045/231] Add: Irish and Danish to the table (#1622) --- README.md | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index c95b8b83..5c477ccc 100644 --- a/README.md +++ b/README.md @@ -165,43 +165,45 @@ Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR ## Supported Languages -Stirling PDF currently supports 34! +Stirling PDF currently supports 38! | Language | Progress | | ------------------------------------------- | -------------------------------------- | +| Arabic (العربية) (ar_AR) | ![45%](https://geps.dev/progress/45) | +| Basque (Euskara) (eu_ES) | ![62%](https://geps.dev/progress/62) | +| Bulgarian (Български) (bg_BG) | ![94%](https://geps.dev/progress/94) | +| Catalan (Català) (ca_CA) | ![48%](https://geps.dev/progress/48) | +| Croatian (Hrvatski) (hr_HR) | ![95%](https://geps.dev/progress/95) | +| Czech (Česky) (cs_CZ) | ![90%](https://geps.dev/progress/90) | +| Danish (Dansk) (da_DK) | ![10%](https://geps.dev/progress/10) | +| Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| Arabic (العربية) (ar_AR) | ![45%](https://geps.dev/progress/45) | -| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | -| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | -| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | -| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | -| Catalan (Català) (ca_CA) | ![48%](https://geps.dev/progress/48) | -| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Swedish (Svenska) (sv_SE) | ![39%](https://geps.dev/progress/39) | -| Polish (Polski) (pl_PL) | ![90%](https://geps.dev/progress/90) | -| Romanian (Română) (ro_RO) | ![39%](https://geps.dev/progress/39) | -| Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | -| Portuguese Brazilian (Português) (pt_BR) | ![60%](https://geps.dev/progress/60) | -| Portuguese (Português) (pt_PT) | ![78%](https://geps.dev/progress/78) | -| Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | -| Basque (Euskara) (eu_ES) | ![62%](https://geps.dev/progress/62) | -| Japanese (日本語) (ja_JP) | ![90%](https://geps.dev/progress/90) | -| Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | +| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | | Greek (Ελληνικά) (el_GR) | ![82%](https://geps.dev/progress/82) | -| Turkish (Türkçe) (tr_TR) | ![99%](https://geps.dev/progress/99) | -| Indonesia (Bahasa Indonesia) (id_ID) | ![76%](https://geps.dev/progress/76) | | Hindi (हिंदी) (hi_IN) | ![77%](https://geps.dev/progress/77) | | Hungarian (Magyar) (hu_HU) | ![76%](https://geps.dev/progress/76) | -| Bulgarian (Български) (bg_BG) | ![94%](https://geps.dev/progress/94) | -| Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![78%](https://geps.dev/progress/78) | -| Ukrainian (Українська) (uk_UA) | ![90%](https://geps.dev/progress/90) | -| Slovakian (Slovensky) (sk_SK) | ![92%](https://geps.dev/progress/92) | -| Czech (Česky) (cs_CZ) | ![90%](https://geps.dev/progress/90) | -| Croatian (Hrvatski) (hr_HR) | ![95%](https://geps.dev/progress/95) | +| Indonesia (Bahasa Indonesia) (id_ID) | ![76%](https://geps.dev/progress/76) | +| Irish (Gaeilge) (ga_IE) | ![99%](https://geps.dev/progress/99) | +| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | +| Japanese (日本語) (ja_JP) | ![90%](https://geps.dev/progress/90) | +| Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | | Norwegian (Norsk) (no_NB) | ![96%](https://geps.dev/progress/96) | +| Polish (Polski) (pl_PL) | ![90%](https://geps.dev/progress/90) | +| Portuguese (Português) (pt_PT) | ![78%](https://geps.dev/progress/78) | +| Portuguese Brazilian (Português) (pt_BR) | ![60%](https://geps.dev/progress/60) | +| Romanian (Română) (ro_RO) | ![39%](https://geps.dev/progress/39) | +| Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | +| Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![78%](https://geps.dev/progress/78) | +| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | +| Slovakian (Slovensky) (sk_SK) | ![92%](https://geps.dev/progress/92) | +| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | +| Swedish (Svenska) (sv_SE) | ![39%](https://geps.dev/progress/39) | | Thai (ไทย) (th_TH) | ![100%](https://geps.dev/progress/100) | +| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | +| Turkish (Türkçe) (tr_TR) | ![99%](https://geps.dev/progress/99) | +| Ukrainian (Українська) (uk_UA) | ![90%](https://geps.dev/progress/90) | | Vietnamese (Tiếng Việt) (vi_VN) | ![99%](https://geps.dev/progress/99) | ## Contributing (creating issues, translations, fixing bugs, etc.) -- 2.46.1 From 191e79da18eee10b75246084cee6245455962ccb Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 3 Aug 2024 10:29:34 +0100 Subject: [PATCH 046/231] Update test.yml (#1623) * Update test.yml * Update SPdfApplication.java --- .github/workflows/test.yml | 4 ++-- src/main/java/stirling/software/SPDF/SPdfApplication.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0852bcf9..c4a4ff31 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,8 +29,8 @@ jobs: - name: Install Docker Compose run: | - sudo curl -SL "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - # sudo chmod +x /usr/local/bin/docker-compose + sudo curl -SL "https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose - name: Set up Python uses: actions/setup-python@v4 diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java index f49fe300..3b4ea174 100644 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ b/src/main/java/stirling/software/SPDF/SPdfApplication.java @@ -45,7 +45,6 @@ public class SPdfApplication { // Check if the BROWSER_OPEN environment variable is set to true String browserOpenEnv = env.getProperty("BROWSER_OPEN"); boolean browserOpen = browserOpenEnv != null && "true".equalsIgnoreCase(browserOpenEnv); - if (browserOpen) { try { String url = "http://localhost:" + getNonStaticPort(); -- 2.46.1 From ea6d4a293e3b4d103a310f947c8c906d943b1912 Mon Sep 17 00:00:00 2001 From: Manohar Mannam Date: Sat, 3 Aug 2024 15:00:53 +0530 Subject: [PATCH 047/231] blank pages returns removed pages for verification #1574 (#1619) separated blank and non-blank pages and created unified ZIP archive Co-authored-by: mannam <101550345+ManoharMannam@users.noreply.github.com> Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- .../api/misc/BlankPageController.java | 82 ++++++++++++------- 1 file changed, 53 insertions(+), 29 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java index 59fc0be7..4c050355 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java @@ -1,12 +1,12 @@ package stirling.software.SPDF.controller.api.misc; import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; @@ -17,6 +17,7 @@ import org.apache.pdfbox.text.PDFTextStripper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -50,31 +51,31 @@ public class BlankPageController { int threshold = request.getThreshold(); float whitePercent = request.getWhitePercent(); - PDDocument document = null; - try { - document = Loader.loadPDF(inputFile.getBytes()); + try (PDDocument document = Loader.loadPDF(inputFile.getBytes())) { PDPageTree pages = document.getDocumentCatalog().getPages(); PDFTextStripper textStripper = new PDFTextStripper(); - List pagesToKeepIndex = new ArrayList<>(); + List nonBlankPages = new ArrayList<>(); + List blankPages = new ArrayList<>(); int pageIndex = 0; + PDFRenderer pdfRenderer = new PDFRenderer(document); pdfRenderer.setSubsamplingAllowed(true); for (PDPage page : pages) { - logger.info("checking page " + pageIndex); + logger.info("checking page {}", pageIndex); textStripper.setStartPage(pageIndex + 1); textStripper.setEndPage(pageIndex + 1); String pageText = textStripper.getText(document); boolean hasText = !pageText.trim().isEmpty(); - Boolean blank = true; + boolean blank = true; if (hasText) { - logger.info("page " + pageIndex + " has text, not blank"); + logger.info("page {} has text, not blank", pageIndex); blank = false; } else { boolean hasImages = PdfUtils.hasImagesOnPage(page); if (hasImages) { - logger.info("page " + pageIndex + " has image, running blank detection"); + logger.info("page {} has image, running blank detection", pageIndex); // Render image and save as temp file BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 30); blank = isBlankImage(image, threshold, whitePercent, threshold); @@ -82,34 +83,57 @@ public class BlankPageController { } if (blank) { - logger.info("Skipping, Image was blank for page #" + pageIndex); + logger.info("Skipping, Image was blank for page #{}", pageIndex); + blankPages.add(page); } else { - logger.info("page " + pageIndex + " has image which is not blank"); - pagesToKeepIndex.add(pageIndex); + logger.info("page {} has image which is not blank", pageIndex); + nonBlankPages.add(page); } pageIndex++; } - // Remove pages not present in pagesToKeepIndex - List pageIndices = - IntStream.range(0, pages.getCount()).boxed().collect(Collectors.toList()); - Collections.reverse(pageIndices); // Reverse to prevent index shifting during removal - for (Integer i : pageIndices) { - if (!pagesToKeepIndex.contains(i)) { - pages.remove(i); - } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ZipOutputStream zos = new ZipOutputStream(baos); + + String filename = + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", ""); + + if (!nonBlankPages.isEmpty()) { + createZipEntry(zos, nonBlankPages, filename + "_nonBlankPages.pdf"); + } else { + createZipEntry(zos, blankPages, filename + "_allBlankPages.pdf"); } - return WebResponseUtils.pdfDocToWebResponse( - document, - Filenames.toSimpleFileName(inputFile.getOriginalFilename()) - .replaceFirst("[.][^.]+$", "") - + "_blanksRemoved.pdf"); + if (!nonBlankPages.isEmpty() && !blankPages.isEmpty()) { + createZipEntry(zos, blankPages, filename + "_blankPages.pdf"); + } + + zos.close(); + + logger.info("Returning ZIP file: {}", filename + "_processed.zip"); + return WebResponseUtils.boasToWebResponse( + baos, filename + "_processed.zip", MediaType.APPLICATION_OCTET_STREAM); + } catch (IOException e) { logger.error("exception", e); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); - } finally { - if (document != null) document.close(); + } + } + + public void createZipEntry(ZipOutputStream zos, List pages, String entryName) + throws IOException { + try (PDDocument document = new PDDocument()) { + + for (PDPage page : pages) { + document.addPage(page); + } + + ZipEntry zipEntry = new ZipEntry(entryName); + zos.putNextEntry(zipEntry); + document.save(zos); + zos.closeEntry(); } } -- 2.46.1 From 0ed4c16dc003954434ef7954cb96d1d9e1312cdc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 3 Aug 2024 10:33:57 +0100 Subject: [PATCH 048/231] Bump io.spring.dependency-management from 1.1.5 to 1.1.6 (#1579) Bumps [io.spring.dependency-management](https://github.com/spring-gradle-plugins/dependency-management-plugin) from 1.1.5 to 1.1.6. - [Release notes](https://github.com/spring-gradle-plugins/dependency-management-plugin/releases) - [Commits](https://github.com/spring-gradle-plugins/dependency-management-plugin/compare/v1.1.5...v1.1.6) --- updated-dependencies: - dependency-name: io.spring.dependency-management dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0dde7af5..1d15af47 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id "java" id "org.springframework.boot" version "3.3.0" - id "io.spring.dependency-management" version "1.1.5" + id "io.spring.dependency-management" version "1.1.6" id "org.springdoc.openapi-gradle-plugin" version "1.8.0" id "io.swagger.swaggerhub" version "1.3.2" id "edu.sc.seis.launch4j" version "3.0.5" -- 2.46.1 From 0f60974a57a9d44621d132c7cba5a3c037d78257 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 3 Aug 2024 10:44:17 +0100 Subject: [PATCH 049/231] Update examples.feature (#1624) --- cucumber/features/examples.feature | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cucumber/features/examples.feature b/cucumber/features/examples.feature index c6477466..5c5d9da7 100644 --- a/cucumber/features/examples.feature +++ b/cucumber/features/examples.feature @@ -92,10 +92,10 @@ Feature: API Validation | threshold | 90 | | whitePercent | 99.9 | When I send the API request to the endpoint "/api/v1/misc/remove-blanks" - Then the response content type should be "application/pdf" + Then the response content type should be "application/octet-stream" + And the response file should have extension ".zip" + And the response ZIP should contain 2 files And the response file should have size greater than 0 - And the response PDF should contain 0 pages - And the response status code should be 200 @positive @flatten Scenario: Flatten PDF @@ -127,4 +127,4 @@ Feature: API Validation And the response PDF metadata should include "Title" as "Sample Title" And the response status code should be 200 - \ No newline at end of file + -- 2.46.1 From e6793bd04a0650d42a4590515877645ca6cf9813 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 3 Aug 2024 13:52:50 +0200 Subject: [PATCH 050/231] Fix: fail JUnit test (#1625) --- .../SPDF/{utils => }/SPdfApplicationTest.java | 39 +++++++++++++++++-- .../software/SPDF/utils/FileToPdfTest.java | 2 +- 2 files changed, 36 insertions(+), 5 deletions(-) rename src/test/java/stirling/software/SPDF/{utils => }/SPdfApplicationTest.java (52%) diff --git a/src/test/java/stirling/software/SPDF/utils/SPdfApplicationTest.java b/src/test/java/stirling/software/SPDF/SPdfApplicationTest.java similarity index 52% rename from src/test/java/stirling/software/SPDF/utils/SPdfApplicationTest.java rename to src/test/java/stirling/software/SPDF/SPdfApplicationTest.java index f9229b64..350aef74 100644 --- a/src/test/java/stirling/software/SPDF/utils/SPdfApplicationTest.java +++ b/src/test/java/stirling/software/SPDF/SPdfApplicationTest.java @@ -1,10 +1,11 @@ -package stirling.software.SPDF.utils; +package stirling.software.SPDF; import static org.junit.jupiter.api.Assertions.*; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -14,7 +15,6 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.core.env.Environment; -import stirling.software.SPDF.SPdfApplication; import stirling.software.SPDF.model.ApplicationProperties; @ExtendWith(MockitoExtension.class) @@ -43,12 +43,43 @@ public class SPdfApplicationTest { @Test public void testMainApplicationStartup() throws IOException, InterruptedException { + // Setup mock environment for the main method + Path configPath = Path.of("test/configs"); + Path settingsPath = Paths.get("test/configs/settings.yml"); + Path customSettingsPath = Paths.get("test/configs/custom_settings.yml"); + Path staticPath = Path.of("test/customFiles/static/"); + Path templatesPath = Path.of("test/customFiles/templates/"); + + // Ensure the files do not exist for the test + if (Files.exists(settingsPath)) { + Files.delete(settingsPath); + } + if (Files.exists(customSettingsPath)) { + Files.delete(customSettingsPath); + } + if (Files.exists(staticPath)) { + Files.delete(staticPath); + } + if (Files.exists(templatesPath)) { + Files.delete(templatesPath); + } + + // Ensure the directories are created for testing + Files.createDirectories(configPath); + Files.createDirectories(staticPath); + Files.createDirectories(templatesPath); + + Files.createFile(settingsPath); + Files.createFile(customSettingsPath); + // Run the main method SPdfApplication.main(new String[]{}); // Verify that the directories were created - assertTrue(Files.exists(Path.of("customFiles/static/"))); - assertTrue(Files.exists(Path.of("customFiles/templates/"))); + assertTrue(Files.exists(settingsPath)); + assertTrue(Files.exists(customSettingsPath)); + assertTrue(Files.exists(staticPath)); + assertTrue(Files.exists(templatesPath)); } @Test diff --git a/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java b/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java index 66c19539..585f677b 100644 --- a/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java +++ b/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java @@ -13,7 +13,7 @@ public class FileToPdfTest { @Test public void testConvertHtmlToPdf() { HTMLToPdfRequest request = new HTMLToPdfRequest(); - byte[] fileBytes = new byte[10]; // Sample file bytes + byte[] fileBytes = new byte[0]; // Sample file bytes String fileName = "test.html"; // Sample file name boolean htmlFormatsInstalled = true; // Sample boolean value -- 2.46.1 From 950a0c4b2184ae8136398851428cb8d7d418bcd2 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 3 Aug 2024 14:18:51 +0200 Subject: [PATCH 051/231] Bump org.springframework.boot from 3.3.0 to 3.3.2 & Gradle 8 compatibility (#1626) Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- .github/labeler-config.yml | 2 +- build.gradle | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index 376ee372..d96a2a19 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -46,4 +46,4 @@ Docker: Test: - changed-files: - any-glob-to-any-file: 'cucumber/**/*' - - any-glob-to-any-file: 'test*' + - any-glob-to-any-file: 'src/test**/*' diff --git a/build.gradle b/build.gradle index 1d15af47..c4787869 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "org.springframework.boot" version "3.3.0" + id "org.springframework.boot" version "3.3.2" id "io.spring.dependency-management" version "1.1.6" id "org.springdoc.openapi-gradle-plugin" version "1.8.0" id "io.swagger.swaggerhub" version "1.3.2" @@ -18,8 +18,10 @@ ext { group = "stirling.software" version = "0.26.2" -// 17 is lowest but we support and recommend 21 -sourceCompatibility = "17" +java { + // 17 is lowest but we support and recommend 21 + sourceCompatibility = JavaVersion.VERSION_17 +} repositories { mavenCentral() @@ -106,7 +108,7 @@ dependencies { // implementation "org.yaml:snakeyaml:2.2" implementation 'com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4' - + // Exclude Tomcat and include Jetty implementation("org.springframework.boot:spring-boot-starter-web:$springBootVersion") { exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat" @@ -196,7 +198,7 @@ compileJava { options.compilerArgs << "-parameters" } -task writeVersion { +task writeVersion { def propsFile = file("src/main/resources/version.properties") def props = new Properties() props.setProperty("version", version) @@ -226,6 +228,6 @@ tasks.named("test") { useJUnitPlatform() } -task printVersion { +task printVersion { println project.version } -- 2.46.1 From 510f39ad410f2e632758a65bbe46266fdeeef424 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 3 Aug 2024 13:47:47 +0100 Subject: [PATCH 052/231] Update examples.feature --- cucumber/features/examples.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cucumber/features/examples.feature b/cucumber/features/examples.feature index 5c5d9da7..6252b76a 100644 --- a/cucumber/features/examples.feature +++ b/cucumber/features/examples.feature @@ -94,7 +94,7 @@ Feature: API Validation When I send the API request to the endpoint "/api/v1/misc/remove-blanks" Then the response content type should be "application/octet-stream" And the response file should have extension ".zip" - And the response ZIP should contain 2 files + And the response ZIP should contain 1 files And the response file should have size greater than 0 @positive @flatten -- 2.46.1 From d00e7fe958ac4c8fe315fa4891b7a46d16dbb8c9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Aug 2024 13:47:59 +0100 Subject: [PATCH 053/231] Update 3rd Party Licenses (#1627) Signed-off-by: GitHub Action Co-authored-by: GitHub Action --- .../resources/static/3rdPartyLicenses.json | 138 +++++++++--------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 4a96a99d..44c9bbdb 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -24,56 +24,56 @@ { "moduleName": "com.fasterxml.jackson.core:jackson-annotations", "moduleUrl": "https://github.com/FasterXML/jackson", - "moduleVersion": "2.17.1", + "moduleVersion": "2.17.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "com.fasterxml.jackson.core:jackson-core", "moduleUrl": "https://github.com/FasterXML/jackson-core", - "moduleVersion": "2.17.1", + "moduleVersion": "2.17.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "com.fasterxml.jackson.core:jackson-databind", "moduleUrl": "https://github.com/FasterXML/jackson", - "moduleVersion": "2.17.1", + "moduleVersion": "2.17.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", "moduleUrl": "https://github.com/FasterXML/jackson-dataformats-text", - "moduleVersion": "2.17.1", + "moduleVersion": "2.17.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", "moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8", - "moduleVersion": "2.17.1", + "moduleVersion": "2.17.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", "moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310", - "moduleVersion": "2.17.1", + "moduleVersion": "2.17.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "com.fasterxml.jackson.module:jackson-module-parameter-names", "moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names", - "moduleVersion": "2.17.1", + "moduleVersion": "2.17.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "com.fasterxml.jackson:jackson-bom", "moduleUrl": "https://github.com/FasterXML/jackson-bom", - "moduleVersion": "2.17.1", + "moduleVersion": "2.17.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -279,7 +279,7 @@ { "moduleName": "io.micrometer:micrometer-commons", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.13.0", + "moduleVersion": "1.13.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -293,14 +293,14 @@ { "moduleName": "io.micrometer:micrometer-jakarta9", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.13.0", + "moduleVersion": "1.13.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "io.micrometer:micrometer-observation", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.13.0", + "moduleVersion": "1.13.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -424,7 +424,7 @@ }, { "moduleName": "net.bytebuddy:byte-buddy", - "moduleVersion": "1.14.16", + "moduleVersion": "1.14.18", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -513,7 +513,7 @@ { "moduleName": "org.apache.tomcat.embed:tomcat-embed-el", "moduleUrl": "https://tomcat.apache.org/", - "moduleVersion": "10.1.24", + "moduleVersion": "10.1.26", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -533,7 +533,7 @@ { "moduleName": "org.aspectj:aspectjweaver", "moduleUrl": "https://www.eclipse.org/aspectj/", - "moduleVersion": "1.9.22", + "moduleVersion": "1.9.22.1", "moduleLicense": "Eclipse Public License - v 2.0", "moduleLicenseUrl": "https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt" }, @@ -587,182 +587,182 @@ { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-annotations", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-plus", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlet", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlets", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-webapp", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-client", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-common", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-server", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-api", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-common", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-alpn-client", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-client", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-ee", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-http", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-io", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-plus", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-security", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-server", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-session", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-util", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-xml", "moduleUrl": "https://eclipse.dev/jetty/", - "moduleVersion": "12.0.9", + "moduleVersion": "12.0.11", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, @@ -878,28 +878,28 @@ { "moduleName": "org.springframework.boot:spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-actuator", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-actuator-autoconfigure", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-autoconfigure", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -913,7 +913,7 @@ { "moduleName": "org.springframework.boot:spring-boot-starter", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -927,7 +927,7 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-aop", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -941,7 +941,7 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-jdbc", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -955,14 +955,14 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-json", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-logging", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -997,140 +997,140 @@ { "moduleName": "org.springframework.data:spring-data-commons", "moduleUrl": "https://spring.io/projects/spring-data", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.data:spring-data-jpa", "moduleUrl": "https://projects.spring.io/spring-data-jpa", - "moduleVersion": "3.3.0", + "moduleVersion": "3.3.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-config", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.0", + "moduleVersion": "6.3.1", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-core", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.0", + "moduleVersion": "6.3.1", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-crypto", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.0", + "moduleVersion": "6.3.1", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-oauth2-client", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.0", + "moduleVersion": "6.3.1", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-oauth2-core", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.0", + "moduleVersion": "6.3.1", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-oauth2-jose", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.0", + "moduleVersion": "6.3.1", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-web", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.0", + "moduleVersion": "6.3.1", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-aop", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-aspects", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-beans", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-context", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-core", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-expression", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-jcl", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-jdbc", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-orm", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-tx", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-web", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.8", + "moduleVersion": "6.1.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, -- 2.46.1 From 7db7192d9526ad8dafdad8d4e1e0c2fa4bed8c0a Mon Sep 17 00:00:00 2001 From: Mateusz Tylec <79941376+mateusztylec@users.noreply.github.com> Date: Sun, 4 Aug 2024 22:26:55 +0200 Subject: [PATCH 054/231] Update polish translation (#1631) --- src/main/resources/messages_pl_PL.properties | 179 +++++++------------ 1 file changed, 67 insertions(+), 112 deletions(-) diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 17e4cb7b..d00d61ba 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -38,13 +38,13 @@ delete=usuń username=nazwa użytkownika password=hasło welcome=Witaj -property=własnośc +property=własność black=czarny white=biały red=czerwony green=zielony blue=niebieski -custom=Własny +custom=Własny... WorkInProgess=Praca w toku, proszę zgłaszać błędy! poweredBy=Zasilany yes=tak @@ -93,7 +93,7 @@ pipeline.deletePrompt=Na pewno chcesz skasować automatyzacje ###################### pipelineOptions.header=Konfiguracja automatyzacji pipelineOptions.pipelineNameLabel=Nazwa automatyzacji -pipelineOptions.saveSettings=Zapisz automatyzacje +pipelineOptions.saveSettings=Zapisz ustawienia operacji pipelineOptions.pipelineNamePrompt=Podaj nazwę automatyzacji pipelineOptions.selectOperation=Wybierz operację pipelineOptions.addOperationButton=Dodaj operację @@ -125,7 +125,7 @@ navbar.sections.edit=Podgląd i edycja ############# settings.title=Ustawienia settings.update=Dostępna aktualizacja -settings.updateAvailable=Wersja {0} jest obecenia zainstalowana , dostępna jest nowa wersja({1}). +settings.updateAvailable=Wersja {0} jest obecenia zainstalowana, dostępna jest nowa wersja ({1}). settings.appVersion=Wersja aplikacji: settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP): settings.downloadOption.1=Otwórz w tym samym oknie @@ -152,7 +152,7 @@ changeCreds.submit=Zapisz zmiany account.title=Ustawienia konta account.accountSettings=Ustawienia konta account.adminSettings=Admin - kontrola kont -account.userControlSettings=Kontrola praw uzytkownika +account.userControlSettings=Kontrola praw użytkownika account.changeUsername=Zmień nazwę użytkownika account.newUsername=Nowa nazwa użytkownika account.password=Potwierdź hasło @@ -172,41 +172,41 @@ account.syncToAccount=Wczytaj dane konta z przeglądarki adminUserSettings.title=Ustawienia konta użytkownika adminUserSettings.header=Ustawienia praw administratora -adminUserSettings.admin=administrator -adminUserSettings.user=użytkownik -adminUserSettings.addUser=dodaj nowego użytkownika -adminUserSettings.deleteUser=usuń użytkownika -adminUserSettings.confirmDeleteUser=Czy na pewno usunąć użytkownika ? +adminUserSettings.admin=Administrator +adminUserSettings.user=Użytkownik +adminUserSettings.addUser=Dodaj nowego użytkownika +adminUserSettings.deleteUser=Usuń użytkownika +adminUserSettings.confirmDeleteUser=Czy na pewno usunąć użytkownika? adminUserSettings.usernameInfo=Niewłaściwa nazwa użytkownika - musi zawierać litery, cyfry i @._+- LUB być adresem email. adminUserSettings.roles=Role adminUserSettings.role=Rola adminUserSettings.actions=Akcje adminUserSettings.apiUser=Ograniczony Użytkownik API adminUserSettings.extraApiUser=Dodatkowy ograniczony Użytkownik API -adminUserSettings.webOnlyUser=Uzytkownik tylko WEB +adminUserSettings.webOnlyUser=Użytkownik tylko WEB adminUserSettings.demoUser=Użytkownik DEMO -adminUserSettings.internalApiUser=Wenętrzny użytkownik API +adminUserSettings.internalApiUser=Wewnętrzny użytkownik API adminUserSettings.forceChange=Wymuś zmianę hasło po zalogowaniu adminUserSettings.submit=Zapisz użytkownika adminUserSettings.changeUserRole=Zmień rolę użytkownika adminUserSettings.authenticated=Zalogowany -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Import/Eksport bazy danych +database.header=Import/Eksport bazy danych +database.fileName=Nazwa pliku +database.creationDate=Data utworzenia +database.fileSize=Rozmiar pliku +database.deleteBackupFile=Usuń plik kopii zapasowej +database.importBackupFile=Importuj plik kopii zapasowej +database.downloadBackupFile=Pobierz plik kopii zapasowej +database.info_1=Podczas importowania danych, ważne jest, aby upewnić się, że struktura jest poprawna. Jeśli nie jesteś pewien, co robisz, skontaktuj się z profesjonalistą. Błąd w strukturze może spowodować awarie aplikacji, aż do całkowitej niemożności jej uruchomienia. +database.info_2=Nazwa pliku nie ma znaczenia podczas przesyłania. Zostanie on później przemianowany, aby przestrzegać formatu backup_user_yyyyMMddHHmm.sql, zapewniając spójną konwencję nazewnictwa. +database.submit=Importuj kopię zapasową +database.importIntoDatabaseSuccessed=Import do bazy danych zakończony sukcesem +database.fileNotFound=Plik nie znaleziony +database.fileNullOrEmpty=Plik nie może być pusty +database.failedImportFile=Nie udało się zaimportować pliku ############# # HOME-PAGE # @@ -214,10 +214,9 @@ database.failedImportFile=Failed Import File home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związanych z dokumentami PDF. home.searchBar=Szukaj opcji ... - home.viewPdf.title=Podejrzyj PDF -home.viewPdf.desc=View, annotate, add text or images -viewPdf.tags=view,read,annotate,text,image +home.viewPdf.desc=Wyświetl, adnotuj, dodaj tekst lub obrazy +viewPdf.tags=wyświetl,czytaj,adnotuj,tekst,obraz home.multiTool.title=Multi narzędzie PDF home.multiTool.desc=Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony @@ -235,7 +234,6 @@ home.rotate.title=Obróć home.rotate.desc=Łatwo obracaj dokumenty PDF. rotate.tags=server side - home.imageToPdf.title=Obraz na PDF home.imageToPdf.desc=Konwertuj obraz (PNG, JPEG, GIF) do dokumentu PDF. imageToPdf.tags=conversion,img,jpg,picture,photo @@ -248,9 +246,8 @@ home.pdfOrganiser.title=Uporządkuj home.pdfOrganiser.desc=Usuń/Zmień kolejność stron w dowolnej kolejności pdfOrganiser.tags=duplex,even,odd,sort,move - home.addImage.title=Dodaj obraz -home.addImage.desc=Dodaje obraz w wybranym miejscu w dokumencie PDF (moduł w budowie) +home.addImage.desc=Dodaje obraz w wybranym miejscu w dokumencie PDF addImage.tags=img,jpg,picture,photo home.watermark.title=Dodaj znak wodny @@ -261,7 +258,6 @@ home.permissions.title=Zmień uprawnienia home.permissions.desc=Zmień uprawnienia dokumentu PDF permissions.tags=read,write,edit,print - home.removePages.title=Usuń home.removePages.desc=Usuń niechciane strony z dokumentu PDF. removePages.tags=Remove pages,delete pages @@ -278,10 +274,9 @@ home.compressPdfs.title=Kompresuj home.compressPdfs.desc=Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar. compressPdfs.tags=squish,small,tiny - home.changeMetadata.title=Zmień metadane home.changeMetadata.desc=Zmień/Usuń/Dodaj metadane w dokumencie PDF -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats +changeMetadata.tags=Title,author,date,creation,time,publisher,producer,stats home.fileToPDF.title=Konwertuj plik do PDF home.fileToPDF.desc=Konwertuj dowolny plik do dokumentu PDF (DOCX, PNG, XLS, PPT, TXT i więcej) @@ -291,7 +286,6 @@ home.ocr.title=OCR / Zamiana na tekst home.ocr.desc=OCR skanuje i wykrywa tekst z obrazów w dokumencie PDF i zamienia go na tekst. ocr.tags=recognition,text,image,scan,read,identify,detection,editable - home.extractImages.title=Wyodrębnij obrazy home.extractImages.desc=Wyodrębnia wszystkie obrazy z dokumentu PDF i zapisuje je w wybranym formacie extractImages.tags=picture,photo,save,archive,zip,capture,grab @@ -304,7 +298,7 @@ home.PDFToWord.title=PDF na Word home.PDFToWord.desc=Konwertuj dokument PDF na formaty Word (DOC, DOCX i ODT) PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile -home.PDFToPresentation.title=PDF na Prezentację +home.PDFToPresentation.title=PDF na Prezentację home.PDFToPresentation.desc=Konwertuj dokument PDF na formaty prezentacji (PPT, PPTX i ODP) PDFToPresentation.tags=slides,show,office,microsoft @@ -316,7 +310,6 @@ home.PDFToHTML.title=PDF na HTML home.PDFToHTML.desc=Konwertuj dokument PDF na format HTML PDFToHTML.tags=web content,browser friendly - home.PDFToXML.title=PDF na XML home.PDFToXML.desc=Konwertuj dokument PDF na format XML PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert @@ -326,7 +319,7 @@ home.ScannerImageSplit.desc=Podziel na wiele zdjęć z jednego zdjęcia/PDF ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize home.sign.title=Podpis -home.sign.desc=Dodaje podpis do dokument PDF za pomocą rysunku, tekstu lub obrazu +home.sign.desc=Dodaje podpis do dokumentu PDF za pomocą rysunku, tekstu lub obrazu sign.tags=authorize,initials,drawn-signature,text-sign,image-signature home.flatten.title=Spłaszcz @@ -370,7 +363,7 @@ home.pipeline.desc=Wykonaj wiele akcji na dokumentach PDF, tworząc automatyzacj pipeline.tags=automate,sequence,scripted,batch-process home.add-page-numbers.title=Dodaj numery stron -home.add-page-numbers.desc=Dodaj numbery strony w dokumencie PDF w podanej lokacji +home.add-page-numbers.desc=Dodaj numery strony w dokumencie PDF w podanej lokalizacji add-page-numbers.tags=paginate,label,organize,index home.auto-rename.title=Automatycznie zmień nazwę PDF @@ -382,7 +375,7 @@ home.adjust-contrast.desc=Zmień kolor/nasycenie/jasność w dokumencie PDF adjust-contrast.tags=color-correction,tune,modify,enhance home.crop.title=Przytnij PDF -home.crop.desc=Przytnij dokument PDF w celu zmiejszenia rozmiaru +home.crop.desc=Przytnij dokument PDF w celu zmniejszenia rozmiaru crop.tags=trim,shrink,edit,shape home.autoSplitPDF.title=Automatycznie podziel strony @@ -390,7 +383,7 @@ home.autoSplitPDF.desc=Automatycznie podziel dokument na strony autoSplitPDF.tags=QR-based,separate,scan-segment,organize home.sanitizePdf.title=Dezynfekcja -home.sanitizePdf.desc=Usuń skrupt i inne elementy z dokumentu PDF +home.sanitizePdf.desc=Usuń skrypt i inne elementy z dokumentu PDF sanitizePdf.tags=clean,secure,safe,remove-threats home.URLToPDF.title=Strona WWW do PDFa @@ -401,45 +394,38 @@ home.HTMLToPDF.title=HTML do PDF home.HTMLToPDF.desc=Zapisuje podany plik HTML/ZIP do PDF HTMLToPDF.tags=markup,web-content,transformation,convert - home.MarkdownToPDF.title=Markdown do PDF home.MarkdownToPDF.desc=Zapisuje dokument Markdown do PDF MarkdownToPDF.tags=markup,web-content,transformation,convert - home.getPdfInfo.title=Pobierz informacje o pliku PDF home.getPdfInfo.desc=Pobiera wszelkie informacje o pliku PDF getPdfInfo.tags=infomation,data,stats,statistics - home.extractPage.title=Wyciągnij stronę z PDF home.extractPage.desc=Wyciąga stronę z dokumentu PDF extractPage.tags=extract - home.PdfToSinglePage.title=PDF do jednej strony home.PdfToSinglePage.desc=Łączy wszystkie strony PDFa w jedną wielką stronę PDF PdfToSinglePage.tags=single page - home.showJS.title=Pokaż kod JavaScript home.showJS.desc=Znajduje i pokazuje załączony kod JS w dokumencie PDF showJS.tags=JS home.autoRedact.title=Zaciemnij -home.autoRedact.desc=Zaciemnia dokument PDF bazująć na podanej wartości +home.autoRedact.desc=Zaciemnia dokument PDF bazując na podanej wartości autoRedact.tags=Redact,Hide,black out,black,marker,hidden home.tableExtraxt.title=PDF do CSV -home.tableExtraxt.desc=Konwertuje table z PDF do pliku CSV +home.tableExtraxt.desc=Konwertuje tabele z PDF do pliku CSV tableExtraxt.tags=CSV,Table Extraction,extract,convert - home.autoSizeSplitPDF.title=Podziel (Rozmiar/Ilość stron) -home.autoSizeSplitPDF.desc=Rozdziela dokument PDF na wiele dokumentów bazujać na podanym rozmiarze, ilości stron bądź ilości dokumentów +home.autoSizeSplitPDF.desc=Rozdziela dokument PDF na wiele dokumentów bazując na podanym rozmiarze, ilości stron bądź ilości dokumentów autoSizeSplitPDF.tags=pdf,split,document,organization - home.overlay-pdfs.title=Nałóż PDFa home.overlay-pdfs.desc=Nakłada dokumenty PDF na siebie overlay-pdfs.tags=Overlay @@ -449,10 +435,9 @@ home.split-by-sections.desc=Podziel strony PDF w mniejsze sekcje split-by-sections.tags=Section Split, Divide, Customize home.AddStampRequest.title=Dodaj pieczęć -home.AddStampRequest.desc=Dodaj pieczęć tesktową/obrazową w wyznaczonej lokalizacji dokumentu +home.AddStampRequest.desc=Dodaj pieczęć tekstową/obrazową w wyznaczonej lokalizacji dokumentu AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize - home.PDFToBook.title=PDF do eBooka home.PDFToBook.desc=Zapisuje dokument PDF w formacie eBooka za pomocą Calibre PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle @@ -481,9 +466,8 @@ login.oauth2RequestNotFound=Błąd logowania OAuth2 login.oauth2InvalidUserInfoResponse=Niewłaściwe dane logowania login.oauth2invalidRequest=Nieprawidłowe żądanie login.oauth2AccessDenied=Brak dostępu -login.oauth2InvalidTokenResponse=Nieprawidłowy odpowiedź na token -login.oauth2InvalidIdToken=Nieprawidłowa wartośc tokenu - +login.oauth2InvalidTokenResponse=Nieprawidłowa odpowiedź na token +login.oauth2InvalidIdToken=Nieprawidłowa wartość tokenu #auto-redact autoRedact.title=Automatyczne zaciemnienie @@ -497,34 +481,29 @@ autoRedact.customPaddingLabel=Dodatkowe wypełnienie autoRedact.convertPDFToImageLabel=Przerób PDF na PDF-obrazowy (usuwa tekst w tle) autoRedact.submitButton=Wyślij - #showJS showJS.title=Pokaż Javascript showJS.header=Pokaż Javascript showJS.downloadJS=Pobierz Javascript showJS.submit=Pokaż - #pdfToSinglePage pdfToSinglePage.title=PDF do pojedyńczej strony pdfToSinglePage.header=PDF do pojedyńczej strony pdfToSinglePage.submit=Zapisz dokument jako PDF z jedną stroną - #pageExtracter pageExtracter.title=Wyciągnij stronę pageExtracter.header=Wyciągnij stronę pageExtracter.submit=Wyciągnij pageExtracter.placeholder=(przykład 1,2,8 lub 2n-1) - #getPdfInfo getPdfInfo.title=Pobierz informacje o pliku PDF getPdfInfo.header=Pobierz informacje o pliku PDF getPdfInfo.submit=Pobierz informacje getPdfInfo.downloadJson=Pobierz JSON z zawartością - #markdown-to-pdf MarkdownToPDF.title=Markdown do PDF MarkdownToPDF.header=Markdown do PDF @@ -532,15 +511,12 @@ MarkdownToPDF.submit=Konwertuj MarkdownToPDF.help=Prace trwają MarkdownToPDF.credit=Użyj WeasyPrint - - #url-to-pdf URLToPDF.title=URL do PDF URLToPDF.header=URL do PDF URLToPDF.submit=Konwertuj URLToPDF.credit=Użyj WeasyPrint - #html-to-pdf HTMLToPDF.title=HTML do PDF HTMLToPDF.header=HTML do PDF @@ -561,7 +537,6 @@ HTMLToPDF.none=Żaden HTMLToPDF.print=Drukuj HTMLToPDF.screen=Ekran - #AddStampRequest AddStampRequest.header=Pieczęć PDF AddStampRequest.title=Pieczęć PDF @@ -569,7 +544,7 @@ AddStampRequest.stampType=Typ pieczęci AddStampRequest.stampText=Tekst w pieczęci AddStampRequest.stampImage=Obraz w pieczęci AddStampRequest.alphabet=Alfabet -AddStampRequest.fontSize=Rozmiar Czcionki/Obrazu +AddStampRequest.fontSize=Rozmiar czcionki/obrazu AddStampRequest.rotation=Obrót AddStampRequest.opacity=Przeźroczystość AddStampRequest.position=Pozycja @@ -579,18 +554,16 @@ AddStampRequest.customMargin=Własny margines AddStampRequest.customColor=Własny kolor tekstu AddStampRequest.submit=Wyślij - #sanitizePDF sanitizePDF.title=Dezynfekuj PDF sanitizePDF.header=Dezynfekuj dokument PDF sanitizePDF.selectText.1=Usuń elementy JavaScript -sanitizePDF.selectText.2=Usuń załącznone pliki +sanitizePDF.selectText.2=Usuń załączone pliki sanitizePDF.selectText.3=Usuń metadane sanitizePDF.selectText.4=Usuń linki sanitizePDF.selectText.5=Usuń czcionki sanitizePDF.submit=Dezynfekuj PDF - #addPageNumbers addPageNumbers.title=Dodaj numerację stron addPageNumbers.header=Dodaj numerację stron @@ -601,51 +574,45 @@ addPageNumbers.selectText.4=Numer początkowy addPageNumbers.selectText.5=Ilość stron do ponumerowania addPageNumbers.selectText.6=Tekst własny addPageNumbers.customTextDesc=Tekst własny -addPageNumbers.numberPagesDesc=Strony do numeracji, wszystkie (all),1-5, 2,5,9 +addPageNumbers.numberPagesDesc=Strony do numeracji, wszystkie (all), 1-5, 2, 5, 9 addPageNumbers.customNumberDesc=Domyślnie do {n}, również akceptuje 'Strona {n} z {total},Teskt-{n},'{filename}-{n} addPageNumbers.submit=Dodaj numerację stron - #auto-rename -auto-rename.title=Automatczna zmiana nazwy -auto-rename.header=Automatczna zmiana nazwy dokumentu PDF -auto-rename.submit=Automatczna zmiana nazwy - +auto-rename.title=Automatyczna zmiana nazwy +auto-rename.header=Automatyczna zmiana nazwy dokumentu PDF +auto-rename.submit=Automatyczna zmiana nazwy #adjustContrast adjustContrast.title=Dopasuj kontrast adjustContrast.header=Dopasuj kontrast -adjustContrast.contrast=kontrast: -adjustContrast.brightness=jasność: -adjustContrast.saturation=nasycenie: +adjustContrast.contrast=Kontrast: +adjustContrast.brightness=Jasność: +adjustContrast.saturation=Nasycenie: adjustContrast.download=Pobierz - #crop crop.title=Przytnij crop.header=Przytnij dokument PDF crop.submit=Wyślij - #autoSplitPDF autoSplitPDF.title=Automatycznie podziel PDF autoSplitPDF.header=Automatycznie podziel PDF -autoSplitPDF.description=Drukuj, wstaw, skanuj, wyślij i pozwól nam automatycznie posortować dokumenty. +autoSplitPDF.description=Drukuj, wstaw, skanuj, wyślij i pozwól nam automatycznie posortować dokumenty. Bez ręcznego sortowania. autoSplitPDF.selectText.1=Wydrukuj strony separacji z poniższych wzorów - (mogą być czarno-białe) autoSplitPDF.selectText.2=Skanuj wszystkie swoje dokumenty na raz, wstawiając stronę separator między nie. -autoSplitPDF.selectText.3=Wyślij pojedyńczy duży plik PDF zawierający skan i pozwól Stirling zająć się resztą. -autoSplitPDF.selectText.4=Strony separacji sa automatycznie wykrywane i usuwane, gwarantując ładny finalny dokument. +autoSplitPDF.selectText.3=Wyślij pojedynczy duży plik PDF zawierający skan i pozwól Stirling PDF zająć się resztą. +autoSplitPDF.selectText.4=Strony separacji są automatycznie wykrywane i usuwane, gwarantując ładny finalny dokument. autoSplitPDF.formPrompt=Wyślij dokument PDF zawierający strony podziału z Stirling PDF. autoSplitPDF.duplexMode=Skanowanie dwustronne autoSplitPDF.dividerDownload1=Pobierz 'Auto Splitter Divider (minimal).pdf' autoSplitPDF.dividerDownload2=Pobierz 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.submit=Wyślij - #pipeline pipeline.title=Automatyzacja - #pageLayout pageLayout.title=Układ wielu stron pageLayout.header=Układ wielu stron @@ -653,7 +620,6 @@ pageLayout.pagesPerSheet=Stron na jednym arkuszu: pageLayout.addBorder=Dodaj granicę pageLayout.submit=Wykonaj - #scalePages scalePages.title=Dopasuj rozmiar stron scalePages.header=Dopasuj rozmiar stron @@ -661,16 +627,15 @@ scalePages.pageSize=Rozmiar stron dokumentu: scalePages.scaleFactor=Poziom powiększenia (przycięcia) stron: scalePages.submit=Wykonaj - #certSign certSign.title=Podpisywanie certyfikatem certSign.header=Podpisz dokument PDF certyfikatem prywatnym (moduł w budowie) certSign.selectPDF=Wybierz dokument PDF do podpisania: -certSign.jksNote=Notka: jeśli twój typ certyfikatu nie jest widoczny na liście , skonwertuj go do formatu Java Keystore (.jks) używając polecenia keytool. Następnie wybierz plik .JKS poniżej z listy. +certSign.jksNote=Notka: jeśli twój typ certyfikatu nie jest widoczny na liście, skonwertuj go do formatu Java Keystore (.jks) używając polecenia keytool. Następnie wybierz plik .JKS poniżej z listy. certSign.selectKey=Wybierz plik klucza prywatnego (format PKCS#8, może to być .pem lub .der): certSign.selectCert=Wybierz plik certyfikatu (format X.509, może to być .pem lub .der): certSign.selectP12=Wybierz plik magazynu kluczy PKCS#12 (.p12 lub .pfx) (opcjonalnie, jeśli jest podany, powinien zawierać klucz prywatny i certyfikat): -certSign.selectJKS=Wybierz plik Java Keystore(.jks lub .keystore): +certSign.selectJKS=Wybierz plik Java Keystore (.jks lub .keystore): certSign.certType=Typ certyfikatu certSign.password=Wprowadź hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje): certSign.showSig=Wyświetl podpis @@ -679,14 +644,12 @@ certSign.location=Lokalizacja certSign.name=Nazwa certSign.submit=Podpisz PDF - #removeCertSign removeCertSign.title=Usuń podpis cyfrowy removeCertSign.header=Usuń podpis cyfrowy z dokumentu PDF removeCertSign.selectPDF=Wskaż plik PDF: removeCertSign.submit=Usuń podpis cyfrowy - #removeBlanks removeBlanks.title=Usuń puste removeBlanks.header=Usuń puste strony @@ -792,7 +755,7 @@ extractImages.submit=Wyodrębnij fileToPDF.title=Plik na PDF fileToPDF.header=Konwertuj dowolny plik na dokument PDF fileToPDF.credit=Ta usługa używa LibreOffice i Unoconv do konwersji plików. -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=Obsługiwane typy plików fileToPDF.supportedFileTypes=Obsługiwane typy plików powinny być zgodne z poniższymi, jednak pełną zaktualizowaną listę obsługiwanych formatów można znaleźć w dokumentacji LibreOffice fileToPDF.submit=Konwertuj na PDF @@ -803,7 +766,7 @@ compress.header=Kompresuj PDF compress.credit=Ta usługa używa Ghostscript do kompresji/optymalizacji PDF. compress.selectText.1=Tryb ręczny - Od 1 do 4 compress.selectText.2=Poziom optymalizacji: -compress.selectText.3=4 (Straszne dla obrazów tekstowych) +compress.selectText.3=4 (Duże dla obrazów tekstowych) compress.selectText.4=Tryb automatyczny - Automatycznie dostosowuje jakość, aby uzyskać dokładny rozmiar pliku PDF compress.selectText.5=Oczekiwany rozmiar pliku PDF (np. 25 MB, 10,8 MB, 25 KB) compress.submit=Kompresuj @@ -820,12 +783,11 @@ addImage.submit=Dodaj obraz #merge merge.title=Połącz merge.header=Połącz wiele dokumentów PDF (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.removeCertSign=Remove digital signature in the merged file? +merge.sortByName=Sortuj po nazwie +merge.sortByDate=Sortuj po dacie +merge.removeCertSign=Usuń podpis cyfrowy w scalonym pliku? merge.submit=Połącz - #pdfOrganiser pdfOrganiser.title=Kolejność stron pdfOrganiser.header=Kolejność stron PDF @@ -834,7 +796,7 @@ pdfOrganiser.mode=Tryb pdfOrganiser.mode.1=Własna kolejność stron pdfOrganiser.mode.2=Odwrotny pdfOrganiser.mode.3=Dwustronny -pdfOrganiser.mode.4=Ksiązki +pdfOrganiser.mode.4=Książki pdfOrganiser.mode.5=Spiętej książki pdfOrganiser.mode.6=Rozdziel parzyste-nieparzyste pdfOrganiser.mode.7=Usuń pierwszą @@ -843,7 +805,6 @@ pdfOrganiser.mode.9=Usuń pierwszą i ostatnią pdfOrganiser.mode.10=Połącz parzyste i nieparzyste pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1) - #multiTool multiTool.title=Multi narzędzie PDF multiTool.header=Multi narzędzie PDF @@ -860,14 +821,12 @@ pageRemover.pagesToDelete=Strony do usunięcia (wprowadź listę numerów stron pageRemover.submit=Usuń strony pageRemover.placeholder=(przykład 1,3,2 lub 4-8,2,10-12) - #rotate rotate.title=Obróć dokument PDF rotate.header=Obróć dokument PDF rotate.selectAngle=Wybierz kąt obrotu (domyślnie 90 stopni): rotate.submit=Obróć - #split-pdfs split.title=Podziel dokument PDF split.header=Podziel dokument PDF @@ -882,8 +841,7 @@ split.desc.8=Dokument #6: Strona 10 split.splitPages=Wprowadź strony do podziału na: split.submit=Podziel - -#merge +#imageToPDF imageToPDF.title=Obraz na PDF imageToPDF.header=Obraz na PDF imageToPDF.submit=Konwertuj @@ -896,7 +854,6 @@ imageToPDF.selectText.3=Logika wielu plików (dostępna tylko w przypadku pracy imageToPDF.selectText.4=Połącz w jeden dokument PDF imageToPDF.selectText.5=Konwertuj na osobne dokumenty PDF - #pdfToImage pdfToImage.title=PDF na Obraz pdfToImage.header=PDF na Obraz @@ -910,13 +867,12 @@ pdfToImage.grey=Odcień szarości pdfToImage.blackwhite=Czarno-biały (może spowodować utratę danych!) pdfToImage.submit=Konwertuj - #addPassword addPassword.title=Dodaj hasło addPassword.header=Dodaj hasło (zaszyfruj) addPassword.selectText.1=Wybierz plik PDF do zaszyfrowania addPassword.selectText.2=Hasło -addPassword.selectText.3=Długość hasła +addPassword.selectText.3=Długość klucza szyfrowania addPassword.selectText.4=Wyższe wartości są silniejsze, ale niższe wartości zapewniają lepszą kompatybilność. addPassword.selectText.5=Uprawnienia do zmian addPassword.selectText.6=Zablokuj zmiany w dokumencie @@ -928,11 +884,10 @@ addPassword.selectText.11=Zablokuj modyfikacje adnotacji addPassword.selectText.12=Zablokuj drukowanie addPassword.selectText.13=Zablokuj drukowanie różnych formatów addPassword.selectText.14=Hasło właściciela -addPassword.selectText.15=Ogranicza akcje które można wykonać na dokumencie, kiedy jest otwarty (nie wspierany przez wszystkie przeglądarki) +addPassword.selectText.15=Ogranicza akcje, które można wykonać na dokumencie, kiedy jest otwarty (nie wspierany przez wszystkie przeglądarki) addPassword.selectText.16=Ogranicza otwarcie dokumentu addPassword.submit=Zablokuj - #watermark watermark.title=Dodaj znak wodny watermark.header=Dodaj znak wodny @@ -1045,7 +1000,7 @@ PDFToXML.submit=Konwertuj PDFToCSV.title=PDF na CSV PDFToCSV.header=PDF na CSV PDFToCSV.prompt=Choose page to extract table -PDFToCSV.submit=Wyci?g +PDFToCSV.submit=Zatwierdź #split-by-size-or-count split-by-size-or-count.title=Podziel PDF przez ilość stron bądź rozmiar @@ -1100,7 +1055,7 @@ licenses.title=Licencje stron trzecich licenses.header=Licencje stron trzecich licenses.module=Moduł licenses.version=Wersja -licenses.license=Licencha +licenses.license=Licencja #survey survey.nav=Ankieta -- 2.46.1 From ce70796fffe0edd3c1bddeb7f5d581f14255b261 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 09:10:14 +0100 Subject: [PATCH 055/231] Bump org.mockito:mockito-inline from 3.12.4 to 5.2.0 (#1635) Bumps [org.mockito:mockito-inline](https://github.com/mockito/mockito) from 3.12.4 to 5.2.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.4...v5.2.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-inline dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c4787869..07abc000 100644 --- a/build.gradle +++ b/build.gradle @@ -187,7 +187,7 @@ dependencies { compileOnly "org.projectlombok:lombok:1.18.32" annotationProcessor "org.projectlombok:lombok:1.18.32" - testImplementation 'org.mockito:mockito-inline:3.12.4' + testImplementation 'org.mockito:mockito-inline:5.2.0' } tasks.withType(JavaCompile).configureEach { -- 2.46.1 From ec537c6fde17bc7328afc6dba59d2d8686f4b00b Mon Sep 17 00:00:00 2001 From: mylk13 Date: Tue, 6 Aug 2024 10:11:52 +0200 Subject: [PATCH 056/231] Add a checkbox to WatermarkController to convert the pdf to pdf-image (#1633) * Add a checkbox to WatermarkController to convert the pdf to pdf-image * 381: Fix messages_en_GB --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- .../api/security/RedactController.java | 25 +++---------------- .../api/security/WatermarkController.java | 8 ++++++ .../api/security/AddWatermarkRequest.java | 3 +++ .../software/SPDF/utils/PdfUtils.java | 24 ++++++++++++++++++ src/main/resources/messages_en_GB.properties | 1 + src/main/resources/messages_en_US.properties | 1 + .../templates/security/add-watermark.html | 4 +++ 7 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java index 8a2a67c0..b3eec2b1 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java @@ -1,21 +1,14 @@ package stirling.software.SPDF.controller.api.security; import java.awt.Color; -import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.apache.pdfbox.rendering.ImageType; -import org.apache.pdfbox.rendering.PDFRenderer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; @@ -32,6 +25,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import stirling.software.SPDF.model.PDFText; import stirling.software.SPDF.model.api.security.RedactPdfRequest; import stirling.software.SPDF.pdf.TextFinder; +import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.WebResponseUtils; @RestController @@ -81,22 +75,9 @@ public class RedactController { } if (convertPDFToImage) { - PDDocument imageDocument = new PDDocument(); - PDFRenderer pdfRenderer = new PDFRenderer(document); - pdfRenderer.setSubsamplingAllowed(true); - for (int page = 0; page < document.getNumberOfPages(); ++page) { - BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); - PDPage newPage = new PDPage(new PDRectangle(bim.getWidth(), bim.getHeight())); - imageDocument.addPage(newPage); - PDImageXObject pdImage = LosslessFactory.createFromImage(imageDocument, bim); - PDPageContentStream contentStream = - new PDPageContentStream( - imageDocument, newPage, AppendMode.APPEND, true, true); - contentStream.drawImage(pdImage, 0, 0); - contentStream.close(); - } + PDDocument convertedPdf = PdfUtils.convertPdfToPdfImage(document); document.close(); - document = imageDocument; + document = convertedPdf; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java index 2133ae26..0b36cd5e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java @@ -36,6 +36,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import stirling.software.SPDF.model.api.security.AddWatermarkRequest; +import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.WebResponseUtils; @RestController @@ -60,6 +61,7 @@ public class WatermarkController { float opacity = request.getOpacity(); int widthSpacer = request.getWidthSpacer(); int heightSpacer = request.getHeightSpacer(); + boolean convertPdfToImage = request.isConvertPDFToImage(); // Load the input PDF PDDocument document = Loader.loadPDF(pdfFile.getBytes()); @@ -104,6 +106,12 @@ public class WatermarkController { contentStream.close(); } + if (convertPdfToImage) { + PDDocument convertedPdf = PdfUtils.convertPdfToPdfImage(document); + document.close(); + document = convertedPdf; + } + return WebResponseUtils.pdfDocToWebResponse( document, Filenames.toSimpleFileName(pdfFile.getOriginalFilename()) diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java index 861568bf..1f080fd2 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java @@ -44,4 +44,7 @@ public class AddWatermarkRequest extends PDFFile { @Schema(description = "The height spacer between watermark elements", example = "50") private int heightSpacer; + + @Schema(description = "Convert the redacted PDF to an image", defaultValue = "false") + private boolean convertPDFToImage; } diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 91cbb5cd..c1589902 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -341,6 +341,30 @@ public class PdfUtils { } } + /** + * Converts a given Pdf file to PDF-Image. + * + * @param document to be converted. Note: the caller is responsible for closing the document + * @return converted document to PDF-Image + * @throws IOException if conversion fails + */ + public static PDDocument convertPdfToPdfImage(PDDocument document) throws IOException { + PDDocument imageDocument = new PDDocument(); + PDFRenderer pdfRenderer = new PDFRenderer(document); + pdfRenderer.setSubsamplingAllowed(true); + for (int page = 0; page < document.getNumberOfPages(); ++page) { + BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); + PDPage newPage = new PDPage(new PDRectangle(bim.getWidth(), bim.getHeight())); + imageDocument.addPage(newPage); + PDImageXObject pdImage = LosslessFactory.createFromImage(imageDocument, bim); + PDPageContentStream contentStream = + new PDPageContentStream(imageDocument, newPage, AppendMode.APPEND, true, true); + contentStream.drawImage(pdImage, 0, 0); + contentStream.close(); + } + return imageDocument; + } + private static BufferedImage prepareImageForPdfToImage( int maxWidth, int height, String imageType) { BufferedImage combined; diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 79067b54..f6f77624 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (Space between each watermark vertically): watermark.selectText.7=Opacity (0% - 100%): watermark.selectText.8=Watermark Type: watermark.selectText.9=Watermark Image: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Add Watermark watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 1f38bf8c..b90bef09 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (Space between each watermark vertically): watermark.selectText.7=Opacity (0% - 100%): watermark.selectText.8=Watermark Type: watermark.selectText.9=Watermark Image: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Add Watermark watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/templates/security/add-watermark.html b/src/main/resources/templates/security/add-watermark.html index 71c32374..2b78709f 100644 --- a/src/main/resources/templates/security/add-watermark.html +++ b/src/main/resources/templates/security/add-watermark.html @@ -104,6 +104,10 @@
+
+ + +
-- 2.46.1 From dff53310a7debbecab42313faeb3f2b4e05862e9 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com.> Date: Tue, 6 Aug 2024 10:50:47 +0100 Subject: [PATCH 057/231] lang --- src/main/resources/messages_ar_AR.properties | 1 + src/main/resources/messages_bg_BG.properties | 1 + src/main/resources/messages_ca_CA.properties | 1 + src/main/resources/messages_cs_CZ.properties | 1 + src/main/resources/messages_da_DK.properties | 3 +- src/main/resources/messages_de_DE.properties | 1 + src/main/resources/messages_el_GR.properties | 1 + src/main/resources/messages_es_ES.properties | 1 + src/main/resources/messages_eu_ES.properties | 1 + src/main/resources/messages_fr_FR.properties | 1 + src/main/resources/messages_ga_IE.properties | 5 +- src/main/resources/messages_hi_IN.properties | 1 + src/main/resources/messages_hr_HR.properties | 1 + src/main/resources/messages_hu_HU.properties | 1 + src/main/resources/messages_id_ID.properties | 1 + src/main/resources/messages_it_IT.properties | 1 + src/main/resources/messages_ja_JP.properties | 1 + src/main/resources/messages_ko_KR.properties | 1 + src/main/resources/messages_nl_NL.properties | 1 + src/main/resources/messages_no_NB.properties | 1 + src/main/resources/messages_pl_PL.properties | 48 ++++++++++++++++++- src/main/resources/messages_pt_BR.properties | 1 + src/main/resources/messages_pt_PT.properties | 1 + src/main/resources/messages_ro_RO.properties | 1 + src/main/resources/messages_ru_RU.properties | 1 + src/main/resources/messages_sk_SK.properties | 1 + .../resources/messages_sr_LATN_RS.properties | 1 + src/main/resources/messages_sv_SE.properties | 1 + src/main/resources/messages_th_TH.properties | 1 + src/main/resources/messages_tr_TR.properties | 1 + src/main/resources/messages_uk_UA.properties | 1 + src/main/resources/messages_vi_VN.properties | 3 +- src/main/resources/messages_zh_CN.properties | 5 +- src/main/resources/messages_zh_TW.properties | 1 + 34 files changed, 86 insertions(+), 7 deletions(-) diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 30fb5715..3e194292 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (مسافة بين كل علامة مائي watermark.selectText.7=التعتيم (0٪ - 100٪): watermark.selectText.8=Watermark Type: watermark.selectText.9=Watermark Image: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=إضافة علامة مائية watermark.type.1=نص watermark.type.2=صورة diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 2207379c..43349364 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -945,6 +945,7 @@ watermark.selectText.6=дължинаSpacer (Разстояние между в watermark.selectText.7=Непрозрачност (0% - 100%): watermark.selectText.8=Тип воден знак: watermark.selectText.9=Изображение за воден знак: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Добавяне на воден знак watermark.type.1=Текст watermark.type.2=Изображение diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index f641fa52..8c400bfd 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -945,6 +945,7 @@ watermark.selectText.6=separació d'alçada (Espai vertical entre cada Marca d'A watermark.selectText.7=Opacitat (0% - 100%): watermark.selectText.8=Watermark Type: watermark.selectText.9=Watermark Image: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Afegir Marca d'Aigua watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 7f274dbb..6ca4cbf0 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -945,6 +945,7 @@ watermark.selectText.6=Výška mezery (Mezera mezi každým vodoznakem svisle): watermark.selectText.7=Průhlednost (0% - 100%): watermark.selectText.8=Typ vodoznaku: watermark.selectText.9=Obrázek vodoznaku: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Přidat vodoznak watermark.type.1=Text watermark.type.2=Obrázek diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index b89e26ef..a56596dd 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr = left to right, rtl = right to left) +# the direction that the language is written (ltr=left to right, rtl = right to left) language.direction=ltr pdfPrompt=Vælg PDF-fil(er) @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (Space between each watermark vertically): watermark.selectText.7=Opacity (0% - 100%): watermark.selectText.8=Watermark Type: watermark.selectText.9=Watermark Image: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Add Watermark watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index decbd9b0..3a75642d 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -945,6 +945,7 @@ watermark.selectText.6=höheSpacer (vertikaler Abstand zwischen den einzelnen Wa watermark.selectText.7=Deckkraft (0% - 100 %): watermark.selectText.8=Wasserzeichen Typ: watermark.selectText.9=Wasserzeichen-Bild: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Wasserzeichen hinzufügen watermark.type.1=Text watermark.type.2=Bild diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 6f32362d..b6db871f 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (Κενό μεταξύ κάθε υδατογ watermark.selectText.7=Αδιαφάνεια (Opacity) (0% - 100%): watermark.selectText.8=Τύπος Υδατογραφήματος: watermark.selectText.9=Εικόνα Υδατογραφήματος: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Προσθήκη Υδατογραφήματος watermark.type.1=Κείμενο watermark.type.2=Εικόνα diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index d3724753..58e38223 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -945,6 +945,7 @@ watermark.selectText.6=Alto (Espacio entre cada marca de agua verticalmente): watermark.selectText.7=Opacidad (0% - 100%): watermark.selectText.8=Tipo de marca de agua: watermark.selectText.9=Imagen de marca de agua: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Añadir marca de agua watermark.type.1=Texto watermark.type.2=Imagen diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 65dff466..57d808c1 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -945,6 +945,7 @@ watermark.selectText.6=Altuera (ur-marka bakoitzaren arteko espazioa bertikalean watermark.selectText.7=Opakutasuna (0% - 100%): watermark.selectText.8=Watermark Type: watermark.selectText.9=Watermark Image: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Gehitu ur-marka watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index d7bae3ea..8f6ff4de 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (espace entre chaque filigrane verticalement watermark.selectText.7=Opacité (de 0% à 100%) watermark.selectText.8=Type de filigrane watermark.selectText.9=Image du filigrane +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Ajouter un filigrane watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index 08993244..9a2b9cc4 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr = left to right, rtl = right to left) +# the direction that the language is written (ltr=left to right, rtl = right to left) language.direction=ltr pdfPrompt=Roghnaigh PDF(s) @@ -691,7 +691,7 @@ removeCertSign.submit=Bain Síniú removeBlanks.title=Bain Bearnaí removeBlanks.header=Bain Leathanaigh Bhána removeBlanks.threshold=Tairseach Bánachta picteilíní: -removeBlanks.thresholdDesc=An tairseach chun a chinneadh cé chomh bán is gá picteilín bán a bheith le rangú mar 'Bán'. 0 +removeBlanks.thresholdDesc=An tairseach chun a chinneadh cé chomh bán is gá picteilín bán a bheith le rangú mar 'Bán'. 0 removeBlanks.whitePercent=Céatadán Bán (%): removeBlanks.whitePercentDesc=Céatadán an leathanaigh a chaithfidh picteilíní 'bán' a bheith ann lena bhaint removeBlanks.submit=Bain Bearnaí @@ -945,6 +945,7 @@ watermark.selectText.6=spásaire airde (Spás idir gach comhartha uisce go hinge watermark.selectText.7=Teimhneacht (0% - 100%): watermark.selectText.8=Cineál Comhartha Uisce: watermark.selectText.9=Íomhá Comhartha Uisce: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Cuir Uisce leis watermark.type.1=Téacs watermark.type.2=Íomha diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 4938f49a..9b954bf1 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -945,6 +945,7 @@ watermark.selectText.6=ऊंचाई स्पेसर (प्रत्ये watermark.selectText.7=अपारदर्शिता (0% - 100%): watermark.selectText.8=वॉटरमार्क प्रकार: watermark.selectText.9=वॉटरमार्क छवि: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=वॉटरमार्क जोड़ें watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index c50613d6..b546a88f 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -945,6 +945,7 @@ watermark.selectText.6=Visina razmaka (Razmak između svakog vodenog žiga okomi watermark.selectText.7=Neprozirnost (0% - 100%): watermark.selectText.8=Vrsta vodenog žiga: watermark.selectText.9=Slika vodenog žiga: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Dodaj vodeni žig watermark.type.1=Tekst watermark.type.2=Slika diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 3967db38..57f33ce3 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (Hely a vízjelek között függőlegesen): watermark.selectText.7=Átlátszóság (0% - 100%): watermark.selectText.8=Vízjel típusa: watermark.selectText.9=Vízjel képe: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Vízjel hozzáadása watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index d31712bd..d29749dc 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (Spasi diantara setiap watermark vertikal): watermark.selectText.7=Opacity (0% - 100%): watermark.selectText.8=Tipe Watermark: watermark.selectText.9=Gambar Watermark: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Tambahkan Watermark watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index bcc78d5a..50566476 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -945,6 +945,7 @@ watermark.selectText.6=spazio verticale (tra ogni filigrana): watermark.selectText.7=Opacità (0% - 100%): watermark.selectText.8=Tipo di filigrana: watermark.selectText.9=Immagine filigrana: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Aggiungi Filigrana watermark.type.1=Testo watermark.type.2=Immagine diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 3f39dcd3..e2380980 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -945,6 +945,7 @@ watermark.selectText.6=高さスペース (各透かし間の垂直方向のス watermark.selectText.7=不透明度 (0% - 100%): watermark.selectText.8=透かしの種類: watermark.selectText.9=透かしの画像: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=透かしを追加 watermark.type.1=テキスト watermark.type.2=画像 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index cae46d9b..a0ccfb0a 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -945,6 +945,7 @@ watermark.selectText.6=세로 간격 (각 워터마크 사이의 세로 공간): watermark.selectText.7=투명도 (0% - 100%): watermark.selectText.8=워터마크 유형: watermark.selectText.9=워터마크 이미지: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=워터마크 추가 watermark.type.1=텍스트 watermark.type.2=이미지 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 6c43a399..c2c8271a 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -945,6 +945,7 @@ watermark.selectText.6=hoogteSpacer (Ruimte tussen elk watermerk verticaal): watermark.selectText.7=Transparantie (0% - 100%): watermark.selectText.8=Type watermerk: watermark.selectText.9=Watermerk afbeelding: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Watermerk toevoegen watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index dcf43342..5f92614e 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -945,6 +945,7 @@ watermark.selectText.6=Høydeavstand (Avstand mellom hvert vannmerke vertikalt): watermark.selectText.7=Opasitet (0% - 100%): watermark.selectText.8=Vannmerketype: watermark.selectText.9=Vannmerkebilde: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Legg til vannmerke watermark.type.1=Tekst watermark.type.2=Bilde diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index d00d61ba..858aabc8 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -214,6 +214,7 @@ database.failedImportFile=Nie udało się zaimportować pliku home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związanych z dokumentami PDF. home.searchBar=Szukaj opcji ... + home.viewPdf.title=Podejrzyj PDF home.viewPdf.desc=Wyświetl, adnotuj, dodaj tekst lub obrazy viewPdf.tags=wyświetl,czytaj,adnotuj,tekst,obraz @@ -234,6 +235,7 @@ home.rotate.title=Obróć home.rotate.desc=Łatwo obracaj dokumenty PDF. rotate.tags=server side + home.imageToPdf.title=Obraz na PDF home.imageToPdf.desc=Konwertuj obraz (PNG, JPEG, GIF) do dokumentu PDF. imageToPdf.tags=conversion,img,jpg,picture,photo @@ -246,6 +248,7 @@ home.pdfOrganiser.title=Uporządkuj home.pdfOrganiser.desc=Usuń/Zmień kolejność stron w dowolnej kolejności pdfOrganiser.tags=duplex,even,odd,sort,move + home.addImage.title=Dodaj obraz home.addImage.desc=Dodaje obraz w wybranym miejscu w dokumencie PDF addImage.tags=img,jpg,picture,photo @@ -258,6 +261,7 @@ home.permissions.title=Zmień uprawnienia home.permissions.desc=Zmień uprawnienia dokumentu PDF permissions.tags=read,write,edit,print + home.removePages.title=Usuń home.removePages.desc=Usuń niechciane strony z dokumentu PDF. removePages.tags=Remove pages,delete pages @@ -274,6 +278,7 @@ home.compressPdfs.title=Kompresuj home.compressPdfs.desc=Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar. compressPdfs.tags=squish,small,tiny + home.changeMetadata.title=Zmień metadane home.changeMetadata.desc=Zmień/Usuń/Dodaj metadane w dokumencie PDF changeMetadata.tags=Title,author,date,creation,time,publisher,producer,stats @@ -286,6 +291,7 @@ home.ocr.title=OCR / Zamiana na tekst home.ocr.desc=OCR skanuje i wykrywa tekst z obrazów w dokumencie PDF i zamienia go na tekst. ocr.tags=recognition,text,image,scan,read,identify,detection,editable + home.extractImages.title=Wyodrębnij obrazy home.extractImages.desc=Wyodrębnia wszystkie obrazy z dokumentu PDF i zapisuje je w wybranym formacie extractImages.tags=picture,photo,save,archive,zip,capture,grab @@ -310,6 +316,7 @@ home.PDFToHTML.title=PDF na HTML home.PDFToHTML.desc=Konwertuj dokument PDF na format HTML PDFToHTML.tags=web content,browser friendly + home.PDFToXML.title=PDF na XML home.PDFToXML.desc=Konwertuj dokument PDF na format XML PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert @@ -394,22 +401,27 @@ home.HTMLToPDF.title=HTML do PDF home.HTMLToPDF.desc=Zapisuje podany plik HTML/ZIP do PDF HTMLToPDF.tags=markup,web-content,transformation,convert + home.MarkdownToPDF.title=Markdown do PDF home.MarkdownToPDF.desc=Zapisuje dokument Markdown do PDF MarkdownToPDF.tags=markup,web-content,transformation,convert + home.getPdfInfo.title=Pobierz informacje o pliku PDF home.getPdfInfo.desc=Pobiera wszelkie informacje o pliku PDF getPdfInfo.tags=infomation,data,stats,statistics + home.extractPage.title=Wyciągnij stronę z PDF home.extractPage.desc=Wyciąga stronę z dokumentu PDF extractPage.tags=extract + home.PdfToSinglePage.title=PDF do jednej strony home.PdfToSinglePage.desc=Łączy wszystkie strony PDFa w jedną wielką stronę PDF PdfToSinglePage.tags=single page + home.showJS.title=Pokaż kod JavaScript home.showJS.desc=Znajduje i pokazuje załączony kod JS w dokumencie PDF showJS.tags=JS @@ -422,10 +434,12 @@ home.tableExtraxt.title=PDF do CSV home.tableExtraxt.desc=Konwertuje tabele z PDF do pliku CSV tableExtraxt.tags=CSV,Table Extraction,extract,convert + home.autoSizeSplitPDF.title=Podziel (Rozmiar/Ilość stron) home.autoSizeSplitPDF.desc=Rozdziela dokument PDF na wiele dokumentów bazując na podanym rozmiarze, ilości stron bądź ilości dokumentów autoSizeSplitPDF.tags=pdf,split,document,organization + home.overlay-pdfs.title=Nałóż PDFa home.overlay-pdfs.desc=Nakłada dokumenty PDF na siebie overlay-pdfs.tags=Overlay @@ -438,6 +452,7 @@ home.AddStampRequest.title=Dodaj pieczęć home.AddStampRequest.desc=Dodaj pieczęć tekstową/obrazową w wyznaczonej lokalizacji dokumentu AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + home.PDFToBook.title=PDF do eBooka home.PDFToBook.desc=Zapisuje dokument PDF w formacie eBooka za pomocą Calibre PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle @@ -469,6 +484,7 @@ login.oauth2AccessDenied=Brak dostępu login.oauth2InvalidTokenResponse=Nieprawidłowa odpowiedź na token login.oauth2InvalidIdToken=Nieprawidłowa wartość tokenu + #auto-redact autoRedact.title=Automatyczne zaciemnienie autoRedact.header=Automatyczne zaciemnienie @@ -481,29 +497,34 @@ autoRedact.customPaddingLabel=Dodatkowe wypełnienie autoRedact.convertPDFToImageLabel=Przerób PDF na PDF-obrazowy (usuwa tekst w tle) autoRedact.submitButton=Wyślij + #showJS showJS.title=Pokaż Javascript showJS.header=Pokaż Javascript showJS.downloadJS=Pobierz Javascript showJS.submit=Pokaż + #pdfToSinglePage pdfToSinglePage.title=PDF do pojedyńczej strony pdfToSinglePage.header=PDF do pojedyńczej strony pdfToSinglePage.submit=Zapisz dokument jako PDF z jedną stroną + #pageExtracter pageExtracter.title=Wyciągnij stronę pageExtracter.header=Wyciągnij stronę pageExtracter.submit=Wyciągnij pageExtracter.placeholder=(przykład 1,2,8 lub 2n-1) + #getPdfInfo getPdfInfo.title=Pobierz informacje o pliku PDF getPdfInfo.header=Pobierz informacje o pliku PDF getPdfInfo.submit=Pobierz informacje getPdfInfo.downloadJson=Pobierz JSON z zawartością + #markdown-to-pdf MarkdownToPDF.title=Markdown do PDF MarkdownToPDF.header=Markdown do PDF @@ -511,12 +532,15 @@ MarkdownToPDF.submit=Konwertuj MarkdownToPDF.help=Prace trwają MarkdownToPDF.credit=Użyj WeasyPrint + + #url-to-pdf URLToPDF.title=URL do PDF URLToPDF.header=URL do PDF URLToPDF.submit=Konwertuj URLToPDF.credit=Użyj WeasyPrint + #html-to-pdf HTMLToPDF.title=HTML do PDF HTMLToPDF.header=HTML do PDF @@ -537,6 +561,7 @@ HTMLToPDF.none=Żaden HTMLToPDF.print=Drukuj HTMLToPDF.screen=Ekran + #AddStampRequest AddStampRequest.header=Pieczęć PDF AddStampRequest.title=Pieczęć PDF @@ -554,6 +579,7 @@ AddStampRequest.customMargin=Własny margines AddStampRequest.customColor=Własny kolor tekstu AddStampRequest.submit=Wyślij + #sanitizePDF sanitizePDF.title=Dezynfekuj PDF sanitizePDF.header=Dezynfekuj dokument PDF @@ -564,6 +590,7 @@ sanitizePDF.selectText.4=Usuń linki sanitizePDF.selectText.5=Usuń czcionki sanitizePDF.submit=Dezynfekuj PDF + #addPageNumbers addPageNumbers.title=Dodaj numerację stron addPageNumbers.header=Dodaj numerację stron @@ -578,11 +605,13 @@ addPageNumbers.numberPagesDesc=Strony do numeracji, wszystkie (all), 1-5, 2, 5, addPageNumbers.customNumberDesc=Domyślnie do {n}, również akceptuje 'Strona {n} z {total},Teskt-{n},'{filename}-{n} addPageNumbers.submit=Dodaj numerację stron + #auto-rename auto-rename.title=Automatyczna zmiana nazwy auto-rename.header=Automatyczna zmiana nazwy dokumentu PDF auto-rename.submit=Automatyczna zmiana nazwy + #adjustContrast adjustContrast.title=Dopasuj kontrast adjustContrast.header=Dopasuj kontrast @@ -591,11 +620,13 @@ adjustContrast.brightness=Jasność: adjustContrast.saturation=Nasycenie: adjustContrast.download=Pobierz + #crop crop.title=Przytnij crop.header=Przytnij dokument PDF crop.submit=Wyślij + #autoSplitPDF autoSplitPDF.title=Automatycznie podziel PDF autoSplitPDF.header=Automatycznie podziel PDF @@ -610,9 +641,11 @@ autoSplitPDF.dividerDownload1=Pobierz 'Auto Splitter Divider (minimal).pdf' autoSplitPDF.dividerDownload2=Pobierz 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.submit=Wyślij + #pipeline pipeline.title=Automatyzacja + #pageLayout pageLayout.title=Układ wielu stron pageLayout.header=Układ wielu stron @@ -620,6 +653,7 @@ pageLayout.pagesPerSheet=Stron na jednym arkuszu: pageLayout.addBorder=Dodaj granicę pageLayout.submit=Wykonaj + #scalePages scalePages.title=Dopasuj rozmiar stron scalePages.header=Dopasuj rozmiar stron @@ -627,6 +661,7 @@ scalePages.pageSize=Rozmiar stron dokumentu: scalePages.scaleFactor=Poziom powiększenia (przycięcia) stron: scalePages.submit=Wykonaj + #certSign certSign.title=Podpisywanie certyfikatem certSign.header=Podpisz dokument PDF certyfikatem prywatnym (moduł w budowie) @@ -644,12 +679,14 @@ certSign.location=Lokalizacja certSign.name=Nazwa certSign.submit=Podpisz PDF + #removeCertSign removeCertSign.title=Usuń podpis cyfrowy removeCertSign.header=Usuń podpis cyfrowy z dokumentu PDF removeCertSign.selectPDF=Wskaż plik PDF: removeCertSign.submit=Usuń podpis cyfrowy + #removeBlanks removeBlanks.title=Usuń puste removeBlanks.header=Usuń puste strony @@ -788,6 +825,7 @@ merge.sortByDate=Sortuj po dacie merge.removeCertSign=Usuń podpis cyfrowy w scalonym pliku? merge.submit=Połącz + #pdfOrganiser pdfOrganiser.title=Kolejność stron pdfOrganiser.header=Kolejność stron PDF @@ -805,6 +843,7 @@ pdfOrganiser.mode.9=Usuń pierwszą i ostatnią pdfOrganiser.mode.10=Połącz parzyste i nieparzyste pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1) + #multiTool multiTool.title=Multi narzędzie PDF multiTool.header=Multi narzędzie PDF @@ -821,12 +860,14 @@ pageRemover.pagesToDelete=Strony do usunięcia (wprowadź listę numerów stron pageRemover.submit=Usuń strony pageRemover.placeholder=(przykład 1,3,2 lub 4-8,2,10-12) + #rotate rotate.title=Obróć dokument PDF rotate.header=Obróć dokument PDF rotate.selectAngle=Wybierz kąt obrotu (domyślnie 90 stopni): rotate.submit=Obróć + #split-pdfs split.title=Podziel dokument PDF split.header=Podziel dokument PDF @@ -841,7 +882,8 @@ split.desc.8=Dokument #6: Strona 10 split.splitPages=Wprowadź strony do podziału na: split.submit=Podziel -#imageToPDF + +#merge imageToPDF.title=Obraz na PDF imageToPDF.header=Obraz na PDF imageToPDF.submit=Konwertuj @@ -854,6 +896,7 @@ imageToPDF.selectText.3=Logika wielu plików (dostępna tylko w przypadku pracy imageToPDF.selectText.4=Połącz w jeden dokument PDF imageToPDF.selectText.5=Konwertuj na osobne dokumenty PDF + #pdfToImage pdfToImage.title=PDF na Obraz pdfToImage.header=PDF na Obraz @@ -867,6 +910,7 @@ pdfToImage.grey=Odcień szarości pdfToImage.blackwhite=Czarno-biały (może spowodować utratę danych!) pdfToImage.submit=Konwertuj + #addPassword addPassword.title=Dodaj hasło addPassword.header=Dodaj hasło (zaszyfruj) @@ -888,6 +932,7 @@ addPassword.selectText.15=Ogranicza akcje, które można wykonać na dokumencie, addPassword.selectText.16=Ogranicza otwarcie dokumentu addPassword.submit=Zablokuj + #watermark watermark.title=Dodaj znak wodny watermark.header=Dodaj znak wodny @@ -900,6 +945,7 @@ watermark.selectText.6=Odstęp w pionie (odstęp między każdym znakiem wodnym watermark.selectText.7=Nieprzezroczystość (0% - 100%): watermark.selectText.8=Typ znaku wodnego: watermark.selectText.9=Obraz znaku wodnego: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Dodaj znak wodny watermark.type.1=Tekst watermark.type.2=Obraz diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index 4e82820f..21c148b9 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -945,6 +945,7 @@ watermark.selectText.6=Espaçamento Vertical (heightSpacer) watermark.selectText.7=Opacidade (0% - 100%) watermark.selectText.8=Tipo de Marca d'Água watermark.selectText.9=Imagem da Marca d'Água +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Adicionar Marca d'Água watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 12fc44b4..88e898b8 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -945,6 +945,7 @@ watermark.selectText.6=Espaçamento Vertical (heightSpacer) watermark.selectText.7=Opacidade (0% - 100%) watermark.selectText.8=Tipo de Marca d'Água watermark.selectText.9=Imagem da Marca d'Água +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Adicionar Marca d'Água watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index b49f8d7e..ac41ceab 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (Spațiu între fiecare filigran pe vertical watermark.selectText.7=Opacitate (0% - 100%): watermark.selectText.8=Watermark Type: watermark.selectText.9=Watermark Image: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Adăugați Filigran watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index ad7c4df1..524a7c17 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (пробел между каждым вод watermark.selectText.7=Непрозрачность (0% - 100%): watermark.selectText.8=Тип водяного знака: watermark.selectText.9=Изображение водяного знака: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Добавить водяной знак watermark.type.1=Текст watermark.type.2=Изображение diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 94f2d1df..51501809 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -945,6 +945,7 @@ watermark.selectText.6=Výška medzery (Medzera medzi jednotlivými vodotlačami watermark.selectText.7=Priehľadnosť (0% - 100%): watermark.selectText.8=Typ vodotlače: watermark.selectText.9=Obrázok vodotlače: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Pridať vodotlač watermark.type.1=Text watermark.type.2=Obrázok diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index fe6f2ec7..3b76b2fb 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -945,6 +945,7 @@ watermark.selectText.6=Visina razmaka (Razmak između svakog vodenog žiga verti watermark.selectText.7=Opačitost (0% - 100%): watermark.selectText.8=Tip vodenog žiga: watermark.selectText.9=Slika vodenog žiga: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Dodaj vodeni žig watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index fc8fb437..ac49563c 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (mellanrum mellan varje vattenstämpel verti watermark.selectText.7=Opacitet (0% - 100%): watermark.selectText.8=Watermark Type: watermark.selectText.9=Watermark Image: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Lägg till vattenstämpel watermark.type.1=Text watermark.type.2=Image diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index 8c24d449..9fff7851 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -945,6 +945,7 @@ watermark.selectText.6=ตัวเว้นระยะความสูง ( watermark.selectText.7=ความทึบ (0% - 100%): watermark.selectText.8=ประเภทลายน้ำ: watermark.selectText.9=ภาพลายน้ำ: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=เพิ่มลายน้ำ watermark.type.1=ข้อความ watermark.type.2=ภาพ diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 5a082bc3..c0460a5a 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -945,6 +945,7 @@ watermark.selectText.6=yükseklikBoşluk (Dikeyde her filigran arasında boşluk watermark.selectText.7=Opaklık (0% - 100%): watermark.selectText.8=Filigran Türü: watermark.selectText.9=Filigran Resmi: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Filigran Ekle watermark.type.1=Metin watermark.type.2=Resim diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 9bd25283..8cf3c19c 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer (проміжок між кожним вод watermark.selectText.7=Непрозорість (0% - 100%): watermark.selectText.8=Тип водяного знаку: watermark.selectText.9=Зображення водяного знаку: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Додати водяний знак watermark.type.1=Текст watermark.type.2=Зображення diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index eda27872..bbf096af 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr = left to right, rtl = right to left) +# the direction that the language is written (ltr=left to right, rtl = right to left) language.direction=ltr pdfPrompt=Chọn (các) tệp PDF @@ -945,6 +945,7 @@ watermark.selectText.6=Khoảng cách dọc (Khoảng cách giữa mỗi hình m watermark.selectText.7=Độ mờ (0% - 100%): watermark.selectText.8=Loại hình mờ: watermark.selectText.9=Hình ảnh hình mờ: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=Thêm hình mờ watermark.type.1=Văn bản watermark.type.2=Hình ảnh diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 28af7518..bea1a70c 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -192,8 +192,8 @@ adminUserSettings.changeUserRole=更改用户角色 adminUserSettings.authenticated=已验证 -database.title=数据库 导入/导出 -database.header=数据库 导入/导出 +database.title=数据库 导入/导出 +database.header=数据库 导入/导出 database.fileName=文件名 database.creationDate=创建时间 database.fileSize=文件大小 @@ -945,6 +945,7 @@ watermark.selectText.6=垂直间距(每个水印之间的垂直距离): watermark.selectText.7=透明度(0% - 100%): watermark.selectText.8=水印类型: watermark.selectText.9=水印图片: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=添加水印 watermark.type.1=文字 watermark.type.2=图片 diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index c95659b8..145e75bf 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -945,6 +945,7 @@ watermark.selectText.6=heightSpacer(每個浮水印之間的垂直間距): watermark.selectText.7=不透明度(0% - 100%): watermark.selectText.8=浮水印類型: watermark.selectText.9=浮水印影像: +watermark.selectText.10=Convert PDF to PDF-Image watermark.submit=新增浮水印 watermark.type.1=文字 watermark.type.2=圖片 -- 2.46.1 From c09fc1541f891b97c3fdf05319069e85e3fa8d94 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 10:51:50 +0100 Subject: [PATCH 058/231] :memo: Update README: Translation Progress Table (#1636) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5c477ccc..6cc2a899 100644 --- a/README.md +++ b/README.md @@ -179,8 +179,8 @@ Stirling PDF currently supports 38! | Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | -| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | +| French (Français) (fr_FR) | ![93%](https://geps.dev/progress/93) | +| German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | | Greek (Ελληνικά) (el_GR) | ![82%](https://geps.dev/progress/82) | | Hindi (हिंदी) (hi_IN) | ![77%](https://geps.dev/progress/77) | | Hungarian (Magyar) (hu_HU) | ![76%](https://geps.dev/progress/76) | @@ -190,9 +190,9 @@ Stirling PDF currently supports 38! | Japanese (日本語) (ja_JP) | ![90%](https://geps.dev/progress/90) | | Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | | Norwegian (Norsk) (no_NB) | ![96%](https://geps.dev/progress/96) | -| Polish (Polski) (pl_PL) | ![90%](https://geps.dev/progress/90) | +| Polish (Polski) (pl_PL) | ![93%](https://geps.dev/progress/93) | | Portuguese (Português) (pt_PT) | ![78%](https://geps.dev/progress/78) | -| Portuguese Brazilian (Português) (pt_BR) | ![60%](https://geps.dev/progress/60) | +| Portuguese Brazilian (Português) (pt_BR) | ![59%](https://geps.dev/progress/59) | | Romanian (Română) (ro_RO) | ![39%](https://geps.dev/progress/39) | | Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | | Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![78%](https://geps.dev/progress/78) | @@ -200,7 +200,7 @@ Stirling PDF currently supports 38! | Slovakian (Slovensky) (sk_SK) | ![92%](https://geps.dev/progress/92) | | Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | | Swedish (Svenska) (sv_SE) | ![39%](https://geps.dev/progress/39) | -| Thai (ไทย) (th_TH) | ![100%](https://geps.dev/progress/100) | +| Thai (ไทย) (th_TH) | ![99%](https://geps.dev/progress/99) | | Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | | Turkish (Türkçe) (tr_TR) | ![99%](https://geps.dev/progress/99) | | Ukrainian (Українська) (uk_UA) | ![90%](https://geps.dev/progress/90) | -- 2.46.1 From f35cbc43105e2c344d867ea8ad82f12a300e1002 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Tue, 6 Aug 2024 10:57:18 +0100 Subject: [PATCH 059/231] enhancement auto have label --- .github/ISSUE_TEMPLATE/2-feature.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/2-feature.yml b/.github/ISSUE_TEMPLATE/2-feature.yml index 48af11e0..810f3fcd 100644 --- a/.github/ISSUE_TEMPLATE/2-feature.yml +++ b/.github/ISSUE_TEMPLATE/2-feature.yml @@ -1,6 +1,8 @@ name: Feature Request description: Submit a new feature request. title: "[Feature Request]: " +labels: + - enhancement body: - type: markdown attributes: -- 2.46.1 From 96b080528bb5f3b1a6646a8fa4cfe92f19d6757b Mon Sep 17 00:00:00 2001 From: arsvendg <106372750+arsvendg@users.noreply.github.com> Date: Wed, 7 Aug 2024 10:44:44 +0200 Subject: [PATCH 060/231] Changes norwegian translation (#1639) * Minor correction * Endringer oversettelser * Changes norwegian translation --- src/main/resources/messages_no_NB.properties | 36 ++++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 5f92614e..717eb8a5 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -192,21 +192,21 @@ adminUserSettings.changeUserRole=Endre Brukerens Rolle adminUserSettings.authenticated=Autentisert -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Database Import/Eksport +database.header=Database Import/Eksport +database.fileName=Fil navn +database.creationDate=Opprettelsesdato +database.fileSize=Filstørrelse +database.deleteBackupFile=Slett sikkerhetskopifil +database.importBackupFile=Importer sikkerhetskopifil +database.downloadBackupFile=Last ned sikkerhetskopifil +database.info_1=Når du importerer data, er det avgjørende å sikre riktig struktur. Hvis du er usikker på hva du gjør, bør du søke råd og støtte fra en profesjonell. En feil i strukturen kan føre til applikasjonsfeil, inkludert fullstendig manglende evne til å kjøre applikasjonen. +database.info_2=Filnavnet spiller ingen rolle ved opplasting. Det vil bli omdøpt etterpå for å følge formatet backup_user_yyyyMMddHHmm.sql, for å sikre en konsekvent navnekonvensjon. +database.submit=Importer sikkerhetskopi +database.importIntoDatabaseSuccessed=Import til database vellykket +database.fileNotFound=Fil ikke funnet +database.fileNullOrEmpty=Fil må ikke være tom eller null +database.failedImportFile=Import av fil mislyktes ############# # HOME-PAGE # @@ -706,8 +706,8 @@ removeAnnotations.submit=Fjern #compare compare.title=Sammenlign compare.header=Sammenlign PDF-er -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Uthevingsfarge 1: +compare.highlightColor.2=Uthevingsfarge 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Sammenlign @@ -945,7 +945,7 @@ watermark.selectText.6=Høydeavstand (Avstand mellom hvert vannmerke vertikalt): watermark.selectText.7=Opasitet (0% - 100%): watermark.selectText.8=Vannmerketype: watermark.selectText.9=Vannmerkebilde: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=Konverter PDF til PDF-Bilde watermark.submit=Legg til vannmerke watermark.type.1=Tekst watermark.type.2=Bilde -- 2.46.1 From e50391a44a3b36557c3602b0c6c018a639f3eae8 Mon Sep 17 00:00:00 2001 From: HimaGirija <68319906+HimaGirija99@users.noreply.github.com> Date: Thu, 8 Aug 2024 02:46:57 +0530 Subject: [PATCH 061/231] Added multithreaded feature for image extraction (#1641) Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- .../api/misc/ExtractImagesController.java | 198 +++++++++++------- 1 file changed, 123 insertions(+), 75 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java index 3931e2df..7fe27a03 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java @@ -1,19 +1,8 @@ package stirling.software.SPDF.controller.api.misc; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.awt.image.RenderedImage; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; -import java.util.zip.Deflater; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import javax.imageio.ImageIO; - +import io.github.pixee.security.Filenames; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.pdfbox.Loader; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; @@ -28,14 +17,25 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; - -import io.github.pixee.security.Filenames; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; - import stirling.software.SPDF.model.api.PDFWithImageFormatRequest; import stirling.software.SPDF.utils.WebResponseUtils; +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.zip.Deflater; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + @RestController @RequestMapping("/api/v1/misc") @Tag(name = "Misc", description = "Miscellaneous APIs") @@ -47,16 +47,19 @@ public class ExtractImagesController { @Operation( summary = "Extract images from a PDF file", description = - "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input:PDF Output:IMAGE/ZIP Type:SIMO") + "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input: PDF Output: IMAGE/ZIP Type: SIMO") public ResponseEntity extractImages(@ModelAttribute PDFWithImageFormatRequest request) - throws IOException { + throws IOException, InterruptedException, ExecutionException { MultipartFile file = request.getFileInput(); String format = request.getFormat(); System.out.println( - System.currentTimeMillis() + "file=" + file.getName() + ", format=" + format); + System.currentTimeMillis() + " file=" + file.getName() + ", format=" + format); PDDocument document = Loader.loadPDF(file.getBytes()); + // Determine if multithreading should be used based on PDF size or number of pages + boolean useMultithreading = shouldUseMultithreading(file, document); + // Create ByteArrayOutputStream to write zip file to byte array ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -66,71 +69,51 @@ public class ExtractImagesController { // Set compression level zos.setLevel(Deflater.BEST_COMPRESSION); - int imageIndex = 1; String filename = Filenames.toSimpleFileName(file.getOriginalFilename()) .replaceFirst("[.][^.]+$", ""); - int pageNum = 0; Set processedImages = new HashSet<>(); - // Iterate over each page - for (PDPage page : document.getPages()) { - ++pageNum; - // Extract images from page - for (COSName name : page.getResources().getXObjectNames()) { - if (page.getResources().isImageXObject(name)) { - PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name); - int imageHash = image.hashCode(); - if (processedImages.contains(imageHash)) { - continue; // Skip already processed images - } - processedImages.add(imageHash); - // Convert image to desired format - RenderedImage renderedImage = image.getImage(); - BufferedImage bufferedImage = null; - if ("png".equalsIgnoreCase(format)) { - bufferedImage = - new BufferedImage( - renderedImage.getWidth(), - renderedImage.getHeight(), - BufferedImage.TYPE_INT_ARGB); - } else if ("jpeg".equalsIgnoreCase(format) || "jpg".equalsIgnoreCase(format)) { - bufferedImage = - new BufferedImage( - renderedImage.getWidth(), - renderedImage.getHeight(), - BufferedImage.TYPE_INT_RGB); - } else if ("gif".equalsIgnoreCase(format)) { - bufferedImage = - new BufferedImage( - renderedImage.getWidth(), - renderedImage.getHeight(), - BufferedImage.TYPE_BYTE_INDEXED); - } + if (useMultithreading) { + // Executor service to handle multithreading + ExecutorService executor = + Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + Set> futures = new HashSet<>(); - // Write image to zip file - String imageName = - filename + "_" + imageIndex + " (Page " + pageNum + ")." + format; - ZipEntry zipEntry = new ZipEntry(imageName); - zos.putNextEntry(zipEntry); + // Iterate over each page + for (int pgNum = 0; pgNum < document.getPages().getCount(); pgNum++) { + PDPage page = document.getPage(pgNum); + int pageNum = document.getPages().indexOf(page) + 1; + // Submit a task for processing each page + Future future = + executor.submit( + () -> { + extractImagesFromPage( + page, format, filename, pageNum, processedImages, zos); + return null; + }); - Graphics2D g = bufferedImage.createGraphics(); - g.drawImage((Image) renderedImage, 0, 0, null); - g.dispose(); - // Write image bytes to zip file - ByteArrayOutputStream imageBaos = new ByteArrayOutputStream(); - ImageIO.write(bufferedImage, format, imageBaos); - zos.write(imageBaos.toByteArray()); + futures.add(future); + } - zos.closeEntry(); - imageIndex++; - } + // Wait for all tasks to complete + for (Future future : futures) { + future.get(); + } + + // Close executor service + executor.shutdown(); + } else { + // Single-threaded extraction + for (int pgNum = 0; pgNum < document.getPages().getCount(); pgNum++) { + PDPage page = document.getPage(pgNum); + extractImagesFromPage(page, format, filename, pgNum + 1, processedImages, zos); } } - // Close ZipOutputStream and PDDocument - zos.close(); + // Close PDDocument and ZipOutputStream document.close(); + zos.close(); // Create ByteArrayResource from byte array byte[] zipContents = baos.toByteArray(); @@ -138,4 +121,69 @@ public class ExtractImagesController { return WebResponseUtils.boasToWebResponse( baos, filename + "_extracted-images.zip", MediaType.APPLICATION_OCTET_STREAM); } + + private boolean shouldUseMultithreading(MultipartFile file, PDDocument document) { + // Criteria: Use multithreading if file size > 10MB or number of pages > 20 + long fileSizeInMB = file.getSize() / (1024 * 1024); + int numberOfPages = document.getPages().getCount(); + return fileSizeInMB > 10 || numberOfPages > 20; + } + + private void extractImagesFromPage( + PDPage page, + String format, + String filename, + int pageNum, + Set processedImages, + ZipOutputStream zos) + throws IOException { + for (COSName name : page.getResources().getXObjectNames()) { + if (page.getResources().isImageXObject(name)) { + PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name); + int imageHash = image.hashCode(); + synchronized (processedImages) { + if (processedImages.contains(imageHash)) { + continue; // Skip already processed images + } + processedImages.add(imageHash); + } + + RenderedImage renderedImage = image.getImage(); + + // Convert to standard RGB colorspace if needed + BufferedImage bufferedImage = convertToRGB(renderedImage, format); + + // Write image to zip file + String imageName = filename + "_" + imageHash + " (Page " + pageNum + ")." + format; + synchronized (zos) { + zos.putNextEntry(new ZipEntry(imageName)); + ByteArrayOutputStream imageBaos = new ByteArrayOutputStream(); + ImageIO.write(bufferedImage, format, imageBaos); + zos.write(imageBaos.toByteArray()); + zos.closeEntry(); + } + } + } + } + + private BufferedImage convertToRGB(RenderedImage renderedImage, String format) { + int width = renderedImage.getWidth(); + int height = renderedImage.getHeight(); + BufferedImage rgbImage; + + if ("png".equalsIgnoreCase(format)) { + rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + } else if ("jpeg".equalsIgnoreCase(format) || "jpg".equalsIgnoreCase(format)) { + rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + } else if ("gif".equalsIgnoreCase(format)) { + rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED); + } else { + rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + } + + Graphics2D g = rgbImage.createGraphics(); + g.drawImage((Image) renderedImage, 0, 0, null); + g.dispose(); + return rgbImage; + } } -- 2.46.1 From bc3574576830925e5f016492a8ed71edffad0358 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 22:19:08 +0100 Subject: [PATCH 062/231] :memo: Update README: Translation Progress Table (#1640) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6cc2a899..f09b64c8 100644 --- a/README.md +++ b/README.md @@ -189,7 +189,7 @@ Stirling PDF currently supports 38! | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | | Japanese (日本語) (ja_JP) | ![90%](https://geps.dev/progress/90) | | Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | -| Norwegian (Norsk) (no_NB) | ![96%](https://geps.dev/progress/96) | +| Norwegian (Norsk) (no_NB) | ![98%](https://geps.dev/progress/98) | | Polish (Polski) (pl_PL) | ![93%](https://geps.dev/progress/93) | | Portuguese (Português) (pt_PT) | ![78%](https://geps.dev/progress/78) | | Portuguese Brazilian (Português) (pt_BR) | ![59%](https://geps.dev/progress/59) | -- 2.46.1 From d0bf385d696ff5d01852b602bd93366f1d3e1349 Mon Sep 17 00:00:00 2001 From: PingLin8888 <88387490+PingLin8888@users.noreply.github.com> Date: Thu, 8 Aug 2024 20:38:36 +0100 Subject: [PATCH 063/231] Issue1632 remove images (#1645) * Implemented PdfImageRemovalService.java and PdfImageRemovalController.java. Image can be removed testing using Postman, but the file size doesn't change. * Fix removal logic in service file to decrease file size. * Implement "Remove Image" feature on the website Updated the front-end code to integrate the "Remove Image" feature. The new functionality is now fully operational on the website, allowing users to remove images as expected. * Add comments to PdfImageRemovalController and PdfImageRemovalService. * Change the google material icon in navbar, homepage and remove-image-pdf.html. --- .../SPDF/config/EndpointConfiguration.java | 2 + .../api/PdfImageRemovalController.java | 82 +++++++++++++++++++ .../controller/web/GeneralWebController.java | 7 ++ .../SPDF/service/PdfImageRemovalService.java | 43 ++++++++++ src/main/resources/messages_en_GB.properties | 11 +++ src/main/resources/messages_en_US.properties | 11 +++ src/main/resources/static/css/removeImage.css | 22 +++++ .../resources/templates/fragments/navbar.html | 3 + src/main/resources/templates/home.html | 3 + .../resources/templates/remove-image-pdf.html | 36 ++++++++ 10 files changed, 220 insertions(+) create mode 100644 src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java create mode 100644 src/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java create mode 100644 src/main/resources/static/css/removeImage.css create mode 100644 src/main/resources/templates/remove-image-pdf.html diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index 43180753..303de37f 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -137,6 +137,7 @@ public class EndpointConfiguration { addEndpointToGroup("Other", "auto-rename"); addEndpointToGroup("Other", "get-info-on-pdf"); addEndpointToGroup("Other", "show-javascript"); + addEndpointToGroup("Other", "remove-image-pdf"); // CLI addEndpointToGroup("CLI", "compress-pdf"); @@ -221,6 +222,7 @@ public class EndpointConfiguration { addEndpointToGroup("Java", "split-pdf-by-sections"); addEndpointToGroup("Java", REMOVE_BLANKS); addEndpointToGroup("Java", "pdf-to-text"); + addEndpointToGroup("Java", "remove-image-pdf"); // Javascript addEndpointToGroup("Javascript", "pdf-organizer"); diff --git a/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java b/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java new file mode 100644 index 00000000..a3b9e93c --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java @@ -0,0 +1,82 @@ +package stirling.software.SPDF.controller.api; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.Operation; + +import stirling.software.SPDF.model.api.PDFFile; +import stirling.software.SPDF.service.PdfImageRemovalService; +import stirling.software.SPDF.utils.WebResponseUtils; + + +/** + * Controller class for handling PDF image removal requests. + * Provides an endpoint to remove images from a PDF file to reduce its size. + */ +@RestController +@RequestMapping("/api/v1/general") +public class PdfImageRemovalController { + + // Service for removing images from PDFs + @Autowired private PdfImageRemovalService pdfImageRemovalService; + + /** + * Constructor for dependency injection of PdfImageRemovalService. + * + * @param pdfImageRemovalService The service used for removing images from PDFs. + */ + public PdfImageRemovalController(PdfImageRemovalService pdfImageRemovalService) { + this.pdfImageRemovalService = pdfImageRemovalService; + } + + /** + * Endpoint to remove images from a PDF file. + * + * This method processes the uploaded PDF file, removes all images, and returns + * the modified PDF file with a new name indicating that images were removed. + * + * @param file The PDF file with images to be removed. + * @return ResponseEntity containing the modified PDF file as byte array with appropriate content type and filename. + * @throws IOException If an error occurs while processing the PDF file. + */ + @PostMapping(consumes = "multipart/form-data", value = "/remove-image-pdf") + @Operation( + summary = "Remove images from file to reduce the file size.", + description = + "This endpoint remove images from file to reduce the file size.Input:PDF Output:PDF Type:MISO") + public ResponseEntity removeImages(@ModelAttribute PDFFile file) throws IOException { + + MultipartFile pdf = file.getFileInput(); + + // Convert the MultipartFile to a byte array + byte[] pdfBytes = pdf.getBytes(); + + // Load the PDF document from the byte array + PDDocument document = Loader.loadPDF(pdfBytes); + + // Remove images from the PDF document using the service + PDDocument modifiedDocument = pdfImageRemovalService.removeImagesFromPdf(document); + + // Create a ByteArrayOutputStream to hold the modified PDF data + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + // Save the modified PDF document to the output stream + modifiedDocument.save(outputStream); + modifiedDocument.close(); + + // Generate a new filename for the modified PDF + String mergedFileName = + pdf.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_removed_images.pdf"; + + // Convert the byte array to a web response and return it + return WebResponseUtils.bytesToWebResponse(outputStream.toByteArray(), mergedFileName); + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java index bb730dc9..93ad5f34 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java @@ -310,4 +310,11 @@ public class GeneralWebController { model.addAttribute("currentPage", "auto-split-pdf"); return "auto-split-pdf"; } + + @GetMapping("/remove-image-pdf") + @Hidden + public String removeImagePdfForm(Model model) { + model.addAttribute("currentPage", "remove-image-pdf"); + return "remove-image-pdf"; + } } diff --git a/src/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java b/src/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java new file mode 100644 index 00000000..052d9977 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java @@ -0,0 +1,43 @@ +package stirling.software.SPDF.service; + +import java.io.IOException; + +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.graphics.PDXObject; +import org.springframework.stereotype.Service; + +/** + * Service class responsible for removing image objects from a PDF document. + */ +@Service +public class PdfImageRemovalService { + + /** + * Removes all image objects from the provided PDF document. + * + * This method iterates over each page in the document and removes any + * image XObjects found in the page's resources. + * + * @param document The PDF document from which images will be removed. + * @return The modified PDF document with images removed. + * @throws IOException If an error occurs while processing the PDF document. + */ + public PDDocument removeImagesFromPdf(PDDocument document) throws IOException { + // Iterate over each page in the PDF document + for (PDPage page : document.getPages()) { + PDResources resources = page.getResources(); + // Iterate over all XObject names in the page's resources + for (COSName name : resources.getXObjectNames()) { + // Check if the XObject is an image + if (resources.isImageXObject(name)) { + // Remove the image XObject by setting it to null + resources.put(name, (PDXObject) null); + } + } + } + return document; + } +} diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index f6f77624..e072dc64 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image \ No newline at end of file diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index b90bef09..bd31c0b0 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/static/css/removeImage.css b/src/main/resources/static/css/removeImage.css new file mode 100644 index 00000000..4f2be403 --- /dev/null +++ b/src/main/resources/static/css/removeImage.css @@ -0,0 +1,22 @@ +.filename { + flex-grow: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-right: 10px; +} + +.arrows { + flex-shrink: 0; + display: flex; + justify-content: flex-end; +} +.arrows .btn { + margin: 0 3px; +} + +.move-up span, +.move-down span { + font-weight: bold; + font-size: 1.2em; +} diff --git a/src/main/resources/templates/fragments/navbar.html b/src/main/resources/templates/fragments/navbar.html index 39bd8051..955fb3e6 100644 --- a/src/main/resources/templates/fragments/navbar.html +++ b/src/main/resources/templates/fragments/navbar.html @@ -195,6 +195,9 @@
+
+
diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index d2846a24..30c295a5 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -229,6 +229,9 @@
+
+
diff --git a/src/main/resources/templates/remove-image-pdf.html b/src/main/resources/templates/remove-image-pdf.html new file mode 100644 index 00000000..6849bd59 --- /dev/null +++ b/src/main/resources/templates/remove-image-pdf.html @@ -0,0 +1,36 @@ + + + + + + + + + +
+
+ +

+
+
+
+
+ remove_selection + +
+ +
+ +
+ + +
+
+
+
+ +
+ + -- 2.46.1 From d65a637a46d0114316cce1fa7ef10464228c864c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 20:49:56 +0100 Subject: [PATCH 064/231] Bump alpine from 3.20.0 to 3.20.1 (#1505) * Bump alpine from 3.20.0 to 3.20.1 Bumps alpine from 3.20.0 to 3.20.1. --- updated-dependencies: - dependency-name: alpine dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update Dockerfile * Update Dockerfile-fat * Update Dockerfile-ultra-lite --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- Dockerfile | 2 +- Dockerfile-fat | 2 +- Dockerfile-ultra-lite | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6aab1d8b..3e257f1d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Main stage -FROM alpine:3.20.0 +FROM alpine:3.20.2 # Copy necessary files COPY scripts /scripts diff --git a/Dockerfile-fat b/Dockerfile-fat index 53f1c1fc..94d3d73b 100644 --- a/Dockerfile-fat +++ b/Dockerfile-fat @@ -12,7 +12,7 @@ RUN DOCKER_ENABLE_SECURITY=true \ ./gradlew clean build # Main stage -FROM alpine:3.20.0 +FROM alpine:3.20.2 # Copy necessary files COPY scripts /scripts diff --git a/Dockerfile-ultra-lite b/Dockerfile-ultra-lite index e3718497..1b2ee76f 100644 --- a/Dockerfile-ultra-lite +++ b/Dockerfile-ultra-lite @@ -1,5 +1,5 @@ # use alpine -FROM alpine:3.20.0 +FROM alpine:3.20.2 ARG VERSION_TAG -- 2.46.1 From a3374745f849a6ac2ae7d9b1a9c4780119fec0e9 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com.> Date: Thu, 8 Aug 2024 21:13:59 +0100 Subject: [PATCH 065/231] formatting --- Dockerfile | 4 +- Dockerfile-fat | 4 +- build.gradle | 2 +- .../software/SPDF/SPdfApplication.java | 3 +- .../api/PdfImageRemovalController.java | 12 ++--- .../api/misc/ExtractImagesController.java | 45 ++++++++++--------- .../SPDF/service/PdfImageRemovalService.java | 8 ++-- 7 files changed, 40 insertions(+), 38 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3e257f1d..44031ba7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,8 +45,8 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et # CV py3-opencv \ # python3/pip - python3 && \ - wget https://bootstrap.pypa.io/get-pip.py -qO - | python3 - --break-system-packages --no-cache-dir --upgrade && \ + python3 \ + py3-pip && \ # uno unoconv and HTML pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint && \ mv /usr/share/tessdata /usr/share/tessdata-original && \ diff --git a/Dockerfile-fat b/Dockerfile-fat index 94d3d73b..c31fe348 100644 --- a/Dockerfile-fat +++ b/Dockerfile-fat @@ -61,8 +61,8 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et # CV py3-opencv \ # python3/pip - python3 && \ - wget https://bootstrap.pypa.io/get-pip.py -qO - | python3 - --break-system-packages --no-cache-dir --upgrade && \ + python3 \ + py3-pip && \ # uno unoconv and HTML pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint && \ mv /usr/share/tessdata /usr/share/tessdata-original && \ diff --git a/build.gradle b/build.gradle index 07abc000..12780703 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ ext { } group = "stirling.software" -version = "0.26.2" +version = "0.27.0" java { // 17 is lowest but we support and recommend 21 diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java index 3b4ea174..3410b950 100644 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ b/src/main/java/stirling/software/SPDF/SPdfApplication.java @@ -78,7 +78,8 @@ public class SPdfApplication { // custom javs settings file if (Files.exists(Paths.get("configs/custom_settings.yml"))) { - String existingLocation = propertyFiles.getOrDefault("spring.config.additional-location", ""); + String existingLocation = + propertyFiles.getOrDefault("spring.config.additional-location", ""); if (!existingLocation.isEmpty()) { existingLocation += ","; } diff --git a/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java b/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java index a3b9e93c..d56b7d2d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java @@ -16,10 +16,9 @@ import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.service.PdfImageRemovalService; import stirling.software.SPDF.utils.WebResponseUtils; - /** - * Controller class for handling PDF image removal requests. - * Provides an endpoint to remove images from a PDF file to reduce its size. + * Controller class for handling PDF image removal requests. Provides an endpoint to remove images + * from a PDF file to reduce its size. */ @RestController @RequestMapping("/api/v1/general") @@ -40,11 +39,12 @@ public class PdfImageRemovalController { /** * Endpoint to remove images from a PDF file. * - * This method processes the uploaded PDF file, removes all images, and returns - * the modified PDF file with a new name indicating that images were removed. + *

This method processes the uploaded PDF file, removes all images, and returns the modified + * PDF file with a new name indicating that images were removed. * * @param file The PDF file with images to be removed. - * @return ResponseEntity containing the modified PDF file as byte array with appropriate content type and filename. + * @return ResponseEntity containing the modified PDF file as byte array with appropriate + * content type and filename. * @throws IOException If an error occurs while processing the PDF file. */ @PostMapping(consumes = "multipart/form-data", value = "/remove-image-pdf") diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java index 7fe27a03..dcbc00aa 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java @@ -1,26 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.apache.pdfbox.Loader; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; -import stirling.software.SPDF.model.api.PDFWithImageFormatRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; @@ -36,6 +15,30 @@ import java.util.zip.Deflater; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import javax.imageio.ImageIO; + +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.github.pixee.security.Filenames; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import stirling.software.SPDF.model.api.PDFWithImageFormatRequest; +import stirling.software.SPDF.utils.WebResponseUtils; + @RestController @RequestMapping("/api/v1/misc") @Tag(name = "Misc", description = "Miscellaneous APIs") diff --git a/src/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java b/src/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java index 052d9977..985d1f48 100644 --- a/src/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java +++ b/src/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java @@ -9,17 +9,15 @@ import org.apache.pdfbox.pdmodel.PDResources; import org.apache.pdfbox.pdmodel.graphics.PDXObject; import org.springframework.stereotype.Service; -/** - * Service class responsible for removing image objects from a PDF document. - */ +/** Service class responsible for removing image objects from a PDF document. */ @Service public class PdfImageRemovalService { /** * Removes all image objects from the provided PDF document. * - * This method iterates over each page in the document and removes any - * image XObjects found in the page's resources. + * This method iterates over each page in the document and removes any image XObjects found + * in the page's resources. * * @param document The PDF document from which images will be removed. * @return The modified PDF document with images removed. -- 2.46.1 From 6d8d0bad56cbc2e597a6e5f0f68e83322c58fb95 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com.> Date: Thu, 8 Aug 2024 21:15:41 +0100 Subject: [PATCH 066/231] langs --- src/main/resources/messages_ar_AR.properties | 11 +++++++++++ src/main/resources/messages_bg_BG.properties | 11 +++++++++++ src/main/resources/messages_ca_CA.properties | 11 +++++++++++ src/main/resources/messages_cs_CZ.properties | 11 +++++++++++ src/main/resources/messages_da_DK.properties | 11 +++++++++++ src/main/resources/messages_de_DE.properties | 11 +++++++++++ src/main/resources/messages_el_GR.properties | 11 +++++++++++ src/main/resources/messages_es_ES.properties | 11 +++++++++++ src/main/resources/messages_eu_ES.properties | 11 +++++++++++ src/main/resources/messages_fr_FR.properties | 11 +++++++++++ src/main/resources/messages_ga_IE.properties | 11 +++++++++++ src/main/resources/messages_hi_IN.properties | 11 +++++++++++ src/main/resources/messages_hr_HR.properties | 11 +++++++++++ src/main/resources/messages_hu_HU.properties | 11 +++++++++++ src/main/resources/messages_id_ID.properties | 11 +++++++++++ src/main/resources/messages_it_IT.properties | 11 +++++++++++ src/main/resources/messages_ja_JP.properties | 11 +++++++++++ src/main/resources/messages_ko_KR.properties | 11 +++++++++++ src/main/resources/messages_nl_NL.properties | 11 +++++++++++ src/main/resources/messages_no_NB.properties | 11 +++++++++++ src/main/resources/messages_pl_PL.properties | 11 +++++++++++ src/main/resources/messages_pt_BR.properties | 11 +++++++++++ src/main/resources/messages_pt_PT.properties | 11 +++++++++++ src/main/resources/messages_ro_RO.properties | 11 +++++++++++ src/main/resources/messages_ru_RU.properties | 11 +++++++++++ src/main/resources/messages_sk_SK.properties | 11 +++++++++++ src/main/resources/messages_sr_LATN_RS.properties | 11 +++++++++++ src/main/resources/messages_sv_SE.properties | 11 +++++++++++ src/main/resources/messages_th_TH.properties | 11 +++++++++++ src/main/resources/messages_tr_TR.properties | 11 +++++++++++ src/main/resources/messages_uk_UA.properties | 11 +++++++++++ src/main/resources/messages_vi_VN.properties | 11 +++++++++++ src/main/resources/messages_zh_CN.properties | 11 +++++++++++ src/main/resources/messages_zh_TW.properties | 11 +++++++++++ 34 files changed, 374 insertions(+) diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 3e194292..88ec9539 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 43349364..ce8bcc5e 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Книга към PDF home.BookToPDF.desc=Преобразува формати на книги/комикси в PDF с помощта на calibre BookToPDF.tags=Книга,комикс,calibre,конвертиране,манга,Amazon,Kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Покажи проследяване на стека error.copyStack=Копиране на проследяване на стека error.githubSubmit=GitHub - Изпратете запитване error.discordSubmit=Discord - Изпратете запитване за поддръжка + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 8c400bfd..3d52a609 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 6ca4cbf0..490de1f7 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Kniha na PDF home.BookToPDF.desc=Převádí formáty knih/komiksů do PDF pomocí calibre BookToPDF.tags=Kniha,Komiks,Calibre,Konvertovat,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Zobrazit stopu zásobníku error.copyStack=Kopírovat stopu zásobníku error.githubSubmit=GitHub - Odeslat požadavek error.discordSubmit=Discord - Odeslat příspěvek podpory + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index a56596dd..d445e4ef 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Vis Stack Trace error.copyStack=Kopier Stack Trace error.githubSubmit=GitHub - Indsend en ticket error.discordSubmit=Discord - Indsend Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 3a75642d..d3f085cc 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Buch als PDF home.BookToPDF.desc=Konvertiert Buch-/Comic-Formate mithilfe von Calibre in PDF BookToPDF.tags=buch,comic,calibre,convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Stack-Trace anzeigen error.copyStack=Stack-Trace kopieren error.githubSubmit=GitHub - Ein Ticket einreichen error.discordSubmit=Discord - Unterstützungsbeitrag einreichen + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index b6db871f..22faef0e 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book σε PDF home.BookToPDF.desc=Μετατρέπει τις μορφές Books/Comics σε PDF χρησιμοποιώντας calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Εμφάνιση Stack Trace error.copyStack=Αντιγραφή Stack Trace error.githubSubmit=GitHub - Υποβάλετε ένα ticket error.discordSubmit=Discord - Υποβάλετε ένα Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 58e38223..30fd1194 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Libro a PDF home.BookToPDF.desc=Convierte formatos de Libro/Cómic a PDF usando Calibre BookToPDF.tags=Libro,Cómic,Calibre,Convertir,manga,Amazon,Kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Mostrar seguimiento de pila error.copyStack=Mostrar seguimiento de pila error.githubSubmit=GitHub - Enviar un ticket error.discordSubmit=Discord - Enviar mensaje de soporte + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 57d808c1..c87a03cd 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 8f6ff4de..ff199478 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=eBook vers PDF home.BookToPDF.desc=Convertit les formats de livres/bandes dessinées en PDF à l'aide de calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Afficher la Stack Trace error.copyStack=Copier la Stack Trace error.githubSubmit=GitHub - Créer un ticket error.discordSubmit=Discord - Poster un message de demande d’assistance + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index 9a2b9cc4..b2422077 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Leabhar a thiontú go PDF home.BookToPDF.desc=Tiontaíonn sé formáidí Leabhair/Comics go PDF ag baint úsáide as calibre BookToPDF.tags=Leabhar, Comic, Calibre, Tiontaigh, manga, amazon, kindle, epub, mobi, azw3, docx, rtf, txt, html, lit, fb2, pdb, lrf +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Taispeáin Stack Trace error.copyStack=Cóipeáil Stack Trace error.githubSubmit=GitHub - Cuir ticéad isteach error.discordSubmit=Discord - Cuir post Tacaíochta + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 9b954bf1..88082fa3 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index b546a88f..76bf2d27 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book u PDF home.BookToPDF.desc=Pretvara format knjige/stripa u PDF format pomoću calibre BookToPDF.tags=Knjiga,Strip,Calibre,Pretvori,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Prikaži Stack Trace error.copyStack=Kopiraj Stack Trace error.githubSubmit=GitHub - Pošaljite ticket error.discordSubmit=Discord - Pošalji objavu podrške + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 57f33ce3..a032a9ea 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index d29749dc..f081c1e3 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 50566476..56ef2a83 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Libro in PDF home.BookToPDF.desc=Converte i formati di libri/fumetti in PDF utilizzando Calibre BookToPDF.tags=Libro,fumetto,calibre,conversione,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Mostra traccia dello stack error.copyStack=Copia traccia dello stack error.githubSubmit=GitHub: invia un ticket error.discordSubmit=Discord: invia post di supporto + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index e2380980..3ba7ed9c 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=PDFを書籍に変換 home.BookToPDF.desc=calibreを使用してPDFを書籍/コミック形式に変換します BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=スタックトレースを表示 error.copyStack=スタックトレースをコピー error.githubSubmit=GitHub - チケットを提出 error.discordSubmit=Discord - サポート投稿を提出 + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index a0ccfb0a..a382f9d3 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=책을 PDF로 home.BookToPDF.desc=구경을 사용하여 책/만화 형식을 PDF로 변환 BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=스택 추적 보기 error.copyStack=스택 추적 복사 error.githubSubmit=GitHub - 티켓 제출 error.discordSubmit=Discord - 문의 게시 + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index c2c8271a..30396fda 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Boek naar PDF home.BookToPDF.desc=Converteert boek-/stripformaat naar PDF met gebruik van Calibre BookToPDF.tags=Boek,Strip,Comic,Calibre,Converteren,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Geeft tracering weer error.copyStack=Kopieer tracering error.githubSubmit=GitHub - Dien een ticket in error.discordSubmit=Discord - Maak een support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 717eb8a5..41f1870a 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Bok til PDF home.BookToPDF.desc=Konverter bøker/tegneserier til PDF ved hjelp av calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Vis stakksporing error.copyStack=Kopier stakksporing error.githubSubmit=GitHub - Send inn en billett error.discordSubmit=Discord - Send inn støtteinnlegg + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 858aabc8..55ce74f9 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=eBook do PDF home.BookToPDF.desc=Zapisuje ebooka do PDF za pomocą Calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Pokaż Stack Trace error.copyStack=Kopiuj Stack Trace error.githubSubmit=GitHub - wyślij zgłoszenie error.discordSubmit=Discord - wyślij posta z prośbą o pomoc + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index 21c148b9..da82be3e 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 88e898b8..512ba300 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index ac41ceab..421efcfd 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 524a7c17..2f42ced2 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Книга в PDF home.BookToPDF.desc=Конвертирует форматы книги/комикса в PDF с помощью calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Показать стек вызовов error.copyStack=Скопировать стек вызовов error.githubSubmit=GitHub - Отправить заявку error.discordSubmit=Discord - Отправить запрос в поддержку + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 51501809..43ce8c67 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Kniha do PDF home.BookToPDF.desc=Konvertuje formáty kníh/komiksov do PDF pomocou Calibre BookToPDF.tags=kniha, komiks, Calibre, konvertovať, manga, amazon, kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Zobraziť sledovanie zásobníka error.copyStack=Kopírovať sledovanie zásobníka error.githubSubmit=GitHub - Podajte tiket error.discordSubmit=Discord - Podajte príspevok na podporu + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 3b76b2fb..6147c20b 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index ac49563c..3fe4c0e9 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Book to PDF home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Show Stack Trace error.copyStack=Copy Stack Trace error.githubSubmit=GitHub - Submit a ticket error.discordSubmit=Discord - Submit Support post + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index 9fff7851..c38234e1 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=หนังสือเป็น PDF home.BookToPDF.desc=แปลงรูปแบบหนังสือ/การ์ตูนเป็น PDF โดยใช้ Calibre BookToPDF.tags=หนังสือ, การ์ตูน, Calibre, แปลง, มังงะ, amazon, kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=แสดง Stack Trace error.copyStack=คัดลอก Stack Trace error.githubSubmit=GitHub - ส่งตั๋ว error.discordSubmit=Discord - ส่งโพสต์การสนับสนุน + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index c0460a5a..6a03d547 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Kitaptan PDF'ye home.BookToPDF.desc=calibre kullanarak Kitap/Karikatür formatlarını PDF'ye dönüştürür BookToPDF.tags=Kitap,Çizgi Roman,Calibre,Dönüştür,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Yığın İzlemesini Göster error.copyStack=Yığın İzini Kopyala error.githubSubmit=GitHub - Hata gönderin error.discordSubmit=Discord - Destek gönderisi gönderin + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 8cf3c19c..6e601195 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Книга у PDF home.BookToPDF.desc=Конвертує формати книги/комікса у PDF за допомогою calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Показати стек викликів error.copyStack=Скопіювати стек викликів error.githubSubmit=GitHub - Надіслати запит error.discordSubmit=Discord - Надіслати повідомлення підтримки + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index bbf096af..b6234488 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=Sách sang PDF home.BookToPDF.desc=Chuyển đổi định dạng sách/truyện tranh sang PDF bằng calibre BookToPDF.tags=Sách,Truyện tranh,Calibre,Chuyển đổi,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=Hiển thị Stack Trace error.copyStack=Sao chép Stack Trace error.githubSubmit=GitHub - Gửi ticket error.discordSubmit=Discord - Gửi bài đăng hỗ trợ + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index bea1a70c..690c8e05 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=电子书转PDF home.BookToPDF.desc=使用Calibre将电子书/漫画转换成PDF BookToPDF.tags=电子书、漫画、Calibre、转换、日本漫画、亚马逊、kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=显示堆栈跟踪 error.copyStack=复制堆栈跟踪 error.githubSubmit=GitHub - 提交工单 error.discordSubmit=Discord - 提交支持帖子 + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 145e75bf..b2e9acea 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -461,6 +461,10 @@ home.BookToPDF.title=電子書轉 PDF home.BookToPDF.desc=使用 calibre 將書籍/漫畫格式轉換為 PDF BookToPDF.tags=電子書,漫畫,Calibre,轉換,日本漫畫,亞馬遜,kindle +home.removeImagePdf.title=Remove image +home.removeImagePdf.desc=Remove image from PDF to reduce file size +removeImagePdf.tags=Remove Image,Page operations,Back end,server side + ########################### # # @@ -1125,3 +1129,10 @@ error.showStack=顯示堆疊追蹤 error.copyStack=複製堆疊追蹤 error.githubSubmit=GitHub - 提交工單 error.discordSubmit=Discord - 提交支援帖子 + + +#remove-image +removeImage.title=Remove image +removeImage.header=Remove image +removeImage.removeImage=Remove image +removeImage.submit=Remove image -- 2.46.1 From 39423c247c90168068ee323fd77b3a798a9ca176 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 21:17:08 +0100 Subject: [PATCH 067/231] :floppy_disk: Update Version (#1646) :floppy_disk: Sync Versions > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- chart/stirling-pdf/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chart/stirling-pdf/Chart.yaml b/chart/stirling-pdf/Chart.yaml index 9b633ddb..2a21f9c5 100644 --- a/chart/stirling-pdf/Chart.yaml +++ b/chart/stirling-pdf/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 0.26.2 +appVersion: 0.27.0 description: locally hosted web application that allows you to perform various operations on PDF files home: https://github.com/Stirling-Tools/Stirling-PDF -- 2.46.1 From 00a0670954c7df0496a0b98d17635cf3bfaf5340 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 21:17:18 +0100 Subject: [PATCH 068/231] :memo: Update README: Translation Progress Table (#1647) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index f09b64c8..4a56ed1a 100644 --- a/README.md +++ b/README.md @@ -170,41 +170,41 @@ Stirling PDF currently supports 38! | Language | Progress | | ------------------------------------------- | -------------------------------------- | | Arabic (العربية) (ar_AR) | ![45%](https://geps.dev/progress/45) | -| Basque (Euskara) (eu_ES) | ![62%](https://geps.dev/progress/62) | +| Basque (Euskara) (eu_ES) | ![61%](https://geps.dev/progress/61) | | Bulgarian (Български) (bg_BG) | ![94%](https://geps.dev/progress/94) | | Catalan (Català) (ca_CA) | ![48%](https://geps.dev/progress/48) | -| Croatian (Hrvatski) (hr_HR) | ![95%](https://geps.dev/progress/95) | -| Czech (Česky) (cs_CZ) | ![90%](https://geps.dev/progress/90) | -| Danish (Dansk) (da_DK) | ![10%](https://geps.dev/progress/10) | -| Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | +| Croatian (Hrvatski) (hr_HR) | ![94%](https://geps.dev/progress/94) | +| Czech (Česky) (cs_CZ) | ![89%](https://geps.dev/progress/89) | +| Danish (Dansk) (da_DK) | ![9%](https://geps.dev/progress/9) | +| Dutch (Nederlands) (nl_NL) | ![95%](https://geps.dev/progress/95) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![93%](https://geps.dev/progress/93) | | German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | -| Greek (Ελληνικά) (el_GR) | ![82%](https://geps.dev/progress/82) | -| Hindi (हिंदी) (hi_IN) | ![77%](https://geps.dev/progress/77) | -| Hungarian (Magyar) (hu_HU) | ![76%](https://geps.dev/progress/76) | +| Greek (Ελληνικά) (el_GR) | ![81%](https://geps.dev/progress/81) | +| Hindi (हिंदी) (hi_IN) | ![76%](https://geps.dev/progress/76) | +| Hungarian (Magyar) (hu_HU) | ![75%](https://geps.dev/progress/75) | | Indonesia (Bahasa Indonesia) (id_ID) | ![76%](https://geps.dev/progress/76) | -| Irish (Gaeilge) (ga_IE) | ![99%](https://geps.dev/progress/99) | -| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Japanese (日本語) (ja_JP) | ![90%](https://geps.dev/progress/90) | +| Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) | +| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | +| Japanese (日本語) (ja_JP) | ![89%](https://geps.dev/progress/89) | | Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | -| Norwegian (Norsk) (no_NB) | ![98%](https://geps.dev/progress/98) | -| Polish (Polski) (pl_PL) | ![93%](https://geps.dev/progress/93) | +| Norwegian (Norsk) (no_NB) | ![97%](https://geps.dev/progress/97) | +| Polish (Polski) (pl_PL) | ![92%](https://geps.dev/progress/92) | | Portuguese (Português) (pt_PT) | ![78%](https://geps.dev/progress/78) | | Portuguese Brazilian (Português) (pt_BR) | ![59%](https://geps.dev/progress/59) | -| Romanian (Română) (ro_RO) | ![39%](https://geps.dev/progress/39) | -| Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | +| Romanian (Română) (ro_RO) | ![38%](https://geps.dev/progress/38) | +| Russian (Русский) (ru_RU) | ![83%](https://geps.dev/progress/83) | | Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![78%](https://geps.dev/progress/78) | -| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | -| Slovakian (Slovensky) (sk_SK) | ![92%](https://geps.dev/progress/92) | -| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | +| Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) | +| Slovakian (Slovensky) (sk_SK) | ![91%](https://geps.dev/progress/91) | +| Spanish (Español) (es_ES) | ![97%](https://geps.dev/progress/97) | | Swedish (Svenska) (sv_SE) | ![39%](https://geps.dev/progress/39) | | Thai (ไทย) (th_TH) | ![99%](https://geps.dev/progress/99) | -| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | -| Turkish (Türkçe) (tr_TR) | ![99%](https://geps.dev/progress/99) | -| Ukrainian (Українська) (uk_UA) | ![90%](https://geps.dev/progress/90) | -| Vietnamese (Tiếng Việt) (vi_VN) | ![99%](https://geps.dev/progress/99) | +| Traditional Chinese (繁體中文) (zh_TW) | ![97%](https://geps.dev/progress/97) | +| Turkish (Türkçe) (tr_TR) | ![98%](https://geps.dev/progress/98) | +| Ukrainian (Українська) (uk_UA) | ![89%](https://geps.dev/progress/89) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![98%](https://geps.dev/progress/98) | ## Contributing (creating issues, translations, fixing bugs, etc.) -- 2.46.1 From 771b312ee8b443e29833f1cc8dab7897f407b96f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 21:33:14 +0100 Subject: [PATCH 069/231] Bump com.twelvemonkeys.imageio:imageio-tiff from 3.10.1 to 3.11.0 (#1503) * Bump com.twelvemonkeys.imageio:imageio-tiff from 3.10.1 to 3.11.0 Bumps com.twelvemonkeys.imageio:imageio-tiff from 3.10.1 to 3.11.0. --- updated-dependencies: - dependency-name: com.twelvemonkeys.imageio:imageio-tiff dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update build.gradle --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 12780703..8bf7f15d 100644 --- a/build.gradle +++ b/build.gradle @@ -134,8 +134,8 @@ dependencies { implementation "org.apache.xmlgraphics:batik-all:1.17" // TwelveMonkeys - implementation "com.twelvemonkeys.imageio:imageio-batik:3.10.1" - implementation "com.twelvemonkeys.imageio:imageio-bmp:3.10.1" + implementation "com.twelvemonkeys.imageio:imageio-batik:3.11.0" + implementation "com.twelvemonkeys.imageio:imageio-bmp:3.11.0" // implementation "com.twelvemonkeys.imageio:imageio-hdr:3.10.1" // implementation "com.twelvemonkeys.imageio:imageio-icns:3.10.1" // implementation "com.twelvemonkeys.imageio:imageio-iff:3.10.1" @@ -147,8 +147,8 @@ dependencies { // implementation "com.twelvemonkeys.imageio:imageio-sgi:3.10.1" // implementation "com.twelvemonkeys.imageio:imageio-tga:3.10.1" // implementation "com.twelvemonkeys.imageio:imageio-thumbsdb:3.10.1" - implementation "com.twelvemonkeys.imageio:imageio-tiff:3.10.1" - implementation "com.twelvemonkeys.imageio:imageio-webp:3.10.1" + implementation "com.twelvemonkeys.imageio:imageio-tiff:3.11.0" + implementation "com.twelvemonkeys.imageio:imageio-webp:3.11.0" // implementation "com.twelvemonkeys.imageio:imageio-xwd:3.10.1" implementation "commons-io:commons-io:2.16.1" -- 2.46.1 From 148feda83f2392054ef18180b13ee31ed7e71a2a Mon Sep 17 00:00:00 2001 From: Diallo Date: Thu, 8 Aug 2024 22:35:15 +0200 Subject: [PATCH 070/231] Bug fix UI crash when url is unrechable (#1642) * feat: Add URL reachability check in ConvertWebsiteToPDF * Add tests for URL reachability in ConvertWebsiteToPdfTest * test: Update URL in ConvertWebsiteToPdfTest for testing --- .../api/converters/ConvertWebsiteToPDF.java | 6 +++ .../software/SPDF/utils/GeneralUtils.java | 42 +++++++++++++------ .../converters/ConvertWebsiteToPdfTest.java | 41 ++++++++++++++++++ 3 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java index 8bce1b22..026690fd 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java @@ -39,6 +39,12 @@ public class ConvertWebsiteToPDF { if (!URL.matches("^https?://.*") || !GeneralUtils.isValidURL(URL)) { throw new IllegalArgumentException("Invalid URL format provided."); } + + // validate the URL is reachable + if (!GeneralUtils.isURLReachable(URL)) { + throw new IllegalArgumentException("URL is not reachable, please provide a valid URL."); + } + Path tempOutputFile = null; byte[] pdfBytes; try { diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index ae86d8c1..aa5f3aea 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -13,6 +13,8 @@ import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; +import java.net.URL; +import java.net.HttpURLConnection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,6 +73,21 @@ public class GeneralUtils { } catch (MalformedURLException e) { return false; } + + } + + public static boolean isURLReachable(String urlStr) { + try { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("HEAD"); + int responseCode = connection.getResponseCode(); + return (200 <= responseCode && responseCode <= 399); + } catch (MalformedURLException e) { + return false; + } catch (IOException e) { + return false; + } } public static File multipartToFile(MultipartFile multipart) throws IOException { @@ -95,19 +112,16 @@ public class GeneralUtils { sizeStr = sizeStr.replace(",", ".").replace(" ", ""); try { if (sizeStr.endsWith("KB")) { - return (long) - (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024); + return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024); } else if (sizeStr.endsWith("MB")) { - return (long) - (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) - * 1024 - * 1024); + return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) + * 1024 + * 1024); } else if (sizeStr.endsWith("GB")) { - return (long) - (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) - * 1024 - * 1024 - * 1024); + return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) + * 1024 + * 1024 + * 1024); } else if (sizeStr.endsWith("B")) { return Long.parseLong(sizeStr.substring(0, sizeStr.length() - 1)); } else { @@ -170,13 +184,15 @@ public class GeneralUtils { int n = 0; while (true) { - // Replace 'n' with the current value of n, correctly handling numbers before 'n' + // Replace 'n' with the current value of n, correctly handling numbers before + // 'n' String sanitizedExpression = insertMultiplicationBeforeN(expression, n); Double result = evaluator.evaluate(sanitizedExpression); // Check if the result is null or not within bounds if (result == null || result <= 0 || result.intValue() > maxValue) { - if (n != 0) break; + if (n != 0) + break; } else { results.add(result.intValue()); } diff --git a/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java b/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java new file mode 100644 index 00000000..0e63b99f --- /dev/null +++ b/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java @@ -0,0 +1,41 @@ +package stirling.software.SPDF.controller.api.converters; + +import org.junit.jupiter.api.Test; +import org.springframework.http.ResponseEntity; + +import stirling.software.SPDF.model.api.converters.UrlToPdfRequest; +import static org.junit.jupiter.api.Assertions.*; + +public class ConvertWebsiteToPdfTest { + @Test + public void test_exemption_is_thrown_when_invalid_url_format_provided() { + + String invalid_format_Url = "invalid-url"; + // Arrange + ConvertWebsiteToPDF convertWebsiteToPDF = new ConvertWebsiteToPDF(); + UrlToPdfRequest request = new UrlToPdfRequest(); + request.setUrlInput(invalid_format_Url); + // Act + IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> { + convertWebsiteToPDF.urlToPdf(request); + }); + // Assert + assertEquals("Invalid URL format provided.", thrown.getMessage()); + } + + @Test + public void test_exemption_is_thrown_when_url_is_not_reachable() { + + String unreachable_Url = "https://www.googleeeexyz.com"; + // Arrange + ConvertWebsiteToPDF convertWebsiteToPDF = new ConvertWebsiteToPDF(); + UrlToPdfRequest request = new UrlToPdfRequest(); + request.setUrlInput(unreachable_Url); + // Act + IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> { + convertWebsiteToPDF.urlToPdf(request); + }); + // Assert + assertEquals("URL is not reachable, please provide a valid URL.", thrown.getMessage()); + } +} -- 2.46.1 From 4ad716f28174518dc2745ac2982e57bc22ef7ce4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 21:41:40 +0100 Subject: [PATCH 071/231] Update 3rd Party Licenses (#1648) Signed-off-by: GitHub Action Co-authored-by: GitHub Action --- src/main/resources/static/3rdPartyLicenses.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 44c9bbdb..568c163b 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -194,13 +194,13 @@ }, { "moduleName": "com.twelvemonkeys.imageio:imageio-batik", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, { "moduleName": "com.twelvemonkeys.imageio:imageio-bmp", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, @@ -224,13 +224,13 @@ }, { "moduleName": "com.twelvemonkeys.imageio:imageio-tiff", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, { "moduleName": "com.twelvemonkeys.imageio:imageio-webp", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, -- 2.46.1 From 908b4091550d9e8ce1d32ad6569892b7a3b60e2e Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Thu, 8 Aug 2024 23:06:13 +0200 Subject: [PATCH 072/231] Update messages_it_IT.properties (#1649) --- src/main/resources/messages_it_IT.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 56ef2a83..0f7e5161 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -1132,7 +1132,7 @@ error.discordSubmit=Discord: invia post di supporto #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image +removeImage.title=Rimuovere immagine +removeImage.header=Rimuovi immagine +removeImage.removeImage=Rimuovi immagine +removeImage.submit=Rimuovi immagine -- 2.46.1 From 8dbbacb09e458946a13d9acadbaf83e29b210b7a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 22:29:02 +0100 Subject: [PATCH 073/231] :memo: Update README: Translation Progress Table (#1651) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4a56ed1a..fb79c910 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,7 @@ Stirling PDF currently supports 38! | Hungarian (Magyar) (hu_HU) | ![75%](https://geps.dev/progress/75) | | Indonesia (Bahasa Indonesia) (id_ID) | ![76%](https://geps.dev/progress/76) | | Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) | -| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | +| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | | Japanese (日本語) (ja_JP) | ![89%](https://geps.dev/progress/89) | | Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | | Norwegian (Norsk) (no_NB) | ![97%](https://geps.dev/progress/97) | -- 2.46.1 From 6649ffd7a0c257da4b1a6958a453ae2981eeacb9 Mon Sep 17 00:00:00 2001 From: tkymmm <136296842+tkymmm@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:39:35 +0900 Subject: [PATCH 074/231] Updated Japanese translation (#1654) * Update messages_ja_JP.properties Updated Japanese translation * Update messages_ja_JP.properties Updated Japanese translation --- src/main/resources/messages_ja_JP.properties | 44 ++++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 3ba7ed9c..8ef8dcc8 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -107,7 +107,7 @@ pipelineOptions.validateButton=検証 ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=お気に入り navbar.darkmode=ダークモード navbar.language=言語 navbar.settings=設定 @@ -192,21 +192,21 @@ adminUserSettings.changeUserRole=ユーザーの役割を変更する adminUserSettings.authenticated=認証済 -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=データベースのインポート/エクスポート +database.header=データベースのインポート/エクスポート +database.fileName=ファイル名 +database.creationDate=作成日 +database.fileSize=ファイルサイズ +database.deleteBackupFile=バックアップファイルの削除 +database.importBackupFile=バックアップファイルをインポート +database.downloadBackupFile=バックアップファイルをダウンロード +database.info_1=データをインポートする際には、正しい構造を確保することが極めて重要です。不明な点がある場合は、専門家のアドバイスやサポートを受けてください。構造上のエラーは、アプリケーションの誤動作を引き起こす可能性があります。 +database.info_2=ファイル名はアップロード時には関係ありません。アップロード後にbackup_user_yyyyMMddHHmm.sqlという形式にリネームされ、一貫した命名規則が保証されます。 +database.submit=バックアップをインポート +database.importIntoDatabaseSuccessed=データベースへのインポートに成功 +database.fileNotFound=ファイルが見つかりません +database.fileNullOrEmpty=ファイルは null または空であってはなりません +database.failedImportFile=ファイルのインポートに失敗 ############# # HOME-PAGE # @@ -461,8 +461,8 @@ home.BookToPDF.title=PDFを書籍に変換 home.BookToPDF.desc=calibreを使用してPDFを書籍/コミック形式に変換します BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size +home.removeImagePdf.title=画像の削除 +home.removeImagePdf.desc=PDFから画像を削除してファイルサイズを小さくします removeImagePdf.tags=Remove Image,Page operations,Back end,server side @@ -1132,7 +1132,7 @@ error.discordSubmit=Discord - サポート投稿を提出 #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image +removeImage.title=画像の削除 +removeImage.header=画像の削除 +removeImage.removeImage=画像の削除 +removeImage.submit=画像を削除 -- 2.46.1 From f165439d2614f321e897e64829c1e6073e09e28e Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Fri, 9 Aug 2024 08:57:29 +0100 Subject: [PATCH 075/231] Update remove-pages.html #1656 --- src/main/resources/templates/remove-pages.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/templates/remove-pages.html b/src/main/resources/templates/remove-pages.html index 84471ef2..3fcf7f6b 100644 --- a/src/main/resources/templates/remove-pages.html +++ b/src/main/resources/templates/remove-pages.html @@ -21,7 +21,7 @@

-
+
@@ -37,4 +37,4 @@ }); - \ No newline at end of file + -- 2.46.1 From 68c387086ce000d353791a260ea208693a3c9b02 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 08:58:31 +0100 Subject: [PATCH 076/231] :memo: Update README: Translation Progress Table (#1655) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fb79c910..4e887454 100644 --- a/README.md +++ b/README.md @@ -187,7 +187,7 @@ Stirling PDF currently supports 38! | Indonesia (Bahasa Indonesia) (id_ID) | ![76%](https://geps.dev/progress/76) | | Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Japanese (日本語) (ja_JP) | ![89%](https://geps.dev/progress/89) | +| Japanese (日本語) (ja_JP) | ![92%](https://geps.dev/progress/92) | | Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | | Norwegian (Norsk) (no_NB) | ![97%](https://geps.dev/progress/97) | | Polish (Polski) (pl_PL) | ![92%](https://geps.dev/progress/92) | -- 2.46.1 From f176558a39a13ae8457c5791187b7fd5046a9eb7 Mon Sep 17 00:00:00 2001 From: Ludy Date: Mon, 12 Aug 2024 18:22:32 +0200 Subject: [PATCH 077/231] Fix: Conditional Attribute Binding for the multiple Attribute in the File Selector Fragment (#1665) --- src/main/resources/templates/fragments/common.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html index 291b75e8..f790f6c6 100644 --- a/src/main/resources/templates/fragments/common.html +++ b/src/main/resources/templates/fragments/common.html @@ -81,19 +81,19 @@ // Find the file input within the form var fileInput = $('input[type="file"]'); - + // Find the closest enclosing form of the file input var form = fileInput.closest('form'); - + // Find the submit button within the form var submitButton = form.find('button[type="submit"], input[type="submit"]'); - + const boredWaitingText = /*[[#{bored}]]*/ 'Bored Waiting?'; const downloadCompleteText = /*[[#{downloadComplete}]]*/ 'Download Complete'; window.downloadCompleteText = downloadCompleteText; // Create the 'show-game-btn' button var gameButton = $('

'); - + // Insert the 'show-game-btn' just above the submit button submitButton.before(gameButton); @@ -147,14 +147,14 @@
- +
-- 2.46.1 From 503a1c9526900c445f4e71a1655873ac6ac175bc Mon Sep 17 00:00:00 2001 From: Ludy Date: Tue, 13 Aug 2024 23:54:33 +0200 Subject: [PATCH 078/231] redesign footer (#1674) * redesign footer * remove about test --- src/main/resources/static/css/footer.css | 6 +++++- .../resources/templates/fragments/footer.html | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/resources/static/css/footer.css b/src/main/resources/static/css/footer.css index b004cc27..ee47f54c 100644 --- a/src/main/resources/static/css/footer.css +++ b/src/main/resources/static/css/footer.css @@ -21,4 +21,8 @@ .footer-icon { font-size: 2rem; -} \ No newline at end of file +} + +.footer-link { + text-decoration: none; +} diff --git a/src/main/resources/templates/fragments/footer.html b/src/main/resources/templates/fragments/footer.html index 686c05ca..7414ea99 100644 --- a/src/main/resources/templates/fragments/footer.html +++ b/src/main/resources/templates/fragments/footer.html @@ -1,10 +1,16 @@ - \ No newline at end of file -- 2.46.1 From b54d73d723b2cd0bedb63abce4f2c084d54f9979 Mon Sep 17 00:00:00 2001 From: Rafael Martins Date: Wed, 14 Aug 2024 07:59:06 -0300 Subject: [PATCH 079/231] Updated brazilian portuguese translation (#1673) Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- src/main/resources/messages_pt_BR.properties | 448 +++++++++---------- 1 file changed, 224 insertions(+), 224 deletions(-) diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index da82be3e..362d5233 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -11,17 +11,17 @@ imgPrompt=Selecione a(s) imagem(ns) genericSubmit=Enviar processTimeWarning=Aviso: esse processo pode levar até um minuto, dependendo do tamanho do arquivo pageOrderPrompt=Ordem das páginas (digite uma lista separada por vírgulas de números de página): -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +pageSelectionPrompt=Seleção de página personalizada (Insira uma lista separada por vírgulas de números de página 1,5,6 ou funções como 2n+1) : goToPage=Ir true=Verdadeiro false=Falso unknown=Desconhecido save=Salvar -saveToBrowser=Save to Browser +saveToBrowser=Salvar no navegador close=Fechar filesSelected=arquivos selecionados noFavourites=Nenhum favorito adicionado -downloadComplete=Download Complete +downloadComplete=Download finalizado bored=Entediado esperando? alphabet=Alfabeto downloadPdf=baixar PDF @@ -34,43 +34,43 @@ sizes.medium=Médio sizes.large=Grande sizes.x-large=Muito grande error.pdfPassword=O documento PDF está protegido por senha e a senha não foi fornecida ou está incorreta -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... -WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! -poweredBy=Powered by -yes=Yes -no=No -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +delete=apagar +username=Usuário +password=Senha +welcome=Bem vindo +property=Propriedade +black=Preto +white=Branco +red=Vermelho +green=Verde +blue=Azul +custom=Personalizado... +WorkInProgess=Em progesso, Talvez não funcione ou apresente erros, Por favor, reporte qualquer problema! +poweredBy=Distribuído por +yes=Sim +no=Não +changedCredsMessage=Credenciais alteradas! +notAuthenticatedMessage=Usuário não autenticado. +userNotFoundMessage=Usuário não encontrado. +incorrectPasswordMessage=A senha atual está incorreta. +usernameExistsMessage=Novo Usuário já existe. +invalidUsernameMessage=Usuário inválido, nome de usuário só pode incluir letras, números e os seguintes caracteres especiais @._+- ou deve ser um email válido. +confirmPasswordErrorMessage=Nova Senha e Confirmar Nova Senha devem ser iguais. +deleteCurrentUserMessage=Não é possível apagar o usuário da sessão atual. +deleteUsernameExistsMessage=O usuário não existe e não pode ser apagado. downgradeCurrentUserMessage=Não é possível fazer downgrade da função do usuário atual downgradeCurrentUserLongMessage=Não é possível fazer downgrade da função do usuário atual. Portanto, o usuário atual não será mostrado. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. -error=Error +userAlreadyExistsOAuthMessage=O usuário já existe como um usuário OAuth2. +userAlreadyExistsWebMessage=O usuário já existe como um usuário web. +error=Erro oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color +help=Ajuda +goHomepage=Ir para página inicial +joinDiscord=Entre em nosso servidor do Discord +seeDockerHub=Veja nosso Docker Hub +visitGithub=Visite o repositório no Github +donate=Doar +color=Cor sponsor=Sponsor info=Info @@ -79,27 +79,27 @@ info=Info ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Beta) -pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.header=Menu de Pipeline (Beta) +pipeline.uploadButton=Enviar personalizado +pipeline.configureButton=Configurar +pipeline.defaultOption=Personalizado +pipeline.submitButton=Enviar +pipeline.help=Ajuda de Pipeline +pipeline.scanHelp=Ajuda de verificação de pasta +pipeline.deletePrompt=Tem certeza que deseja deletar a pipeline ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation +pipelineOptions.header=Configurações de Pipeline +pipelineOptions.pipelineNameLabel=Nome da Pipeline +pipelineOptions.saveSettings=Salvar configurações de operação +pipelineOptions.pipelineNamePrompt=Insira o nome da pipeline aqui +pipelineOptions.selectOperation=Selecionar operação +pipelineOptions.addOperationButton=Adicionar operação pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.validateButton=Validar @@ -107,117 +107,117 @@ pipelineOptions.validateButton=Validate ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Favoritos navbar.darkmode=Modo Escuro -navbar.language=Languages +navbar.language=Idiomas navbar.settings=Configurações -navbar.allTools=Tools -navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit +navbar.allTools=Ferramentas +navbar.multiTool=Multiferramentas +navbar.sections.organize=Organizar +navbar.sections.convertTo=Converter para PDF +navbar.sections.convertFrom=Converter de PDF +navbar.sections.security=Assinatura & Segurança +navbar.sections.advance=Avançado +navbar.sections.edit=Visualizar & Editar ############# # SETTINGS # ############# settings.title=Configurações settings.update=Atualização disponível -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable={0} é a versão instalada. Uma nova versão ({1}) está disponível. settings.appVersion=Versão do aplicativo: settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único): settings.downloadOption.1=Abrir na mesma janela settings.downloadOption.2=Abrir em nova janela settings.downloadOption.3=⇬ Fazer download do arquivo settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder -settings.signOut=Sign Out -settings.accountSettings=Account Settings -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.signOut=Encerrar sessão +settings.accountSettings=Configurações de conta +settings.bored.help=Habilitar nomes de easter egg +settings.cacheInputs.name=Salvar campos do formulário +settings.cacheInputs.help=Habilitar salvar campos utilizados anteriormenta para ações futuras -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changePassword=You are using default login credentials. Please enter a new password -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes +changeCreds.title=Alterar credenciais +changeCreds.header=Atualizar detalhes da sua conta +changeCreds.changePassword=Você está usando as credenciais padrões. Por favor, insira uma nova senha +changeCreds.newUsername=Novo usuário +changeCreds.oldPassword=Senha atual +changeCreds.newPassword=Nova senha +changeCreds.confirmNewPassword=Confirmar nova senha +changeCreds.submit=Enviar alterações -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.newUsername=New Username +account.title=Configurações da conta +account.accountSettings=Configurações da conta +account.adminSettings=Configurações administrativas - Visualizar e adicionar usuários +account.userControlSettings=Configurações de controle de usuário +account.changeUsername=Alterar nome de usuário +account.newUsername=Novo usuário account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +account.oldPassword=Senha antiga +account.newPassword=Nova senha +account.changePassword=Alterar senha +account.confirmNewPassword=Confirmar nova senha +account.signOut=Encerrar sessão +account.yourApiKey=Insira sua chave de API +account.syncTitle=Sincronizar configurações do navegador com a conta +account.settingsCompare=Comparação de configurações: +account.property=Propriedade +account.webBrowserSettings=Configurações do navegador +account.syncToBrowser=Sincronizar conta -> Navegador +account.syncToAccount=Sincronizar conta <- Navegador -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.extraApiUser=Additional Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User -adminUserSettings.forceChange=Force user to change password on login -adminUserSettings.submit=Save User +adminUserSettings.title=Configurações de controle de usuário +adminUserSettings.header=Configurações de controle de usuário administrador +adminUserSettings.admin=Administrador +adminUserSettings.user=Usuário +adminUserSettings.addUser=Adicionar novo usuário +adminUserSettings.deleteUser=Apagar usuário +adminUserSettings.confirmDeleteUser=O usuário deve ser apagado? +adminUserSettings.usernameInfo=Nome de usuário só pode incluir letras, números e os seguintes caracteres especiais @._+- ou deve ser um email válido. +adminUserSettings.roles=Funções +adminUserSettings.role=Função +adminUserSettings.actions=Ações +adminUserSettings.apiUser=Usuário de API limitado +adminUserSettings.extraApiUser=Usuário de API limitado adicional +adminUserSettings.webOnlyUser=Usuário apenas web +adminUserSettings.demoUser=Usuário demo (Sem configurações personalizadas) +adminUserSettings.internalApiUser=Usuário interno de API +adminUserSettings.forceChange=Forçar usuário a trocar a senha ao iniciar sessão +adminUserSettings.submit=Salvar usuário adminUserSettings.changeUserRole=Alterar Função de Usuário -adminUserSettings.authenticated=Authenticated +adminUserSettings.authenticated=Autenticado -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Importar/Exportar banco de dados +database.header=Importar/Exportar banco de dados +database.fileName=Nome do arquivo +database.creationDate=Data de criação +database.fileSize=Tamanho do arquivo +database.deleteBackupFile=Apagar arquivo de backup +database.importBackupFile=Importar arquivo de backup +database.downloadBackupFile=Baixar arquivo de backup +database.info_1=Ao importar dados, é crucial garantir a estrutura correta. Se você não tem certeza do que está fazendo procure auxílio de um profissional. Um erro na estrutura pode ocasionar em mau funcionamento da aplicação, incluindo a possibilidade de perda total da aplicação. +database.info_2=O nome do arquivo não importa ao enviar. Ele será renomeado em seguida para seguir o formato backup_user_yyyyMMddHHmm.sql, garantindo uma convenção de nomes coerente. +database.submit=Importar Backup +database.importIntoDatabaseSuccessed=Importação para o banco de dados bem sucedida +database.fileNotFound=Arquivo não encontrado +database.fileNullOrEmpty=O arquivo não estar nulo ou vazio +database.failedImportFile=Falha ao importar arquivo ############# # HOME-PAGE # ############# home.desc=Seu melhor utilitário para suas necessidades de PDF. -home.searchBar=Search for features... +home.searchBar=Procurar funcionalidades... -home.viewPdf.title=View PDF -home.viewPdf.desc=View, annotate, add text or images -viewPdf.tags=view,read,annotate,text,image +home.viewPdf.title=Visualizar PDF +home.viewPdf.desc=Visualize, anote, adicione textos ou imagens +viewPdf.tags=visualize,leia,anote,texto,imagem home.multiTool.title=Multiferramenta de PDF home.multiTool.desc=Mesclar, girar, reorganizar e remover páginas @@ -341,9 +341,9 @@ home.removeBlanks.title=Remover Páginas em Branco home.removeBlanks.desc=Detectar e remover páginas em branco de um documento removeBlanks.tags=limpeza,otimização,sem-conteúdo,organizar -home.removeAnnotations.title=Remove Annotations -home.removeAnnotations.desc=Removes all comments/annotations from a PDF -removeAnnotations.tags=comments,highlight,notes,markup,remove +home.removeAnnotations.title=Remover anotações +home.removeAnnotations.desc=Remover todos os comentários/anotações de um PDF +removeAnnotations.tags=comentários,destaque,notas,markup,remover home.compare.title=Comparar home.compare.desc=Comparar e mostrar as diferenças entre 2 documentos PDF @@ -353,9 +353,9 @@ home.certSign.title=Assinar com Certificado home.certSign.desc=Assinar um PDF com um Certificado/Chave (PEM/P12) certSign.tags=autenticar,PEM,P12,oficial,criptografar -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Remover Certificado de assinatura +home.removeCertSign.desc=Remove o certificado de assinatura de um PDF +removeCertSign.tags=autenticar,PEM,P12,oficial,descriptografar home.pageLayout.title=Layout de Múltiplas Páginas home.pageLayout.desc=Mesclar várias páginas de um documento PDF em uma única página @@ -426,44 +426,44 @@ home.showJS.title=Mostrar Javascript home.showJS.desc=Procura e exibe qualquer JavaScript injetado em um PDF showJS.tags=JavaScript -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -autoRedact.tags=Redact,Hide,black out,black,marker,hidden +home.autoRedact.title=Edição automática +home.autoRedact.desc=Edita automaticamente(marca em preto) um texto em um PDF baseado no texto de entrada +autoRedact.tags=redigir,esconder,escurer,preto,marcador,oculto -home.tableExtraxt.title=PDF to CSV -home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV -tableExtraxt.tags=CSV,Table Extraction,extract,convert +home.tableExtraxt.title=PDF para CSV +home.tableExtraxt.desc=Extrai tabelas de um PDF convertendo em CSV +tableExtraxt.tags=CSV,extração de tabela,extração,conversão -home.autoSizeSplitPDF.title=Auto Split by Size/Count -home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count -autoSizeSplitPDF.tags=pdf,split,document,organization +home.autoSizeSplitPDF.title=Separar automaticamente por tamanho/quantidade +home.autoSizeSplitPDF.desc=Separa um único PDF em múltiplos documentos baseado no tamanho, quantidade de páginas, ou contagem de documentos +autoSizeSplitPDF.tags=pdf,separar,documento,organização -home.overlay-pdfs.title=Overlay PDFs -home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF -overlay-pdfs.tags=Overlay +home.overlay-pdfs.title=Sobrepor PDFs +home.overlay-pdfs.desc=Sobrepõe PDFs em cima de outro PDF +overlay-pdfs.tags=sobrepor -home.split-by-sections.title=Split PDF by Sections -home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections -split-by-sections.tags=Section Split, Divide, Customize +home.split-by-sections.title=Separar PDF por seções +home.split-by-sections.desc=Separa cada página de um pdf em seções verticais ou horizontais menores +split-by-sections.tags=Separação de sessão, separar, customizar -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations -AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize +home.AddStampRequest.title=Adicionar carimbo ao PDF +home.AddStampRequest.desc=Adiciona um texto ou imagem como carimbo em locais definidos +AddStampRequest.tags=Carimbo, Adicionar image, centralizar imagem, marca d'agua, PDF, Incorporar, customizar -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre -PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.PDFToBook.title=PDF para Livro +home.PDFToBook.desc=Converte PDF para formatos de Livros/Quadrinhos utilizando calibre +PDFToBook.tags=Livro,Quadrinho,Calibre,Converter,manga,amazon,kindle home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre -BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.BookToPDF.desc=Converte formatos de Livros/Quadrinhos para PDF utilizando calibre +BookToPDF.tags=Livro,Quadrinho,Calibre,Converter,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Remover imagem +home.removeImagePdf.desc=Remove uma imagem de um PDF para reduzir o tamanho do arquivo +removeImagePdf.tags=Remover imagem,Operações de página,Back end,server side ########################### @@ -472,34 +472,34 @@ removeImagePdf.tags=Remove Image,Page operations,Back end,server side # # ########################### #login -login.title=Sign in -login.header=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=Iniciar sessão +login.header=Iniciar sessão +login.signin=Iniciar sessão +login.rememberme=Lembrar de mim +login.invalid=Usuário ou senha inválidos. +login.locked=Sua conta foi bloqueada. +login.signinTitle=Por favor, inicie a sessão login.ssoSignIn=Iniciar sessão através de início de sessão único -login.oauth2AutoCreateDisabled=OAUTH2 Auto-Criar Usuário Desativado -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token +login.oauth2AutoCreateDisabled=Auto-Criar Usuário OAUTH2 Desativado +login.oauth2RequestNotFound=Solicitação de autorização não encontrada +login.oauth2InvalidUserInfoResponse=Resposta de informação de usuário inválida +login.oauth2invalidRequest=Requisição inválida +login.oauth2AccessDenied=Acesso negado +login.oauth2InvalidTokenResponse=Resposta de token inválida +login.oauth2InvalidIdToken=Id de token inválido #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit +autoRedact.title=Edição Automática +autoRedact.header=Edição Automática +autoRedact.colorLabel=Cor +autoRedact.textsToRedactLabel=Texto para editar (separado por linhas) +autoRedact.textsToRedactPlaceholder=exemplo: \nConfidencial \nSecreto +autoRedact.useRegexLabel=Usar Regex (Expressões regulares) +autoRedact.wholeWordSearchLabel=Pesquisa de palavras inteiras +autoRedact.customPaddingLabel=Padding extra personalizado +autoRedact.convertPDFToImageLabel=Converter PDF para PDF-Imagem (usado para remover texto atrás de caixas) +autoRedact.submitButton=Enviar #showJS @@ -519,14 +519,14 @@ pdfToSinglePage.submit=Converter para Página Única pageExtracter.title=Extrair Páginas pageExtracter.header=Extrair Páginas pageExtracter.submit=Extrair -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(exemplo: 1,2,8 ou 4,7,12-16 ou 2n-1) #getPdfInfo getPdfInfo.title=Obter Informações do PDF getPdfInfo.header=Obter Informações do PDF getPdfInfo.submit=Obter Informações -getPdfInfo.downloadJson=Download JSON +getPdfInfo.downloadJson=Baixar JSON #markdown-to-pdf @@ -551,37 +551,37 @@ HTMLToPDF.header=HTML para PDF HTMLToPDF.help=Aceita arquivos HTML e ZIPs contendo html/css/imagens etc necessários HTMLToPDF.submit=Converter HTMLToPDF.credit=Usa o WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.zoom=Nível de zoom para exibição do site. +HTMLToPDF.pageWidth=Largura da página em centímetros. (Vazio por padrão) +HTMLToPDF.pageHeight=Altura da página em centímetros. (Vazio por padrão) +HTMLToPDF.marginTop=Margem superior da página em milímetros. (Vazio por padrão) +HTMLToPDF.marginBottom=Margem inferior da página em milímetros. (Vazio por padrão) +HTMLToPDF.marginLeft=Margem esquerda da página em milímetros. (Vazio por padrão) +HTMLToPDF.marginRight=Margem direita da página em milímetros. (Vazio por padrão) +HTMLToPDF.printBackground=Renderize o plano de fundo dos websites. +HTMLToPDF.defaultHeader=Habilitar cabeçalho padrão (Nome e número da página) +HTMLToPDF.cssMediaType=Altera o tipo da mídia CSS da página. +HTMLToPDF.none=Nenhum +HTMLToPDF.print=Imprimir +HTMLToPDF.screen=Tela #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Carimbar PDF +AddStampRequest.title=Carimbar PDF +AddStampRequest.stampType=Tipo de carimbo +AddStampRequest.stampText=Texto do carimbo +AddStampRequest.stampImage=Imagem do carimbo +AddStampRequest.alphabet=Alfabeto +AddStampRequest.fontSize=Fonte/Tamanho da imagem +AddStampRequest.rotation=Rotação +AddStampRequest.opacity=Opacidade +AddStampRequest.position=Posição +AddStampRequest.overrideX=Sobrescrever cordenada X +AddStampRequest.overrideY=Sobrescrever cordenada Y +AddStampRequest.customMargin=Margem personalizada +AddStampRequest.customColor=Cor de texto personalizada +AddStampRequest.submit=Carimbar #sanitizePDF @@ -605,15 +605,15 @@ addPageNumbers.selectText.4=Número Inicial addPageNumbers.selectText.5=Páginas a Numerar addPageNumbers.selectText.6=Texto Personalizado addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} +addPageNumbers.numberPagesDesc=Quais páginas devem ser numeradas, o padrão é 'all', também aceita 1-5 ou 2,5,9 etc +addPageNumbers.customNumberDesc=O padrão é {n}, também aceita 'Page {n} of {total}', 'Text-{n}', '{filename}-{n}. addPageNumbers.submit=Adicionar Números de Página #auto-rename -auto-rename.title=Rename Automático -auto-rename.header=Rename Automático de PDF -auto-rename.submit=Rename Automático +auto-rename.title=Renomear Automaticamente +auto-rename.header=Renomear Automaticamente o PDF +auto-rename.submit=Renomear Automaticamente #adjustContrast @@ -654,7 +654,7 @@ pipeline.title=Pipeline pageLayout.title=Layout de Múltiplas Páginas pageLayout.header=Layout de Múltiplas Páginas pageLayout.pagesPerSheet=Páginas por folha: -pageLayout.addBorder=Add Borders +pageLayout.addBorder=Adicionar bordas pageLayout.submit=Enviar -- 2.46.1 From d32da95f551fbc514cf2e0bff1156005cd1e779e Mon Sep 17 00:00:00 2001 From: Ludy Date: Thu, 15 Aug 2024 11:43:56 +0200 Subject: [PATCH 080/231] tessdata available to local Windows users (#1677) tessdata available to local Windows users --- .../software/SPDF/controller/api/misc/OCRController.java | 8 ++++---- .../software/SPDF/controller/web/OtherWebController.java | 7 ++++++- .../software/SPDF/model/ApplicationProperties.java | 9 +++++++++ src/main/resources/settings.yml.template | 3 ++- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java index bb8a18cd..f3ccabf4 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java @@ -13,8 +13,7 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -27,6 +26,7 @@ import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; @@ -37,10 +37,10 @@ import stirling.software.SPDF.utils.WebResponseUtils; @Tag(name = "Misc", description = "Miscellaneous APIs") public class OCRController { - private static final Logger logger = LoggerFactory.getLogger(OCRController.class); + @Autowired ApplicationProperties applicationProperties; public List getAvailableTesseractLanguages() { - String tessdataDir = "/usr/share/tessdata"; + String tessdataDir = applicationProperties.getSystem().getTessdataDir(); File[] files = new File(tessdataDir).listFiles(); if (files == null) { return Collections.emptyList(); diff --git a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java index 0e1fdf55..4eab1850 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -14,10 +15,14 @@ import org.springframework.web.servlet.ModelAndView; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.ApplicationProperties; + @Controller @Tag(name = "Misc", description = "Miscellaneous APIs") public class OtherWebController { + @Autowired ApplicationProperties applicationProperties; + @GetMapping("/compress-pdf") @Hidden public String compressPdfForm(Model model) { @@ -97,7 +102,7 @@ public class OtherWebController { } public List getAvailableTesseractLanguages() { - String tessdataDir = "/usr/share/tessdata"; + String tessdataDir = applicationProperties.getSystem().getTessdataDir(); File[] files = new File(tessdataDir).listFiles(); if (files == null) { return Collections.emptyList(); diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index 6bad4a66..cbb32cff 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -431,6 +431,15 @@ public class ApplicationProperties { private boolean showUpdate; private Boolean showUpdateOnlyAdmin; private boolean customHTMLFiles; + private String tessdataDir; + + public String getTessdataDir() { + return tessdataDir; + } + + public void setTessdataDir(String tessdataDir) { + this.tessdataDir = tessdataDir; + } public boolean isCustomHTMLFiles() { return customHTMLFiles; diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 86d88ea1..5c516c1c 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -54,6 +54,7 @@ system: showUpdate: false # see when a new update is available showUpdateOnlyAdmin: false # Only admins can see when a new update is available, depending on showUpdate it must be set to 'true' customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files + tessdataDir: /usr/share/tessdata # Path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored. ui: appName: '' # Application's visible name @@ -69,4 +70,4 @@ metrics: # Automatically Generated Settings (Do Not Edit Directly) AutomaticallyGenerated: - key: example \ No newline at end of file + key: example -- 2.46.1 From e45b5120874b6d9799bddc00c3533933a5a91be9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 09:45:19 +0000 Subject: [PATCH 081/231] :memo: Update README: Translation Progress Table (#1675) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e887454..f4457b83 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ Stirling PDF currently supports 38! | Norwegian (Norsk) (no_NB) | ![97%](https://geps.dev/progress/97) | | Polish (Polski) (pl_PL) | ![92%](https://geps.dev/progress/92) | | Portuguese (Português) (pt_PT) | ![78%](https://geps.dev/progress/78) | -| Portuguese Brazilian (Português) (pt_BR) | ![59%](https://geps.dev/progress/59) | +| Portuguese Brazilian (Português) (pt_BR) | ![85%](https://geps.dev/progress/85) | | Romanian (Română) (ro_RO) | ![38%](https://geps.dev/progress/38) | | Russian (Русский) (ru_RU) | ![83%](https://geps.dev/progress/83) | | Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![78%](https://geps.dev/progress/78) | -- 2.46.1 From 711501a382f8f4cf6d7534fe4801c756618394e6 Mon Sep 17 00:00:00 2001 From: kmau Date: Thu, 15 Aug 2024 11:46:54 +0200 Subject: [PATCH 082/231] Update messages_it_IT.properties - remove image in home (#1661) --- src/main/resources/messages_it_IT.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 0f7e5161..d2a80a29 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -461,9 +461,9 @@ home.BookToPDF.title=Libro in PDF home.BookToPDF.desc=Converte i formati di libri/fumetti in PDF utilizzando Calibre BookToPDF.tags=Libro,fumetto,calibre,conversione,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Rimuovi immagine +home.removeImagePdf.desc=Rimuovi le immagini dal PDF per ridurre la dimensione del file +removeImagePdf.tags=Rimuovi immagine,operazioni sulla pagina,back-end,lato server ########################### -- 2.46.1 From 909054a49d8b3befa25d81682e9ab7528cbea257 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Thu, 15 Aug 2024 21:57:37 +0100 Subject: [PATCH 083/231] Update dependabot.yml --- .github/dependabot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index adf9dcf0..e904a78f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,6 +9,7 @@ updates: directory: "/" # Location of package manifests schedule: interval: "weekly" + open-pull-requests-limit: 10 - package-ecosystem: "docker" directory: "/" # Location of Dockerfile schedule: -- 2.46.1 From 6fa7c2e5e128b23658ea6203444f46b2bae89b95 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Thu, 15 Aug 2024 22:00:02 +0100 Subject: [PATCH 084/231] Update dependabot.yml --- .github/dependabot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e904a78f..6bd86d3e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,6 +10,7 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + rebase-strategy: "auto" - package-ecosystem: "docker" directory: "/" # Location of Dockerfile schedule: -- 2.46.1 From eafbfb8dbfa928ba5164b30f1b6028d201cf3ebd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 22:01:03 +0100 Subject: [PATCH 085/231] Bump org.apache.pdfbox:xmpbox from 3.0.2 to 3.0.3 (#1670) Bumps org.apache.pdfbox:xmpbox from 3.0.2 to 3.0.3. --- updated-dependencies: - dependency-name: org.apache.pdfbox:xmpbox dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8bf7f15d..6b60d9b7 100644 --- a/build.gradle +++ b/build.gradle @@ -165,7 +165,7 @@ dependencies { exclude group: "commons-logging", module: "commons-logging" } - implementation ("org.apache.pdfbox:xmpbox:3.0.2") { + implementation ("org.apache.pdfbox:xmpbox:3.0.3") { exclude group: "commons-logging", module: "commons-logging" } implementation "com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4" -- 2.46.1 From 264763dd4c21eee19d541ab3da3eb6d1bbbb8616 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 22:01:41 +0100 Subject: [PATCH 086/231] Bump io.github.pixee:java-security-toolkit from 1.1.3 to 1.2.0 (#1667) Bumps [io.github.pixee:java-security-toolkit](https://github.com/pixee/java-security-toolkit) from 1.1.3 to 1.2.0. - [Release notes](https://github.com/pixee/java-security-toolkit/releases) - [Commits](https://github.com/pixee/java-security-toolkit/compare/v1.1.3...v1.2.0) --- updated-dependencies: - dependency-name: io.github.pixee:java-security-toolkit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6b60d9b7..1ec2bc0f 100644 --- a/build.gradle +++ b/build.gradle @@ -104,7 +104,7 @@ dependencies { implementation "ch.qos.logback:logback-core:1.5.6" implementation "org.springframework:spring-webmvc:6.1.9" - implementation("io.github.pixee:java-security-toolkit:1.1.3") + implementation("io.github.pixee:java-security-toolkit:1.2.0") // implementation "org.yaml:snakeyaml:2.2" implementation 'com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4' -- 2.46.1 From 1cca13334e548fe28bfb7db5610f6f23674ef17d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 23:31:57 +0200 Subject: [PATCH 087/231] Bump org.projectlombok:lombok from 1.18.32 to 1.18.34 (#1684) Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.32 to 1.18.34. - [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/projectlombok/lombok/compare/v1.18.32...v1.18.34) --- updated-dependencies: - dependency-name: org.projectlombok:lombok dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 1ec2bc0f..c79c2805 100644 --- a/build.gradle +++ b/build.gradle @@ -184,8 +184,8 @@ dependencies { implementation "com.fathzer:javaluator:3.0.4" developmentOnly("org.springframework.boot:spring-boot-devtools:$springBootVersion") - compileOnly "org.projectlombok:lombok:1.18.32" - annotationProcessor "org.projectlombok:lombok:1.18.32" + compileOnly "org.projectlombok:lombok:1.18.34" + annotationProcessor "org.projectlombok:lombok:1.18.34" testImplementation 'org.mockito:mockito-inline:5.2.0' } -- 2.46.1 From 96a8898c15f39abd52bef55d484a875a48977a4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 21:34:04 +0000 Subject: [PATCH 088/231] Bump com.bucket4j:bucket4j_jdk17-core from 8.12.1 to 8.13.1 (#1683) Bumps [com.bucket4j:bucket4j_jdk17-core](https://github.com/bucket4j/bucket4j) from 8.12.1 to 8.13.1. - [Release notes](https://github.com/bucket4j/bucket4j/releases) - [Commits](https://github.com/bucket4j/bucket4j/commits) --- updated-dependencies: - dependency-name: com.bucket4j:bucket4j_jdk17-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c79c2805..18c06190 100644 --- a/build.gradle +++ b/build.gradle @@ -179,7 +179,7 @@ dependencies { implementation "org.commonmark:commonmark:0.22.0" implementation "org.commonmark:commonmark-ext-gfm-tables:0.22.0" // https://mvnrepository.com/artifact/com.bucket4j/bucket4j_jdk17 - implementation "com.bucket4j:bucket4j_jdk17-core:8.12.1" + implementation "com.bucket4j:bucket4j_jdk17-core:8.13.1" implementation "com.fathzer:javaluator:3.0.4" -- 2.46.1 From 5c84ae1b53be82ae184ca95e49b0bab1b37ad180 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 21:36:26 +0000 Subject: [PATCH 089/231] Bump org.springframework:spring-webmvc from 6.1.9 to 6.1.12 (#1680) Bumps [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) from 6.1.9 to 6.1.12. - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.1.9...v6.1.12) --- updated-dependencies: - dependency-name: org.springframework:spring-webmvc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 18c06190..76edd633 100644 --- a/build.gradle +++ b/build.gradle @@ -102,7 +102,7 @@ dependencies { //security updates implementation "ch.qos.logback:logback-classic:1.5.6" implementation "ch.qos.logback:logback-core:1.5.6" - implementation "org.springframework:spring-webmvc:6.1.9" + implementation "org.springframework:spring-webmvc:6.1.12" implementation("io.github.pixee:java-security-toolkit:1.2.0") -- 2.46.1 From 4ea323b879ed4aa9bb673ef31ff9ad379b442448 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 21:41:03 +0000 Subject: [PATCH 090/231] Bump edu.sc.seis.launch4j from 3.0.5 to 3.0.6 (#1686) Bumps edu.sc.seis.launch4j from 3.0.5 to 3.0.6. --- updated-dependencies: - dependency-name: edu.sc.seis.launch4j dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 76edd633..78ecd8c4 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { id "io.spring.dependency-management" version "1.1.6" id "org.springdoc.openapi-gradle-plugin" version "1.8.0" id "io.swagger.swaggerhub" version "1.3.2" - id "edu.sc.seis.launch4j" version "3.0.5" + id "edu.sc.seis.launch4j" version "3.0.6" id "com.diffplug.spotless" version "6.25.0" id "com.github.jk1.dependency-license-report" version "2.8" } -- 2.46.1 From d5ac5604529da33053dff16cbbbd4dc8d134b4e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 23:57:45 +0200 Subject: [PATCH 091/231] Bump org.apache.pdfbox:pdfbox from 3.0.2 to 3.0.3 (#1691) Bumps org.apache.pdfbox:pdfbox from 3.0.2 to 3.0.3. --- updated-dependencies: - dependency-name: org.apache.pdfbox:pdfbox dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 78ecd8c4..e92b454b 100644 --- a/build.gradle +++ b/build.gradle @@ -161,7 +161,7 @@ dependencies { exclude group: "commons-logging", module: "commons-logging" } - implementation ("org.apache.pdfbox:pdfbox:3.0.2") { + implementation ("org.apache.pdfbox:pdfbox:3.0.3") { exclude group: "commons-logging", module: "commons-logging" } -- 2.46.1 From 851b43fadfdf0b3b4834a0fa53b48777b45b6e65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 00:04:43 +0200 Subject: [PATCH 092/231] Bump com.github.jk1.dependency-license-report from 2.8 to 2.9 (#1690) Bumps com.github.jk1.dependency-license-report from 2.8 to 2.9. --- updated-dependencies: - dependency-name: com.github.jk1.dependency-license-report dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e92b454b..93db9a83 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { id "io.swagger.swaggerhub" version "1.3.2" id "edu.sc.seis.launch4j" version "3.0.6" id "com.diffplug.spotless" version "6.25.0" - id "com.github.jk1.dependency-license-report" version "2.8" + id "com.github.jk1.dependency-license-report" version "2.9" } import com.github.jk1.license.render.* -- 2.46.1 From 00d65596d1e629867bafb299ab19bdff079610bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 08:48:42 +0100 Subject: [PATCH 093/231] Update 3rd Party Licenses (#1687) Signed-off-by: GitHub Action Co-authored-by: GitHub Action --- src/main/resources/static/3rdPartyLicenses.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 568c163b..0d06ea17 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -17,7 +17,7 @@ { "moduleName": "com.bucket4j:bucket4j_jdk17-core", "moduleUrl": "http://github.com/bucket4j/bucket4j/bucket4j_jdk17-core", - "moduleVersion": "8.12.1", + "moduleVersion": "8.13.1", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0" }, @@ -272,7 +272,7 @@ { "moduleName": "io.github.pixee:java-security-toolkit", "moduleUrl": "https://github.com/pixee/java-security-toolkit", - "moduleVersion": "1.1.3", + "moduleVersion": "1.2.0", "moduleLicense": "MIT License", "moduleLicenseUrl": "http://www.opensource.org/licenses/mit-license.php" }, @@ -485,28 +485,28 @@ { "moduleName": "org.apache.pdfbox:fontbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.2", + "moduleVersion": "3.0.3", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:pdfbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.2", + "moduleVersion": "3.0.3", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:pdfbox-io", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.2", + "moduleVersion": "3.0.3", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:xmpbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.2", + "moduleVersion": "3.0.3", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -1137,7 +1137,7 @@ { "moduleName": "org.springframework:spring-webmvc", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.9", + "moduleVersion": "6.1.12", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, -- 2.46.1 From 09c93cebe3c0d1bb0f731b6a45ada0d7003ce796 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:00:10 +0200 Subject: [PATCH 094/231] PR changes (#1693) * Update licenses-update.yml * Update build.yml * Update test.yml * Delete .github/workflows/test.yml * Update build.yml * Update build.yml * Update auto-labeler.yml * Update build.yml * Update auto-labeler.yml * Update labeler-config.yml --- .github/labeler-config.yml | 4 ++ .github/workflows/auto-labeler.yml | 13 ++++- .github/workflows/build.yml | 84 ++++++++++++++++++++++----- .github/workflows/licenses-update.yml | 9 +++ .github/workflows/test.yml | 47 --------------- 5 files changed, 93 insertions(+), 64 deletions(-) delete mode 100644 .github/workflows/test.yml diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index d96a2a19..a6cce904 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -47,3 +47,7 @@ Test: - changed-files: - any-glob-to-any-file: 'cucumber/**/*' - any-glob-to-any-file: 'src/test**/*' + +Github: + - changed-files: + - any-glob-to-any-file: '.github/**/*' diff --git a/.github/workflows/auto-labeler.yml b/.github/workflows/auto-labeler.yml index 6ade1de4..d962b03c 100644 --- a/.github/workflows/auto-labeler.yml +++ b/.github/workflows/auto-labeler.yml @@ -8,11 +8,22 @@ jobs: permissions: contents: read pull-requests: write + workflows: write runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/labeler@v5 + + - name: Apply Labels + uses: actions/labeler@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} configuration-path: .github/labeler-config.yml sync-labels: true + + - name: Trigger Build Workflow + run: | + curl -X POST \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github+json" \ + https://api.github.com/repos/${{ github.repository }}/dispatches \ + -d '{"event_type": "trigger-build", "client_payload": {"pr_number": "${{ github.event.pull_request.number }}"}}' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de3b3569..10006eca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,36 +1,88 @@ -name: "Build repo" +name: Build repo on: - push: - branches: ["main"] - pull_request: - branches: ["main"] + repository_dispatch: + types: [trigger-build] jobs: build: + if: | + github.event.client_payload.pr_number && + contains(github.event.client_payload.labels, 'licenses') == false && + ( + contains(github.event.client_payload.labels, 'Front End') || + contains(github.event.client_payload.labels, 'Java') || + contains(github.event.client_payload.labels, 'Back End') || + contains(github.event.client_payload.labels, 'Security') || + contains(github.event.client_payload.labels, 'API') || + contains(github.event.client_payload.labels, 'Docker') || + contains(github.event.client_payload.labels, 'Test') + ) + runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - steps: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up JDK 17 + - name: Set up JDK ${{ matrix.jdk-version }} uses: actions/setup-java@v4 with: - java-version: "17" + java-version: ${{ matrix.jdk-version }} distribution: "temurin" - - uses: gradle/actions/setup-gradle@v3 + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v3 with: gradle-version: 8.7 - name: Build with Gradle run: ./gradlew build --no-build-cache + + docker-compose-tests: + if: | + github.event.client_payload.pr_number && + contains(github.event.client_payload.labels, 'licenses') == false && + ( + contains(github.event.client_payload.labels, 'Front End') || + contains(github.event.client_payload.labels, 'Java') || + contains(github.event.client_payload.labels, 'Back End') || + contains(github.event.client_payload.labels, 'Security') || + contains(github.event.client_payload.labels, 'API') || + contains(github.event.client_payload.labels, 'Docker') || + contains(github.event.client_payload.labels, 'Test') + ) + + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Set up Java 17 + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Install Docker Compose + run: | + sudo curl -SL "https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.7" + + - name: Pip requirements + run: | + pip install -r ./cucumber/requirements.txt + + - name: Run Docker Compose Tests + run: | + chmod +x ./test.sh + ./test.sh diff --git a/.github/workflows/licenses-update.yml b/.github/workflows/licenses-update.yml index a3996bc6..594a0017 100644 --- a/.github/workflows/licenses-update.yml +++ b/.github/workflows/licenses-update.yml @@ -58,5 +58,14 @@ jobs: body: | Auto-generated by [create-pull-request][1] [1]: https://github.com/peter-evans/create-pull-request + labels: licenses draft: false delete-branch: true + + + - name: Enable auto-merge + uses: peter-evans/enable-pull-request-automerge@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + pull-request-number: ${{ steps.create-pull-request.outputs.pull-request-number }} + merge-method: squash # Choose the merge method: merge, squash, or rebase diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index c4a4ff31..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Docker Compose Tests - -on: - pull_request: - paths: - - "src/**" - - "**.gradle" - - "!src/main/java/resources/messages*" - - "exampleYmlFiles/**" - - "Dockerfile" - - "Dockerfile**" - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Set up Java 17 - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Install Docker Compose - run: | - sudo curl -SL "https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - sudo chmod +x /usr/local/bin/docker-compose - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.7" - - - name: Pip requirements - run: | - pip install -r ./cucumber/requirements.txt - - - name: Run Docker Compose Tests - run: | - chmod +x ./test.sh - ./test.sh -- 2.46.1 From 8997855922af45ff8b6a6d15373e893d7e441a10 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:02:38 +0100 Subject: [PATCH 095/231] Update auto-labeler.yml --- .github/workflows/auto-labeler.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/auto-labeler.yml b/.github/workflows/auto-labeler.yml index d962b03c..a37606d5 100644 --- a/.github/workflows/auto-labeler.yml +++ b/.github/workflows/auto-labeler.yml @@ -8,7 +8,6 @@ jobs: permissions: contents: read pull-requests: write - workflows: write runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 -- 2.46.1 From e89ac84928c48ba4a337ced96c6886fefb69df81 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:09:17 +0100 Subject: [PATCH 096/231] Update build.yml --- .github/workflows/build.yml | 68 +++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 10006eca..5bb9461c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,26 +1,41 @@ name: Build repo on: - repository_dispatch: - types: [trigger-build] + push: + branches: ["main"] + workflow_run: + workflows: ["Pull Request Labeler"] + types: + - completed jobs: build: - if: | - github.event.client_payload.pr_number && - contains(github.event.client_payload.labels, 'licenses') == false && - ( - contains(github.event.client_payload.labels, 'Front End') || - contains(github.event.client_payload.labels, 'Java') || - contains(github.event.client_payload.labels, 'Back End') || - contains(github.event.client_payload.labels, 'Security') || - contains(github.event.client_payload.labels, 'API') || - contains(github.event.client_payload.labels, 'Docker') || - contains(github.event.client_payload.labels, 'Test') - ) + if: github.event_name == 'push' && github.ref == 'refs/heads/main' || + (github.event_name == 'workflow_run' && + contains(github.event.workflow_run.pull_request.labels.*.name, 'licenses') == false && + ( + contains(github.event.workflow_run.pull_request.labels.*.name, 'Front End') || + contains(github.event.workflow_run.pull_request.labels.*.name, 'Java') || + contains(github.event.workflow_run.pull_request.labels.*.name, 'Back End') || + contains(github.event.workflow_run.pull_request.labels.*.name, 'Security') || + contains(github.event.workflow_run.pull_request.labels.*.name, 'API') || + contains(github.event.workflow_run.pull_request.labels.*.name, 'Docker') || + contains(github.event.workflow_run.pull_request.labels.*.name, 'Test') + ) + ) runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + jdk-version: [17, 21] + steps: - name: Checkout repository uses: actions/checkout@v4 @@ -40,18 +55,19 @@ jobs: run: ./gradlew build --no-build-cache docker-compose-tests: - if: | - github.event.client_payload.pr_number && - contains(github.event.client_payload.labels, 'licenses') == false && - ( - contains(github.event.client_payload.labels, 'Front End') || - contains(github.event.client_payload.labels, 'Java') || - contains(github.event.client_payload.labels, 'Back End') || - contains(github.event.client_payload.labels, 'Security') || - contains(github.event.client_payload.labels, 'API') || - contains(github.event.client_payload.labels, 'Docker') || - contains(github.event.client_payload.labels, 'Test') - ) + if: github.event_name == 'push' && github.ref == 'refs/heads/main' || + (github.event_name == 'pull_request' && + contains(github.event.pull_request.labels.*.name, 'licenses') == false && + ( + contains(github.event.pull_request.labels.*.name, 'Front End') || + contains(github.event.pull_request.labels.*.name, 'Java') || + contains(github.event.pull_request.labels.*.name, 'Back End') || + contains(github.event.pull_request.labels.*.name, 'Security') || + contains(github.event.pull_request.labels.*.name, 'API') || + contains(github.event.pull_request.labels.*.name, 'Docker') || + contains(github.event.pull_request.labels.*.name, 'Test') + ) + ) runs-on: ubuntu-latest -- 2.46.1 From f5258c593b937c9cdde1367302f08abf2cb9d9c8 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:15:37 +0100 Subject: [PATCH 097/231] Update auto-labeler.yml --- .github/workflows/auto-labeler.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/auto-labeler.yml b/.github/workflows/auto-labeler.yml index a37606d5..30bf857f 100644 --- a/.github/workflows/auto-labeler.yml +++ b/.github/workflows/auto-labeler.yml @@ -18,11 +18,3 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} configuration-path: .github/labeler-config.yml sync-labels: true - - - name: Trigger Build Workflow - run: | - curl -X POST \ - -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ - -H "Accept: application/vnd.github+json" \ - https://api.github.com/repos/${{ github.repository }}/dispatches \ - -d '{"event_type": "trigger-build", "client_payload": {"pr_number": "${{ github.event.pull_request.number }}"}}' -- 2.46.1 From 8602f38fbff87205fc09a79fb0a0407e43e1e13d Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:44:49 +0100 Subject: [PATCH 098/231] Update build.yml --- .github/workflows/build.yml | 46 ++++++++++++------------------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5bb9461c..d11e331b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,27 +3,11 @@ name: Build repo on: push: branches: ["main"] - workflow_run: - workflows: ["Pull Request Labeler"] - types: - - completed + pull_request: + branches: ["main"] jobs: build: - if: github.event_name == 'push' && github.ref == 'refs/heads/main' || - (github.event_name == 'workflow_run' && - contains(github.event.workflow_run.pull_request.labels.*.name, 'licenses') == false && - ( - contains(github.event.workflow_run.pull_request.labels.*.name, 'Front End') || - contains(github.event.workflow_run.pull_request.labels.*.name, 'Java') || - contains(github.event.workflow_run.pull_request.labels.*.name, 'Back End') || - contains(github.event.workflow_run.pull_request.labels.*.name, 'Security') || - contains(github.event.workflow_run.pull_request.labels.*.name, 'API') || - contains(github.event.workflow_run.pull_request.labels.*.name, 'Docker') || - contains(github.event.workflow_run.pull_request.labels.*.name, 'Test') - ) - ) - runs-on: ubuntu-latest permissions: @@ -55,19 +39,19 @@ jobs: run: ./gradlew build --no-build-cache docker-compose-tests: - if: github.event_name == 'push' && github.ref == 'refs/heads/main' || - (github.event_name == 'pull_request' && - contains(github.event.pull_request.labels.*.name, 'licenses') == false && - ( - contains(github.event.pull_request.labels.*.name, 'Front End') || - contains(github.event.pull_request.labels.*.name, 'Java') || - contains(github.event.pull_request.labels.*.name, 'Back End') || - contains(github.event.pull_request.labels.*.name, 'Security') || - contains(github.event.pull_request.labels.*.name, 'API') || - contains(github.event.pull_request.labels.*.name, 'Docker') || - contains(github.event.pull_request.labels.*.name, 'Test') - ) - ) + # if: github.event_name == 'push' && github.ref == 'refs/heads/main' || + # (github.event_name == 'pull_request' && + # contains(github.event.pull_request.labels.*.name, 'licenses') == false && + # ( + # contains(github.event.pull_request.labels.*.name, 'Front End') || + # contains(github.event.pull_request.labels.*.name, 'Java') || + # contains(github.event.pull_request.labels.*.name, 'Back End') || + # contains(github.event.pull_request.labels.*.name, 'Security') || + # contains(github.event.pull_request.labels.*.name, 'API') || + # contains(github.event.pull_request.labels.*.name, 'Docker') || + # contains(github.event.pull_request.labels.*.name, 'Test') + # ) + # ) runs-on: ubuntu-latest -- 2.46.1 From 29f43c010ef7978cffe8f174254e3d804db54383 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:51:40 +0100 Subject: [PATCH 099/231] Bump io.micrometer:micrometer-core from 1.13.0 to 1.13.3 (#1689) Bumps [io.micrometer:micrometer-core](https://github.com/micrometer-metrics/micrometer) from 1.13.0 to 1.13.3. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.13.0...v1.13.3) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 93db9a83..97a09cfc 100644 --- a/build.gradle +++ b/build.gradle @@ -173,7 +173,7 @@ dependencies { implementation "org.bouncycastle:bcprov-jdk18on:1.78.1" implementation "org.bouncycastle:bcpkix-jdk18on:1.78.1" implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion" - implementation "io.micrometer:micrometer-core:1.13.0" + implementation "io.micrometer:micrometer-core:1.13.3" implementation group: "com.google.zxing", name: "core", version: "3.5.3" // https://mvnrepository.com/artifact/org.commonmark/commonmark implementation "org.commonmark:commonmark:0.22.0" -- 2.46.1 From 2cbe34ea247c2714feec278f0cbafcc825afe6cb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:52:51 +0100 Subject: [PATCH 100/231] Update 3rd Party Licenses (#1695) Signed-off-by: GitHub Action Co-authored-by: GitHub Action --- src/main/resources/static/3rdPartyLicenses.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 0d06ea17..20c99a5a 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -286,7 +286,7 @@ { "moduleName": "io.micrometer:micrometer-core", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.13.0", + "moduleVersion": "1.13.3", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -790,7 +790,7 @@ { "moduleName": "org.hdrhistogram:HdrHistogram", "moduleUrl": "http://hdrhistogram.github.io/HdrHistogram/", - "moduleVersion": "2.2.1", + "moduleVersion": "2.2.2", "moduleLicense": "Public Domain, per Creative Commons CC0", "moduleLicenseUrl": "http://creativecommons.org/publicdomain/zero/1.0/" }, -- 2.46.1 From 29fcbf30d771fdf7bd6f25f35e146cc465132745 Mon Sep 17 00:00:00 2001 From: Ludy Date: Fri, 16 Aug 2024 12:57:37 +0200 Subject: [PATCH 101/231] Admin panel - Enhanced User Management & Fix: #1630 (#1658) * Prevents SSO login due to faulty verification * add translation & fix show error message * Update settings.yml.template --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- README.md | 1 + build.gradle | 1 + .../CustomAuthenticationFailureHandler.java | 44 +++-- .../CustomAuthenticationSuccessHandler.java | 11 +- .../security/CustomLogoutSuccessHandler.java | 18 +- .../config/security/LoginAttemptService.java | 4 - .../security/SecurityConfiguration.java | 27 ++- .../security/UserAuthenticationFilter.java | 46 ++++- .../SPDF/config/security/UserService.java | 74 +++++-- ...tomOAuth2AuthenticationFailureHandler.java | 37 ++-- ...tomOAuth2AuthenticationSuccessHandler.java | 40 ++-- .../CustomOAuth2LogoutSuccessHandler.java | 53 +++-- .../session/CustomHttpSessionListener.java | 26 +++ .../session/SessionPersistentRegistry.java | 183 ++++++++++++++++++ .../session/SessionRegistryConfig.java | 20 ++ .../security/session/SessionRepository.java | 31 +++ .../security/session/SessionScheduled.java | 35 ++++ .../SPDF/controller/api/UserController.java | 106 +++++++--- .../controller/web/AccountWebController.java | 114 ++++++++++- .../SPDF/model/ApplicationProperties.java | 11 ++ .../software/SPDF/model/SessionEntity.java | 23 +++ .../SPDF/model/provider/GoogleProvider.java | 8 + src/main/resources/messages_ar_AR.properties | 12 ++ src/main/resources/messages_bg_BG.properties | 12 ++ src/main/resources/messages_ca_CA.properties | 12 ++ src/main/resources/messages_cs_CZ.properties | 12 ++ src/main/resources/messages_da_DK.properties | 14 +- src/main/resources/messages_de_DE.properties | 14 +- src/main/resources/messages_el_GR.properties | 12 ++ src/main/resources/messages_en_GB.properties | 12 ++ src/main/resources/messages_en_US.properties | 12 ++ src/main/resources/messages_es_ES.properties | 12 ++ src/main/resources/messages_eu_ES.properties | 12 ++ src/main/resources/messages_fr_FR.properties | 12 ++ src/main/resources/messages_ga_IE.properties | 14 +- src/main/resources/messages_hi_IN.properties | 12 ++ src/main/resources/messages_hr_HR.properties | 12 ++ src/main/resources/messages_hu_HU.properties | 12 ++ src/main/resources/messages_id_ID.properties | 12 ++ src/main/resources/messages_it_IT.properties | 12 ++ src/main/resources/messages_ja_JP.properties | 12 ++ src/main/resources/messages_ko_KR.properties | 12 ++ src/main/resources/messages_nl_NL.properties | 12 ++ src/main/resources/messages_no_NB.properties | 12 ++ src/main/resources/messages_pl_PL.properties | 12 ++ src/main/resources/messages_pt_BR.properties | 13 ++ src/main/resources/messages_pt_PT.properties | 12 ++ src/main/resources/messages_ro_RO.properties | 12 ++ src/main/resources/messages_ru_RU.properties | 12 ++ src/main/resources/messages_sk_SK.properties | 12 ++ .../resources/messages_sr_LATN_RS.properties | 12 ++ src/main/resources/messages_sv_SE.properties | 12 ++ src/main/resources/messages_th_TH.properties | 12 ++ src/main/resources/messages_tr_TR.properties | 12 ++ src/main/resources/messages_uk_UA.properties | 12 ++ src/main/resources/messages_vi_VN.properties | 14 +- src/main/resources/messages_zh_CN.properties | 12 ++ src/main/resources/messages_zh_TW.properties | 12 ++ src/main/resources/settings.yml.template | 1 + src/main/resources/templates/addUsers.html | 174 +++++++++++------ src/main/resources/templates/login.html | 10 +- 61 files changed, 1318 insertions(+), 221 deletions(-) create mode 100644 src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java create mode 100644 src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java create mode 100644 src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java create mode 100644 src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java create mode 100644 src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java create mode 100644 src/main/java/stirling/software/SPDF/model/SessionEntity.java diff --git a/README.md b/README.md index f4457b83..5b590cd4 100644 --- a/README.md +++ b/README.md @@ -266,6 +266,7 @@ security: clientId: '' # Client ID from your provider clientSecret: '' # Client Secret from your provider autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users + blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin useAsUsername: email # Default is 'email'; custom fields can be used as the username scopes: openid, profile, email # Specify the scopes for which the application will request permissions provider: google # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' diff --git a/build.gradle b/build.gradle index 97a09cfc..6c8ec3ec 100644 --- a/build.gradle +++ b/build.gradle @@ -45,6 +45,7 @@ sourceSets { exclude "stirling/software/SPDF/model/AttemptCounter.java" exclude "stirling/software/SPDF/model/Authority.java" exclude "stirling/software/SPDF/model/PersistentLogin.java" + exclude "stirling/software/SPDF/model/SessionEntity.java" exclude "stirling/software/SPDF/model/User.java" exclude "stirling/software/SPDF/repository/**" } diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java index 6193f216..23b6dc0d 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java @@ -3,9 +3,8 @@ package stirling.software.SPDF.config.security; import java.io.IOException; import java.util.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.DisabledException; import org.springframework.security.authentication.InternalAuthenticationServiceException; import org.springframework.security.authentication.LockedException; import org.springframework.security.core.AuthenticationException; @@ -15,17 +14,16 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.User; +@Slf4j public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { private LoginAttemptService loginAttemptService; private UserService userService; - private static final Logger logger = - LoggerFactory.getLogger(CustomAuthenticationFailureHandler.class); - public CustomAuthenticationFailureHandler( final LoginAttemptService loginAttemptService, UserService userService) { this.loginAttemptService = loginAttemptService; @@ -39,14 +37,17 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF AuthenticationException exception) throws IOException, ServletException { + if (exception instanceof DisabledException) { + log.error("User is deactivated: ", exception); + getRedirectStrategy().sendRedirect(request, response, "/logout?userIsDisabled=true"); + return; + } + String ip = request.getRemoteAddr(); - logger.error("Failed login attempt from IP: {}", ip); + log.error("Failed login attempt from IP: {}", ip); - String contextPath = request.getContextPath(); - - if (exception.getClass().isAssignableFrom(InternalAuthenticationServiceException.class) - || "Password must not be null".equalsIgnoreCase(exception.getMessage())) { - response.sendRedirect(contextPath + "/login?error=oauth2AuthenticationError"); + if (exception instanceof LockedException) { + getRedirectStrategy().sendRedirect(request, response, "/login?error=locked"); return; } @@ -54,20 +55,25 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF Optional optUser = userService.findByUsernameIgnoreCase(username); if (username != null && optUser.isPresent() && !isDemoUser(optUser)) { - logger.info( + log.info( "Remaining attempts for user {}: {}", - optUser.get().getUsername(), + username, loginAttemptService.getRemainingAttempts(username)); loginAttemptService.loginFailed(username); - if (loginAttemptService.isBlocked(username) - || exception.getClass().isAssignableFrom(LockedException.class)) { - response.sendRedirect(contextPath + "/login?error=locked"); + if (loginAttemptService.isBlocked(username) || exception instanceof LockedException) { + getRedirectStrategy().sendRedirect(request, response, "/login?error=locked"); return; } } - if (exception.getClass().isAssignableFrom(BadCredentialsException.class) - || exception.getClass().isAssignableFrom(UsernameNotFoundException.class)) { - response.sendRedirect(contextPath + "/login?error=badcredentials"); + if (exception instanceof BadCredentialsException + || exception instanceof UsernameNotFoundException) { + getRedirectStrategy().sendRedirect(request, response, "/login?error=badcredentials"); + return; + } + if (exception instanceof InternalAuthenticationServiceException + || "Password must not be null".equalsIgnoreCase(exception.getMessage())) { + getRedirectStrategy() + .sendRedirect(request, response, "/login?error=oauth2AuthenticationError"); return; } diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java index 73280d89..61d5a3ce 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java @@ -10,15 +10,20 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.utils.RequestUriUtils; +@Slf4j public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { private LoginAttemptService loginAttemptService; + private UserService userService; - public CustomAuthenticationSuccessHandler(LoginAttemptService loginAttemptService) { + public CustomAuthenticationSuccessHandler( + LoginAttemptService loginAttemptService, UserService userService) { this.loginAttemptService = loginAttemptService; + this.userService = userService; } @Override @@ -27,6 +32,10 @@ public class CustomAuthenticationSuccessHandler throws ServletException, IOException { String userName = request.getParameter("username"); + if (userService.isUserDisabled(userName)) { + getRedirectStrategy().sendRedirect(request, response, "/logout?userIsDisabled=true"); + return; + } loginAttemptService.loginSucceeded(userName); // Get the saved request diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java index 71a17f07..d62956e1 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java @@ -2,32 +2,26 @@ package stirling.software.SPDF.config.security; import java.io.IOException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; -import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpSession; public class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler { - @Autowired SessionRegistry sessionRegistry; - @Override public void onLogoutSuccess( HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { - HttpSession session = request.getSession(false); - if (session != null) { - String sessionId = session.getId(); - sessionRegistry.removeSessionInformation(sessionId); - session.invalidate(); - logger.debug("Session invalidated: " + sessionId); + + if (request.getParameter("userIsDisabled") != null) { + getRedirectStrategy() + .sendRedirect(request, response, "/login?erroroauth=userIsDisabled"); + return; } - response.sendRedirect(request.getContextPath() + "/login?logout=true"); + getRedirectStrategy().sendRedirect(request, response, "/login?logout=true"); } } diff --git a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java index da3e216e..6141be29 100644 --- a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java +++ b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java @@ -3,8 +3,6 @@ package stirling.software.SPDF.config.security; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,8 +15,6 @@ public class LoginAttemptService { @Autowired ApplicationProperties applicationProperties; - private static final Logger logger = LoggerFactory.getLogger(LoginAttemptService.class); - private int MAX_ATTEMPT; private long ATTEMPT_INCREMENT_TIME; private ConcurrentHashMap attemptsCache; diff --git a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java index 4ecadda6..1e0ff786 100644 --- a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java @@ -18,8 +18,6 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; -import org.springframework.security.core.session.SessionRegistry; -import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.client.registration.ClientRegistration; @@ -37,6 +35,7 @@ import stirling.software.SPDF.config.security.oauth2.CustomOAuth2AuthenticationF import stirling.software.SPDF.config.security.oauth2.CustomOAuth2AuthenticationSuccessHandler; import stirling.software.SPDF.config.security.oauth2.CustomOAuth2LogoutSuccessHandler; import stirling.software.SPDF.config.security.oauth2.CustomOAuth2UserService; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client; @@ -47,7 +46,7 @@ import stirling.software.SPDF.model.provider.KeycloakProvider; import stirling.software.SPDF.repository.JPATokenRepositoryImpl; @Configuration -@EnableWebSecurity() +@EnableWebSecurity @EnableMethodSecurity public class SecurityConfiguration { @@ -73,11 +72,7 @@ public class SecurityConfiguration { @Autowired private LoginAttemptService loginAttemptService; @Autowired private FirstLoginFilter firstLoginFilter; - - @Bean - public SessionRegistry sessionRegistry() { - return new SessionRegistryImpl(); - } + @Autowired private SessionPersistentRegistry sessionRegistry; @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { @@ -94,7 +89,7 @@ public class SecurityConfiguration { .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .maximumSessions(10) .maxSessionsPreventsLogin(false) - .sessionRegistry(sessionRegistry()) + .sessionRegistry(sessionRegistry) .expiredUrl("/login?logout=true")); http.formLogin( @@ -103,7 +98,7 @@ public class SecurityConfiguration { .loginPage("/login") .successHandler( new CustomAuthenticationSuccessHandler( - loginAttemptService)) + loginAttemptService, userService)) .defaultSuccessUrl("/") .failureHandler( new CustomAuthenticationFailureHandler( @@ -160,7 +155,11 @@ public class SecurityConfiguration { // Handle OAUTH2 Logins if (applicationProperties.getSecurity().getOAUTH2() != null - && applicationProperties.getSecurity().getOAUTH2().getEnabled()) { + && applicationProperties.getSecurity().getOAUTH2().getEnabled() + && !applicationProperties + .getSecurity() + .getLoginMethod() + .equalsIgnoreCase("normal")) { http.oauth2Login( oauth2 -> @@ -191,10 +190,8 @@ public class SecurityConfiguration { .logout( logout -> logout.logoutSuccessHandler( - new CustomOAuth2LogoutSuccessHandler( - this.applicationProperties, - sessionRegistry())) - .invalidateHttpSession(true)); + new CustomOAuth2LogoutSuccessHandler( + applicationProperties))); } } else { http.csrf(csrf -> csrf.disable()) diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java index 8e0ae052..23269477 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java @@ -1,6 +1,7 @@ package stirling.software.SPDF.config.security; import java.io.IOException; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -9,8 +10,9 @@ import org.springframework.http.HttpStatus; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.session.SessionInformation; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -18,15 +20,16 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.ApiKeyAuthenticationToken; @Component public class UserAuthenticationFilter extends OncePerRequestFilter { - @Autowired private UserDetailsService userDetailsService; - @Autowired @Lazy private UserService userService; + @Autowired private SessionPersistentRegistry sessionPersistentRegistry; + @Autowired @Qualifier("loginEnabled") public boolean loginEnabledValue; @@ -87,6 +90,43 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { } } + // Check if the authenticated user is disabled and invalidate their session if so + if (authentication != null && authentication.isAuthenticated()) { + Object principal = authentication.getPrincipal(); + String username = null; + if (principal instanceof UserDetails) { + username = ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + username = ((OAuth2User) principal).getName(); + } else if (principal instanceof String) { + username = (String) principal; + } + + List sessionsInformations = + sessionPersistentRegistry.getAllSessions(principal, false); + + if (username != null) { + boolean isUserExists = userService.usernameExistsIgnoreCase(username); + boolean isUserDisabled = userService.isUserDisabled(username); + + if (!isUserExists || isUserDisabled) { + for (SessionInformation sessionsInformation : sessionsInformations) { + sessionsInformation.expireNow(); + sessionPersistentRegistry.expireSession(sessionsInformation.getSessionId()); + } + } + + if (!isUserExists) { + response.sendRedirect(request.getContextPath() + "/logout?badcredentials=true"); + return; + } + if (isUserDisabled) { + response.sendRedirect(request.getContextPath() + "/logout?userIsDisabled=true"); + return; + } + } + } + filterChain.doFilter(request, response); } diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index f6cdfb91..d20aba8b 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -15,12 +15,15 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.session.SessionInformation; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Service; import stirling.software.SPDF.config.DatabaseBackupInterface; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; import stirling.software.SPDF.model.AuthenticationType; import stirling.software.SPDF.model.Authority; @@ -40,6 +43,8 @@ public class UserService implements UserServiceInterface { @Autowired private MessageSource messageSource; + @Autowired private SessionPersistentRegistry sessionRegistry; + @Autowired DatabaseBackupInterface databaseBackupHelper; // Handle OAUTH2 login and user auto creation. @@ -48,7 +53,7 @@ public class UserService implements UserServiceInterface { if (!isUsernameValid(username)) { return false; } - Optional existingUser = userRepository.findByUsernameIgnoreCase(username); + Optional existingUser = findByUsernameIgnoreCase(username); if (existingUser.isPresent()) { return true; } @@ -90,8 +95,7 @@ public class UserService implements UserServiceInterface { public User addApiKeyToUser(String username) { User user = - userRepository - .findByUsernameIgnoreCase(username) + findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); user.setApiKey(generateApiKey()); @@ -104,8 +108,7 @@ public class UserService implements UserServiceInterface { public String getApiKeyForUser(String username) { User user = - userRepository - .findByUsernameIgnoreCase(username) + findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); return user.getApiKey(); } @@ -131,12 +134,17 @@ public class UserService implements UserServiceInterface { } public boolean validateApiKeyForUser(String username, String apiKey) { - Optional userOpt = userRepository.findByUsernameIgnoreCase(username); + Optional userOpt = findByUsernameIgnoreCase(username); return userOpt.isPresent() && apiKey.equals(userOpt.get().getApiKey()); } public void saveUser(String username, AuthenticationType authenticationType) throws IllegalArgumentException, IOException { + saveUser(username, authenticationType, Role.USER.getRoleId()); + } + + public void saveUser(String username, AuthenticationType authenticationType, String role) + throws IllegalArgumentException, IOException { if (!isUsernameValid(username)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } @@ -144,7 +152,7 @@ public class UserService implements UserServiceInterface { user.setUsername(username); user.setEnabled(true); user.setFirstLogin(false); - user.addAuthority(new Authority(Role.USER.getRoleId(), user)); + user.addAuthority(new Authority(role, user)); user.setAuthenticationType(authenticationType); userRepository.save(user); databaseBackupHelper.exportDatabase(); @@ -186,7 +194,7 @@ public class UserService implements UserServiceInterface { } public void deleteUser(String username) { - Optional userOpt = userRepository.findByUsernameIgnoreCase(username); + Optional userOpt = findByUsernameIgnoreCase(username); if (userOpt.isPresent()) { for (Authority authority : userOpt.get().getAuthorities()) { if (authority.getAuthority().equals(Role.INTERNAL_API_USER.getRoleId())) { @@ -195,21 +203,20 @@ public class UserService implements UserServiceInterface { } userRepository.delete(userOpt.get()); } + invalidateUserSessions(username); } public boolean usernameExists(String username) { - return userRepository.findByUsername(username).isPresent(); + return findByUsername(username).isPresent(); } public boolean usernameExistsIgnoreCase(String username) { - return userRepository.findByUsernameIgnoreCase(username).isPresent(); + return findByUsernameIgnoreCase(username).isPresent(); } public boolean hasUsers() { long userCount = userRepository.count(); - if (userRepository - .findByUsernameIgnoreCase(Role.INTERNAL_API_USER.getRoleId()) - .isPresent()) { + if (findByUsernameIgnoreCase(Role.INTERNAL_API_USER.getRoleId()).isPresent()) { userCount -= 1; } return userCount > 0; @@ -217,7 +224,7 @@ public class UserService implements UserServiceInterface { public void updateUserSettings(String username, Map updates) throws IOException { - Optional userOpt = userRepository.findByUsernameIgnoreCase(username); + Optional userOpt = findByUsernameIgnoreCase(username); if (userOpt.isPresent()) { User user = userOpt.get(); Map settingsMap = user.getSettings(); @@ -268,10 +275,17 @@ public class UserService implements UserServiceInterface { databaseBackupHelper.exportDatabase(); } - public void changeRole(User user, String newRole) { + public void changeRole(User user, String newRole) throws IOException { Authority userAuthority = this.findRole(user); userAuthority.setAuthority(newRole); authorityRepository.save(userAuthority); + databaseBackupHelper.exportDatabase(); + } + + public void changeUserEnabled(User user, Boolean enbeled) throws IOException { + user.setEnabled(enbeled); + userRepository.save(user); + databaseBackupHelper.exportDatabase(); } public boolean isPasswordCorrect(User user, String currentPassword) { @@ -295,14 +309,40 @@ public class UserService implements UserServiceInterface { } public boolean hasPassword(String username) { - Optional user = userRepository.findByUsernameIgnoreCase(username); + Optional user = findByUsernameIgnoreCase(username); return user.isPresent() && user.get().hasPassword(); } public boolean isAuthenticationTypeByUsername( String username, AuthenticationType authenticationType) { - Optional user = userRepository.findByUsernameIgnoreCase(username); + Optional user = findByUsernameIgnoreCase(username); return user.isPresent() && authenticationType.name().equalsIgnoreCase(user.get().getAuthenticationType()); } + + public boolean isUserDisabled(String username) { + Optional userOpt = findByUsernameIgnoreCase(username); + return userOpt.map(user -> !user.isEnabled()).orElse(false); + } + + public void invalidateUserSessions(String username) { + String usernameP = ""; + for (Object principal : sessionRegistry.getAllPrincipals()) { + for (SessionInformation sessionsInformation : + sessionRegistry.getAllSessions(principal, false)) { + if (principal instanceof UserDetails) { + UserDetails userDetails = (UserDetails) principal; + usernameP = userDetails.getUsername(); + } else if (principal instanceof OAuth2User) { + OAuth2User oAuth2User = (OAuth2User) principal; + usernameP = oAuth2User.getName(); + } else if (principal instanceof String) { + usernameP = (String) principal; + } + if (usernameP.equalsIgnoreCase(username)) { + sessionRegistry.expireSession(sessionsInformation.getSessionId()); + } + } + } + } } diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java index c3827bf3..ebbe08f4 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java @@ -2,8 +2,8 @@ package stirling.software.SPDF.config.security.oauth2; import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.DisabledException; import org.springframework.security.authentication.LockedException; import org.springframework.security.core.AuthenticationException; import org.springframework.security.oauth2.core.OAuth2AuthenticationException; @@ -13,19 +13,34 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +@Slf4j public class CustomOAuth2AuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { - private static final Logger logger = - LoggerFactory.getLogger(CustomOAuth2AuthenticationFailureHandler.class); - @Override public void onAuthenticationFailure( HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { + + if (exception instanceof BadCredentialsException) { + log.error("BadCredentialsException", exception); + getRedirectStrategy().sendRedirect(request, response, "/login?error=badcredentials"); + return; + } + if (exception instanceof DisabledException) { + log.error("User is deactivated: ", exception); + getRedirectStrategy().sendRedirect(request, response, "/logout?userIsDisabled=true"); + return; + } + if (exception instanceof LockedException) { + log.error("Account locked: ", exception); + getRedirectStrategy().sendRedirect(request, response, "/logout?error=locked"); + return; + } if (exception instanceof OAuth2AuthenticationException) { OAuth2Error error = ((OAuth2AuthenticationException) exception).getError(); @@ -34,17 +49,13 @@ public class CustomOAuth2AuthenticationFailureHandler if (error.getErrorCode().equals("Password must not be null")) { errorCode = "userAlreadyExistsWeb"; } - logger.error("OAuth2 Authentication error: " + errorCode); + log.error("OAuth2 Authentication error: " + errorCode); + log.error("OAuth2AuthenticationException", exception); getRedirectStrategy() .sendRedirect(request, response, "/logout?erroroauth=" + errorCode); return; - } else if (exception instanceof LockedException) { - logger.error("Account locked: ", exception); - getRedirectStrategy().sendRedirect(request, response, "/logout?error=locked"); - return; - } else { - logger.error("Unhandled authentication exception", exception); - super.onAuthenticationFailure(request, response, exception); } + log.error("Unhandled authentication exception", exception); + super.onAuthenticationFailure(request, response, exception); } } diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java index 6d68d95b..4c7e04d9 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java @@ -2,10 +2,9 @@ package stirling.software.SPDF.config.security.oauth2; import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.security.authentication.LockedException; import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.savedrequest.SavedRequest; @@ -26,9 +25,6 @@ public class CustomOAuth2AuthenticationSuccessHandler private LoginAttemptService loginAttemptService; - private static final Logger logger = - LoggerFactory.getLogger(CustomOAuth2AuthenticationSuccessHandler.class); - private ApplicationProperties applicationProperties; private UserService userService; @@ -46,6 +42,17 @@ public class CustomOAuth2AuthenticationSuccessHandler HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException { + Object principal = authentication.getPrincipal(); + String username = ""; + + if (principal instanceof OAuth2User) { + OAuth2User oauthUser = (OAuth2User) principal; + username = oauthUser.getName(); + } else if (principal instanceof UserDetails) { + UserDetails oauthUser = (UserDetails) principal; + username = oauthUser.getUsername(); + } + // Get the saved request HttpSession session = request.getSession(false); String contextPath = request.getContextPath(); @@ -59,11 +66,8 @@ public class CustomOAuth2AuthenticationSuccessHandler // Redirect to the original destination super.onAuthenticationSuccess(request, response, authentication); } else { - OAuth2User oauthUser = (OAuth2User) authentication.getPrincipal(); OAUTH2 oAuth = applicationProperties.getSecurity().getOAUTH2(); - String username = oauthUser.getName(); - if (loginAttemptService.isBlocked(username)) { if (session != null) { session.removeAttribute("SPRING_SECURITY_SAVED_REQUEST"); @@ -78,15 +82,21 @@ public class CustomOAuth2AuthenticationSuccessHandler && oAuth.getAutoCreateUser()) { response.sendRedirect(contextPath + "/logout?oauth2AuthenticationErrorWeb=true"); return; - } else { - try { - userService.processOAuth2PostLogin(username, oAuth.getAutoCreateUser()); - response.sendRedirect(contextPath + "/"); - return; - } catch (IllegalArgumentException e) { - response.sendRedirect(contextPath + "/logout?invalidUsername=true"); + } + try { + if (oAuth.getBlockRegistration() + && !userService.usernameExistsIgnoreCase(username)) { + response.sendRedirect(contextPath + "/logout?oauth2_admin_blocked_user=true"); return; } + if (principal instanceof OAuth2User) { + userService.processOAuth2PostLogin(username, oAuth.getAutoCreateUser()); + } + response.sendRedirect(contextPath + "/"); + return; + } catch (IllegalArgumentException e) { + response.sendRedirect(contextPath + "/logout?invalidUsername=true"); + return; } } } diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java index 0f28025f..907ddd4b 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java @@ -2,34 +2,26 @@ package stirling.software.SPDF.config.security.oauth2; import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; -import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; import stirling.software.SPDF.model.Provider; import stirling.software.SPDF.model.provider.UnsupportedProviderException; import stirling.software.SPDF.utils.UrlUtils; +@Slf4j public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler { - private static final Logger logger = - LoggerFactory.getLogger(CustomOAuth2LogoutSuccessHandler.class); - - private final SessionRegistry sessionRegistry; private final ApplicationProperties applicationProperties; - public CustomOAuth2LogoutSuccessHandler( - ApplicationProperties applicationProperties, SessionRegistry sessionRegistry) { - this.sessionRegistry = sessionRegistry; + public CustomOAuth2LogoutSuccessHandler(ApplicationProperties applicationProperties) { this.applicationProperties = applicationProperties; } @@ -42,6 +34,15 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand String issuer = null; String clientId = null; + if (authentication == null) { + if (request.getParameter("userIsDisabled") != null) { + response.sendRedirect( + request.getContextPath() + "/login?erroroauth=userIsDisabled"); + } else { + super.onLogoutSuccess(request, response, authentication); + } + return; + } OAUTH2 oauth = applicationProperties.getSecurity().getOAUTH2(); if (authentication instanceof OAuth2AuthenticationToken) { @@ -53,9 +54,8 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand issuer = provider.getIssuer(); clientId = provider.getClientId(); } catch (UnsupportedProviderException e) { - logger.error(e.getMessage()); + log.error(e.getMessage()); } - } else { registrationId = oauth.getProvider() != null ? oauth.getProvider() : ""; issuer = oauth.getIssuer(); @@ -70,18 +70,16 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand param = "erroroauth=" + sanitizeInput(errorMessage); } else if (request.getParameter("oauth2AutoCreateDisabled") != null) { param = "error=oauth2AutoCreateDisabled"; + } else if (request.getParameter("oauth2_admin_blocked_user") != null) { + param = "erroroauth=oauth2_admin_blocked_user"; + } else if (request.getParameter("userIsDisabled") != null) { + param = "erroroauth=userIsDisabled"; + } else if (request.getParameter("badcredentials") != null) { + param = "error=badcredentials"; } String redirect_url = UrlUtils.getOrigin(request) + "/login?" + param; - HttpSession session = request.getSession(false); - if (session != null) { - String sessionId = session.getId(); - sessionRegistry.removeSessionInformation(sessionId); - session.invalidate(); - logger.info("Session invalidated: " + sessionId); - } - switch (registrationId.toLowerCase()) { case "keycloak": // Add Keycloak specific logout URL if needed @@ -92,13 +90,13 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand + clientId + "&post_logout_redirect_uri=" + response.encodeRedirectURL(redirect_url); - logger.info("Redirecting to Keycloak logout URL: " + logoutUrl); + log.info("Redirecting to Keycloak logout URL: " + logoutUrl); response.sendRedirect(logoutUrl); break; case "github": // Add GitHub specific logout URL if needed String githubLogoutUrl = "https://github.com/logout"; - logger.info("Redirecting to GitHub logout URL: " + githubLogoutUrl); + log.info("Redirecting to GitHub logout URL: " + githubLogoutUrl); response.sendRedirect(githubLogoutUrl); break; case "google": @@ -106,13 +104,14 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand // String googleLogoutUrl = // "https://accounts.google.com/Logout?continue=https://appengine.google.com/_ah/logout?continue=" // + response.encodeRedirectURL(redirect_url); - // logger.info("Redirecting to Google logout URL: " + googleLogoutUrl); + log.info("Google does not have a specific logout URL"); + // log.info("Redirecting to Google logout URL: " + googleLogoutUrl); // response.sendRedirect(googleLogoutUrl); // break; default: - String redirectUrl = request.getContextPath() + "/login?" + param; - logger.info("Redirecting to default logout URL: " + redirectUrl); - response.sendRedirect(redirectUrl); + String defaultRedirectUrl = request.getContextPath() + "/login?" + param; + log.info("Redirecting to default logout URL: " + defaultRedirectUrl); + response.sendRedirect(defaultRedirectUrl); break; } } diff --git a/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java new file mode 100644 index 00000000..a4129e6a --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java @@ -0,0 +1,26 @@ +package stirling.software.SPDF.config.security.session; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import jakarta.servlet.http.HttpSessionEvent; +import jakarta.servlet.http.HttpSessionListener; +import lombok.extern.slf4j.Slf4j; + +@Component +@Slf4j +public class CustomHttpSessionListener implements HttpSessionListener { + + @Autowired private SessionPersistentRegistry sessionPersistentRegistry; + + @Override + public void sessionCreated(HttpSessionEvent se) { + log.info("Session created: " + se.getSession().getId()); + } + + @Override + public void sessionDestroyed(HttpSessionEvent se) { + log.info("Session destroyed: " + se.getSession().getId()); + sessionPersistentRegistry.expireSession(se.getSession().getId()); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java new file mode 100644 index 00000000..bb63a8b5 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java @@ -0,0 +1,183 @@ +package stirling.software.SPDF.config.security.session; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.session.SessionInformation; +import org.springframework.security.core.session.SessionRegistry; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Component; + +import jakarta.transaction.Transactional; +import stirling.software.SPDF.model.SessionEntity; + +@Component +public class SessionPersistentRegistry implements SessionRegistry { + + private final SessionRepository sessionRepository; + + @Value("${server.servlet.session.timeout:30m}") + private Duration defaultMaxInactiveInterval; + + public SessionPersistentRegistry(SessionRepository sessionRepository) { + this.sessionRepository = sessionRepository; + } + + @Override + public List getAllPrincipals() { + List sessions = sessionRepository.findAll(); + List principals = new ArrayList<>(); + for (SessionEntity session : sessions) { + principals.add(session.getPrincipalName()); + } + return principals; + } + + @Override + public List getAllSessions( + Object principal, boolean includeExpiredSessions) { + List sessionInformations = new ArrayList<>(); + String principalName = null; + + if (principal instanceof UserDetails) { + principalName = ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + principalName = ((OAuth2User) principal).getName(); + } else if (principal instanceof String) { + principalName = (String) principal; + } + + if (principalName != null) { + List sessionEntities = + sessionRepository.findByPrincipalName(principalName); + for (SessionEntity sessionEntity : sessionEntities) { + if (includeExpiredSessions || !sessionEntity.isExpired()) { + sessionInformations.add( + new SessionInformation( + sessionEntity.getPrincipalName(), + sessionEntity.getSessionId(), + sessionEntity.getLastRequest())); + } + } + } + return sessionInformations; + } + + @Override + @Transactional + public void registerNewSession(String sessionId, Object principal) { + String principalName = null; + + if (principal instanceof UserDetails) { + principalName = ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + principalName = ((OAuth2User) principal).getName(); + } else if (principal instanceof String) { + principalName = (String) principal; + } + + if (principalName != null) { + SessionEntity sessionEntity = new SessionEntity(); + sessionEntity.setSessionId(sessionId); + sessionEntity.setPrincipalName(principalName); + sessionEntity.setLastRequest(new Date()); // Set lastRequest to the current date + sessionEntity.setExpired(false); + sessionRepository.save(sessionEntity); + } + } + + @Override + @Transactional + public void removeSessionInformation(String sessionId) { + sessionRepository.deleteById(sessionId); + } + + @Override + @Transactional + public void refreshLastRequest(String sessionId) { + Optional sessionEntityOpt = sessionRepository.findById(sessionId); + if (sessionEntityOpt.isPresent()) { + SessionEntity sessionEntity = sessionEntityOpt.get(); + sessionEntity.setLastRequest(new Date()); // Update lastRequest to the current date + sessionRepository.save(sessionEntity); + } + } + + @Override + public SessionInformation getSessionInformation(String sessionId) { + Optional sessionEntityOpt = sessionRepository.findById(sessionId); + if (sessionEntityOpt.isPresent()) { + SessionEntity sessionEntity = sessionEntityOpt.get(); + return new SessionInformation( + sessionEntity.getPrincipalName(), + sessionEntity.getSessionId(), + sessionEntity.getLastRequest()); + } + return null; + } + + // Retrieve all non-expired sessions + public List getAllSessionsNotExpired() { + return sessionRepository.findByExpired(false); + } + + // Retrieve all sessions + public List getAllSessions() { + return sessionRepository.findAll(); + } + + // Mark a session as expired + public void expireSession(String sessionId) { + Optional sessionEntityOpt = sessionRepository.findById(sessionId); + if (sessionEntityOpt.isPresent()) { + SessionEntity sessionEntity = sessionEntityOpt.get(); + sessionEntity.setExpired(true); // Set expired to true + sessionRepository.save(sessionEntity); + } + } + + // Get the maximum inactive interval for sessions + public int getMaxInactiveInterval() { + return (int) defaultMaxInactiveInterval.getSeconds(); + } + + // Retrieve a session entity by session ID + public SessionEntity getSessionEntity(String sessionId) { + return sessionRepository.findBySessionId(sessionId); + } + + // Update session details by principal name + public void updateSessionByPrincipalName( + String principalName, boolean expired, Date lastRequest) { + sessionRepository.saveByPrincipalName(expired, lastRequest, principalName); + } + + // Find the latest session for a given principal name + public Optional findLatestSession(String principalName) { + List allSessions = sessionRepository.findByPrincipalName(principalName); + if (allSessions.isEmpty()) { + return Optional.empty(); + } + + // Sort sessions by lastRequest in descending order + Collections.sort( + allSessions, + new Comparator() { + @Override + public int compare(SessionEntity s1, SessionEntity s2) { + // Sort by lastRequest in descending order + return s2.getLastRequest().compareTo(s1.getLastRequest()); + } + }); + + // The first session in the list is the latest session for the given principal name + return Optional.of(allSessions.get(0)); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java new file mode 100644 index 00000000..8fa24e95 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java @@ -0,0 +1,20 @@ +package stirling.software.SPDF.config.security.session; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.session.SessionRegistryImpl; + +@Configuration +public class SessionRegistryConfig { + + @Bean + public SessionRegistryImpl sessionRegistry() { + return new SessionRegistryImpl(); + } + + @Bean + public SessionPersistentRegistry sessionPersistentRegistry( + SessionRepository sessionRepository) { + return new SessionPersistentRegistry(sessionRepository); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java new file mode 100644 index 00000000..0cc875a2 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java @@ -0,0 +1,31 @@ +package stirling.software.SPDF.config.security.session; + +import java.util.Date; +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import jakarta.transaction.Transactional; +import stirling.software.SPDF.model.SessionEntity; + +@Repository +public interface SessionRepository extends JpaRepository { + List findByPrincipalName(String principalName); + + List findByExpired(boolean expired); + + SessionEntity findBySessionId(String sessionId); + + @Modifying + @Transactional + @Query( + "UPDATE SessionEntity s SET s.expired = :expired, s.lastRequest = :lastRequest WHERE s.principalName = :principalName") + void saveByPrincipalName( + @Param("expired") boolean expired, + @Param("lastRequest") Date lastRequest, + @Param("principalName") String principalName); +} diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java new file mode 100644 index 00000000..aa920f84 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java @@ -0,0 +1,35 @@ +package stirling.software.SPDF.config.security.session; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.security.core.session.SessionInformation; +import org.springframework.stereotype.Component; + +@Component +public class SessionScheduled { + @Autowired private SessionPersistentRegistry sessionPersistentRegistry; + + @Scheduled(cron = "0 0/5 * * * ?") + public void expireSessions() { + Instant now = Instant.now(); + + for (Object principal : sessionPersistentRegistry.getAllPrincipals()) { + List sessionInformations = + sessionPersistentRegistry.getAllSessions(principal, false); + for (SessionInformation sessionInformation : sessionInformations) { + Date lastRequest = sessionInformation.getLastRequest(); + int maxInactiveInterval = sessionPersistentRegistry.getMaxInactiveInterval(); + Instant expirationTime = + lastRequest.toInstant().plus(maxInactiveInterval, ChronoUnit.SECONDS); + if (now.isAfter(expirationTime)) { + sessionPersistentRegistry.expireSession(sessionInformation.getSessionId()); + } + } + } + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index b0deefa0..bc59b91e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -3,6 +3,7 @@ package stirling.software.SPDF.controller.api; import java.io.IOException; import java.security.Principal; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -12,8 +13,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; import org.springframework.security.core.session.SessionInformation; -import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -30,6 +31,8 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import stirling.software.SPDF.config.security.UserService; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; +import stirling.software.SPDF.model.AuthenticationType; import stirling.software.SPDF.model.Role; import stirling.software.SPDF.model.User; import stirling.software.SPDF.model.api.user.UsernameAndPass; @@ -41,6 +44,8 @@ public class UserController { @Autowired private UserService userService; + @Autowired SessionPersistentRegistry sessionRegistry; + @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/register") public String register(@ModelAttribute UsernameAndPass requestModel, Model model) @@ -203,9 +208,10 @@ public class UserController { @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/admin/saveUser") public RedirectView saveUser( - @RequestParam(name = "username") String username, - @RequestParam(name = "password") String password, + @RequestParam String username, + @RequestParam(name = "password", required = false) String password, @RequestParam(name = "role") String role, + @RequestParam(name = "authType") String authType, @RequestParam(name = "forceChange", required = false, defaultValue = "false") boolean forceChange) throws IllegalArgumentException, IOException { @@ -237,7 +243,15 @@ public class UserController { return new RedirectView("/addUsers?messageType=invalidRole", true); } - userService.saveUser(username, password, role, forceChange); + if (authType.equalsIgnoreCase(AuthenticationType.OAUTH2.toString())) { + userService.saveUser(username, AuthenticationType.OAUTH2, role); + } else { + if (password.isBlank()) { + return new RedirectView("/addUsers?messageType=invalidPassword", true); + } + userService.saveUser(username, password, role, forceChange); + } + return new RedirectView( "/addUsers", true); // Redirect to account page after adding the user } @@ -247,7 +261,8 @@ public class UserController { public RedirectView changeRole( @RequestParam(name = "username") String username, @RequestParam(name = "role") String role, - Authentication authentication) { + Authentication authentication) + throws IOException { Optional userOpt = userService.findByUsernameIgnoreCase(username); @@ -278,6 +293,60 @@ public class UserController { User user = userOpt.get(); userService.changeRole(user, role); + + return new RedirectView( + "/addUsers", true); // Redirect to account page after adding the user + } + + @PreAuthorize("hasRole('ROLE_ADMIN')") + @PostMapping("/admin/changeUserEnabled/{username}") + public RedirectView changeUserEnabled( + @PathVariable("username") String username, + @RequestParam("enabled") boolean enabled, + Authentication authentication) + throws IOException { + + Optional userOpt = userService.findByUsernameIgnoreCase(username); + + if (!userOpt.isPresent()) { + return new RedirectView("/addUsers?messageType=userNotFound", true); + } + if (!userService.usernameExistsIgnoreCase(username)) { + return new RedirectView("/addUsers?messageType=userNotFound", true); + } + // Get the currently authenticated username + String currentUsername = authentication.getName(); + + // Check if the provided username matches the current session's username + if (currentUsername.equalsIgnoreCase(username)) { + return new RedirectView("/addUsers?messageType=disabledCurrentUser", true); + } + User user = userOpt.get(); + + userService.changeUserEnabled(user, enabled); + + if (!enabled) { + // Invalidate all sessions if the user is being disabled + List principals = sessionRegistry.getAllPrincipals(); + String userNameP = ""; + for (Object principal : principals) { + List sessionsInformations = + sessionRegistry.getAllSessions(principal, false); + if (principal instanceof UserDetails) { + userNameP = ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + userNameP = ((OAuth2User) principal).getName(); + } else if (principal instanceof String) { + userNameP = (String) principal; + } + if (userNameP.equalsIgnoreCase(username)) { + for (SessionInformation sessionsInformation : sessionsInformations) { + sessionRegistry.expireSession(sessionsInformation.getSessionId()); + } + } + } + } + return new RedirectView( "/addUsers", true); // Redirect to account page after adding the user } @@ -285,7 +354,7 @@ public class UserController { @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/admin/deleteUser/{username}") public RedirectView deleteUser( - @PathVariable(name = "username") String username, Authentication authentication) { + @PathVariable("username") String username, Authentication authentication) { if (!userService.usernameExistsIgnoreCase(username)) { return new RedirectView("/addUsers?messageType=deleteUsernameExists", true); @@ -298,27 +367,18 @@ public class UserController { if (currentUsername.equalsIgnoreCase(username)) { return new RedirectView("/addUsers?messageType=deleteCurrentUser", true); } - invalidateUserSessions(username); + + // Invalidate all sessions before deleting the user + List sessionsInformations = + sessionRegistry.getAllSessions(authentication.getPrincipal(), false); + for (SessionInformation sessionsInformation : sessionsInformations) { + sessionRegistry.expireSession(sessionsInformation.getSessionId()); + sessionRegistry.removeSessionInformation(sessionsInformation.getSessionId()); + } userService.deleteUser(username); return new RedirectView("/addUsers", true); } - @Autowired private SessionRegistry sessionRegistry; - - private void invalidateUserSessions(String username) { - for (Object principal : sessionRegistry.getAllPrincipals()) { - if (principal instanceof UserDetails) { - UserDetails userDetails = (UserDetails) principal; - if (userDetails.getUsername().equals(username)) { - for (SessionInformation session : - sessionRegistry.getAllSessions(principal, false)) { - session.expireNow(); - } - } - } - } - } - @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/get-api-key") public ResponseEntity getApiKey(Principal principal) { diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index 73d2a0c4..57c97e75 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -1,13 +1,15 @@ package stirling.software.SPDF.controller.web; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; @@ -23,11 +25,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client; import stirling.software.SPDF.model.Authority; import stirling.software.SPDF.model.Role; +import stirling.software.SPDF.model.SessionEntity; import stirling.software.SPDF.model.User; import stirling.software.SPDF.model.provider.GithubProvider; import stirling.software.SPDF.model.provider.GoogleProvider; @@ -35,15 +40,20 @@ import stirling.software.SPDF.model.provider.KeycloakProvider; import stirling.software.SPDF.repository.UserRepository; @Controller +@Slf4j @Tag(name = "Account Security", description = "Account Security APIs") public class AccountWebController { @Autowired ApplicationProperties applicationProperties; - private static final Logger logger = LoggerFactory.getLogger(AccountWebController.class); + @Autowired SessionPersistentRegistry sessionPersistentRegistry; + + @Autowired + private UserRepository userRepository; // Assuming you have a repository for user operations @GetMapping("/login") public String login(HttpServletRequest request, Model model, Authentication authentication) { + // If the user is already authenticated, redirect them to the home page. if (authentication != null && authentication.isAuthenticated()) { return "redirect:/"; } @@ -137,6 +147,13 @@ public class AccountWebController { break; case "invalid_id_token": erroroauth = "login.oauth2InvalidIdToken"; + break; + case "oauth2_admin_blocked_user": + erroroauth = "login.oauth2AdminBlockedUser"; + break; + case "userIsDisabled": + erroroauth = "login.userIsDisabled"; + break; default: break; } @@ -155,9 +172,6 @@ public class AccountWebController { return "login"; } - @Autowired - private UserRepository userRepository; // Assuming you have a repository for user operations - @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/addUsers") public String showAddUserForm( @@ -166,6 +180,13 @@ public class AccountWebController { Iterator iterator = allUsers.iterator(); Map roleDetails = Role.getAllRoleDetails(); + // Map to store session information and user activity status + Map userSessions = new HashMap<>(); + Map userLastRequest = new HashMap<>(); + + int activeUsers = 0; + int disabledUsers = 0; + while (iterator.hasNext()) { User user = iterator.next(); if (user != null) { @@ -176,9 +197,73 @@ public class AccountWebController { break; // Break out of the inner loop once the user is removed } } + + // Determine the user's session status and last request time + int maxInactiveInterval = sessionPersistentRegistry.getMaxInactiveInterval(); + boolean hasActiveSession = false; + Date lastRequest = null; + + Optional latestSession = + sessionPersistentRegistry.findLatestSession(user.getUsername()); + if (latestSession.isPresent()) { + SessionEntity sessionEntity = latestSession.get(); + Date lastAccessedTime = sessionEntity.getLastRequest(); + Instant now = Instant.now(); + + // Calculate session expiration and update session status accordingly + Instant expirationTime = + lastAccessedTime + .toInstant() + .plus(maxInactiveInterval, ChronoUnit.SECONDS); + if (now.isAfter(expirationTime)) { + sessionPersistentRegistry.expireSession(sessionEntity.getSessionId()); + hasActiveSession = false; + } else { + hasActiveSession = !sessionEntity.isExpired(); + } + + lastRequest = sessionEntity.getLastRequest(); + } else { + hasActiveSession = false; + lastRequest = new Date(0); // No session, set default last request time + } + + userSessions.put(user.getUsername(), hasActiveSession); + userLastRequest.put(user.getUsername(), lastRequest); + + if (hasActiveSession) { + activeUsers++; + } + if (!user.isEnabled()) { + disabledUsers++; + } } } + // Sort users by active status and last request date + List sortedUsers = + allUsers.stream() + .sorted( + (u1, u2) -> { + boolean u1Active = userSessions.get(u1.getUsername()); + boolean u2Active = userSessions.get(u2.getUsername()); + + if (u1Active && !u2Active) { + return -1; + } else if (!u1Active && u2Active) { + return 1; + } else { + Date u1LastRequest = + userLastRequest.getOrDefault( + u1.getUsername(), new Date(0)); + Date u2LastRequest = + userLastRequest.getOrDefault( + u2.getUsername(), new Date(0)); + return u2LastRequest.compareTo(u1LastRequest); + } + }) + .collect(Collectors.toList()); + String messageType = request.getParameter("messageType"); String deleteMessage = null; @@ -203,6 +288,9 @@ public class AccountWebController { case "invalidUsername": addMessage = "invalidUsernameMessage"; break; + case "invalidPassword": + addMessage = "invalidPasswordMessage"; + break; default: break; } @@ -218,16 +306,24 @@ public class AccountWebController { case "downgradeCurrentUser": changeMessage = "downgradeCurrentUserMessage"; break; - + case "disabledCurrentUser": + changeMessage = "disabledCurrentUserMessage"; + break; default: + changeMessage = messageType; break; } model.addAttribute("changeMessage", changeMessage); } - model.addAttribute("users", allUsers); + model.addAttribute("users", sortedUsers); model.addAttribute("currentUsername", authentication.getName()); model.addAttribute("roleDetails", roleDetails); + model.addAttribute("userSessions", userSessions); + model.addAttribute("userLastRequest", userLastRequest); + model.addAttribute("totalUsers", allUsers.size()); + model.addAttribute("activeUsers", activeUsers); + model.addAttribute("disabledUsers", disabledUsers); return "addUsers"; } @@ -278,7 +374,7 @@ public class AccountWebController { settingsJson = objectMapper.writeValueAsString(user.get().getSettings()); } catch (JsonProcessingException e) { // Handle JSON conversion error - logger.error("exception", e); + log.error("exception", e); return "redirect:/error"; } diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index cbb32cff..266d4520 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -241,6 +241,7 @@ public class ApplicationProperties { private String clientId; private String clientSecret; private Boolean autoCreateUser = false; + private Boolean blockRegistration = false; private String useAsUsername; private Collection scopes = new ArrayList<>(); private String provider; @@ -286,6 +287,14 @@ public class ApplicationProperties { this.autoCreateUser = autoCreateUser; } + public Boolean getBlockRegistration() { + return blockRegistration; + } + + public void setBlockRegistration(Boolean blockRegistration) { + this.blockRegistration = blockRegistration; + } + public String getUseAsUsername() { return useAsUsername; } @@ -356,6 +365,8 @@ public class ApplicationProperties { + (clientSecret != null && !clientSecret.isEmpty() ? "MASKED" : "NULL") + ", autoCreateUser=" + autoCreateUser + + ", blockRegistration=" + + blockRegistration + ", useAsUsername=" + useAsUsername + ", provider=" diff --git a/src/main/java/stirling/software/SPDF/model/SessionEntity.java b/src/main/java/stirling/software/SPDF/model/SessionEntity.java new file mode 100644 index 00000000..3b4989d5 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/SessionEntity.java @@ -0,0 +1,23 @@ +package stirling.software.SPDF.model; + +import java.io.Serializable; +import java.util.Date; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Data +@Table(name = "sessions") +public class SessionEntity implements Serializable { + @Id private String sessionId; + + @Lob private String principalName; + + private Date lastRequest; + + private boolean expired; +} diff --git a/src/main/java/stirling/software/SPDF/model/provider/GoogleProvider.java b/src/main/java/stirling/software/SPDF/model/provider/GoogleProvider.java index 2863801b..a3608df8 100644 --- a/src/main/java/stirling/software/SPDF/model/provider/GoogleProvider.java +++ b/src/main/java/stirling/software/SPDF/model/provider/GoogleProvider.java @@ -31,6 +31,14 @@ public class GoogleProvider extends Provider { private Collection scopes = new ArrayList<>(); private String useAsUsername = "email"; + @Override + public String getIssuer() { + return new String(); + } + + @Override + public void setIssuer(String issuer) {} + @Override public String getClientId() { return this.clientId; diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 88ec9539..3c7e03df 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=لا يمكن خفض دور المستخدم الحالي +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=لا يمكن تخفيض دور المستخدم الحالي. وبالتالي، لن يظهر المستخدم الحالي. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=تغيير دور المستخدم adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=تسجيل الدخول عبر تسجيل الدخول الأحادي login.oauth2AutoCreateDisabled=تم تعطيل مستخدم الإنشاء التلقائي لـ OAuth2 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index ce8bcc5e..a164a9da 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Потребителят не е намерен incorrectPasswordMessage=Текущата парола е неправилна. usernameExistsMessage=Новият потребител вече съществува. invalidUsernameMessage=Невалидно потребителско име, потребителското име може да съдържа само букви, цифри и следните специални знаци @._+- или трябва да е валиден имейл адрес. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Не може да се изтрие вписания в момента потребител. deleteUsernameExistsMessage=Потребителското име не съществува и не може да бъде изтрито. downgradeCurrentUserMessage=Не може да се понижи ролята на текущия потребител +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Не може да се понижи ролята на текущия потребител. Следователно текущият потребител няма да бъде показан. userAlreadyExistsOAuthMessage=Потребителят вече съществува като OAuth2 потребител. userAlreadyExistsWebMessage=Потребителят вече съществува като уеб-потребител. @@ -177,6 +179,7 @@ adminUserSettings.user=Потребител adminUserSettings.addUser=Добавяне на нов потребител adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Потребителското име може да съдържа само букви, цифри и следните специални символи @._+- или трябва да е валиден имейл адрес. adminUserSettings.roles=Роли adminUserSettings.role=Роля @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Принудете потребителя да п adminUserSettings.submit=Съхранете потребителя adminUserSettings.changeUserRole=Промяна на ролята на потребителя adminUserSettings.authenticated=Удостоверен +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Вашият акаунт е заключен. login.signinTitle=Моля впишете се login.ssoSignIn=Влизане чрез еднократно влизане login.oauth2AutoCreateDisabled=OAUTH2 Автоматично създаване на потребител е деактивирано +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Заявката за оторизация не е намерена login.oauth2InvalidUserInfoResponse=Невалидна информация за потребителя login.oauth2invalidRequest=Невалидна заявка login.oauth2AccessDenied=Отказан достъп login.oauth2InvalidTokenResponse=Невалиден отговор на токена login.oauth2InvalidIdToken=Невалиден токен за идентификатор +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 3d52a609..24c73bdb 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=No es pot reduir la funció de l'usuari actual +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=No es pot baixar la funció de l'usuari actual. Per tant, no es mostrarà l'usuari actual. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Usuari adminUserSettings.addUser=Afegir Usuari adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Rols adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Desar Usuari adminUserSettings.changeUserRole=Canvia el rol de l'usuari adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Compte bloquejat login.signinTitle=Autenticat login.ssoSignIn=Inicia sessió mitjançant l'inici de sessió ún login.oauth2AutoCreateDisabled=L'usuari de creació automàtica OAUTH2 està desactivat +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 490de1f7..bdbf6844 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Uživatel nenalezen. incorrectPasswordMessage=Současné heslo není správné. usernameExistsMessage=Nové uživatelské jméno již existuje. invalidUsernameMessage=Nesprávné uživatelské jméno, smí obsahovat pouze písmena, číslice a následující speciální znaky @._+- nebo musí být validní emailová adresa. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Nelze smazat aktuální přihlášeného uživatele. deleteUsernameExistsMessage=Uživatelské jméno neexistuje a nelze ho smazat. downgradeCurrentUserMessage=Nelze snížit roli aktuálního uživatele. +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nelze snížit roli aktuálního uživatele. Proto nebude aktuální uživatel zobrazen. userAlreadyExistsOAuthMessage=Uživatel již existuje jako OAuth2 uživatel. userAlreadyExistsWebMessage=Uživatel již existuje jako webový uživatel. @@ -177,6 +179,7 @@ adminUserSettings.user=Uživatel adminUserSettings.addUser=Přidat Nového Uživatele adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Uživatelské Jméno může obsahovat pouze písmena, čísla a následující speciální znaky @._+- nebo musí být správná emailová adresa. adminUserSettings.roles=Role adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Vynutit uživateli změnu hesla při přihlášen adminUserSettings.submit=Uložit Uživatele adminUserSettings.changeUserRole=Zmenit Roli Uživatele adminUserSettings.authenticated=Ověřeno +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Login via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index d445e4ef..e86a8a1c 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr=left to right, rtl = right to left) +# the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr pdfPrompt=Vælg PDF-fil(er) @@ -55,10 +55,12 @@ userNotFoundMessage=Bruger ikke fundet. incorrectPasswordMessage=Nuværende adgangskode er forkert. usernameExistsMessage=Nyt brugernavn findes allerede. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Cannot downgrade current user's role +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Cannot downgrade current user's role. Hence, current user will not be shown. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Login via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index d3f085cc..1edc764c 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Benutzer nicht gefunden. incorrectPasswordMessage=Das Passwort ist falsch. usernameExistsMessage=Neuer Benutzername existiert bereits. invalidUsernameMessage=Ungültiger Benutzername. Der Benutzername darf nur Buchstaben, Zahlen und die folgenden Sonderzeichen @._+- enthalten oder muss eine gültige E-Mail-Adresse sein. +invalidPasswordMessage=Das Passwort darf nicht leer sein und kein Leerzeichen am Anfang und Ende haben. confirmPasswordErrorMessage=„Neues Passwort“ und „Neues Passwort bestätigen“ müssen übereinstimmen. deleteCurrentUserMessage=Der aktuell angemeldete Benutzer kann nicht gelöscht werden. deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden. downgradeCurrentUserMessage=Die Rolle des aktuellen Benutzers kann nicht herabgestuft werden +disabledCurrentUserMessage=Der aktuelle Benutzer kann nicht deaktiviert werden downgradeCurrentUserLongMessage=Die Rolle des aktuellen Benutzers kann nicht herabgestuft werden. Daher wird der aktuelle Benutzer nicht angezeigt. userAlreadyExistsOAuthMessage=Der Benutzer ist bereits als OAuth2-Benutzer vorhanden. userAlreadyExistsWebMessage=Der Benutzer ist bereits als Webbenutzer vorhanden. @@ -177,10 +179,11 @@ adminUserSettings.user=Benutzer adminUserSettings.addUser=Neuen Benutzer hinzufügen adminUserSettings.deleteUser=Benutzer löschen adminUserSettings.confirmDeleteUser=Soll der Benutzer gelöscht werden? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Der Benutzername darf nur Buchstaben, Zahlen und die folgenden Sonderzeichen @._+- enthalten oder muss eine gültige E-Mail-Adresse sein. adminUserSettings.roles=Rollen adminUserSettings.role=Rolle -adminUserSettings.actions=Aktion +adminUserSettings.actions=Aktions adminUserSettings.apiUser=Eingeschränkter API-Benutzer adminUserSettings.extraApiUser=Zusätzlicher eingeschränkter API-Benutzer adminUserSettings.webOnlyUser=Nur Web-Benutzer @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Benutzer dazu zwingen, Benutzernamen/Passwort bei adminUserSettings.submit=Benutzer speichern adminUserSettings.changeUserRole=Benutzerrolle ändern adminUserSettings.authenticated=Authentifiziert +adminUserSettings.editOwnProfil=Eigenes Profil bearbeiten +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Datenbank Import/Export @@ -481,12 +491,14 @@ login.locked=Ihr Konto wurde gesperrt. login.signinTitle=Bitte melden Sie sich an. login.ssoSignIn=Anmeldung per Single Sign-On login.oauth2AutoCreateDisabled=OAUTH2 Benutzer automatisch erstellen deaktiviert +login.oauth2AdminBlockedUser=Die Registrierung bzw. das anmelden von nicht registrierten Benutzern ist derzeit gesperrt. Bitte wenden Sie sich an den Administrator. login.oauth2RequestNotFound=Autorisierungsanfrage nicht gefunden login.oauth2InvalidUserInfoResponse=Ungültige Benutzerinformationsantwort login.oauth2invalidRequest=ungültige Anfrage login.oauth2AccessDenied=Zugriff abgelehnt login.oauth2InvalidTokenResponse=Ungültige Token-Antwort login.oauth2InvalidIdToken=Ungültiges ID-Token +login.userIsDisabled=Benutzer ist deaktiviert, die Anmeldung ist mit diesem Benutzernamen derzeit gesperrt. Bitte wenden Sie sich an den Administrator. #auto-redact diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 22faef0e..c6a955b0 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Ο χρήστης δεν βρέθηκε. incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος. usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη. invalidUsernameMessage=Μη έγκυρο όνομα χρήστη, όνομα χρήστη μπορεί να περιέχει μόνο γράμματα, αριθμούς και τους ακόλουθους ειδικούς χαρακτήρες @._+- ή πρέπει να είναι έγκυρη διεύθυνση email. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Δεν είναι δυνατή η διαγραφή του τρέχοντος συνδεδεμένου χρήστη. deleteUsernameExistsMessage=Το όνομα χρήστη δεν υπάρχει και δεν μπορεί να διαγραφεί. downgradeCurrentUserMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη. Ως εκ τούτου, ο τρέχων χρήστης δεν θα εμφανίζεται. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Χρήστης adminUserSettings.addUser=Προσθήκη νέου Χρήστη adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Ρόλοι adminUserSettings.role=Ρόλος @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Αναγκάστε τον χρήστη να αλλ adminUserSettings.submit=Αποθήκευση Χρήστη adminUserSettings.changeUserRole=Αλλαγή ρόλου χρήστη adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Ο λογαριασμός σας έχει κλειδωθεί. login.signinTitle=Παρακαλώ, συνδεθείτε login.ssoSignIn=Σύνδεση μέσω μοναδικής σύνδεσης login.oauth2AutoCreateDisabled=Απενεργοποιήθηκε ο χρήστης αυτόματης δημιουργίας OAUTH2 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index e072dc64..6ecafacc 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Cannot downgrade current user's role +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Cannot downgrade current user's role. Hence, current user will not be shown. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Login via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index bd31c0b0..a4d8cd09 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Cannot downgrade current user's role +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Cannot downgrade current user's role. Hence, current user will not be shown. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Login via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 30fd1194..57087bd0 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Usuario no encontrado. incorrectPasswordMessage=La contraseña actual no es correcta. usernameExistsMessage=El nuevo nombre de usuario está en uso. invalidUsernameMessage=Nombre de usuario no válido, el nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actualmente en uso. deleteUsernameExistsMessage=El usuario no existe y no puede eliminarse. downgradeCurrentUserMessage=No se puede degradar el rol del usuario actual +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=No se puede degradar el rol del usuario actual. Por lo tanto, el usuario actual no se mostrará. userAlreadyExistsOAuthMessage=La usuario ya existe como usuario de OAuth2. userAlreadyExistsWebMessage=El usuario ya existe como usuario web. @@ -177,6 +179,7 @@ adminUserSettings.user=Usuario adminUserSettings.addUser=Añadir Nuevo Usuario adminUserSettings.deleteUser=Eliminar Usuario adminUserSettings.confirmDeleteUser=¿Se debe eliminar al usuario? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=El nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida. adminUserSettings.roles=Roles adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Forzar usuario a cambiar usuario/contraseña en el adminUserSettings.submit=Guardar Usuario adminUserSettings.changeUserRole=Cambiar rol de usuario adminUserSettings.authenticated=Autenticado +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Base de Datos Importar/Exportar @@ -481,12 +491,14 @@ login.locked=Su cuenta se ha bloqueado. login.signinTitle=Por favor, inicie sesión login.ssoSignIn=Iniciar sesión a través del inicio de sesión único login.oauth2AutoCreateDisabled=Usuario de creación automática de OAUTH2 DESACTIVADO +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Solicitud de autorización no encontrada login.oauth2InvalidUserInfoResponse=Respuesta de información de usuario no válida login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Respuesta de token no válida login.oauth2InvalidIdToken=Token de identificación no válido +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index c87a03cd..42775ed6 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Ezin da uneko erabiltzailearen rola jaitsi +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Ezin da uneko erabiltzailearen rola jaitsi. Beraz, oraingo erabiltzailea ez da erakutsiko. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Erabiltzaile adminUserSettings.addUser=Erabiltzaile berria adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Rolak adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Gorde Erabiltzailea adminUserSettings.changeUserRole=Erabiltzailearen rola aldatu adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Zure kontua blokeatu egin da. login.signinTitle=Mesedez, hasi saioa login.ssoSignIn=Hasi saioa Saioa hasteko modu bakarraren bidez login.oauth2AutoCreateDisabled=OAUTH2 Sortu automatikoki erabiltzailea desgaituta dago +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index ff199478..3062d93f 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Utilisateur non trouvé. incorrectPasswordMessage=Le mot de passe actuel est incorrect. usernameExistsMessage=Le nouveau nom d’utilisateur existe déjà. invalidUsernameMessage=Nom d’utilisateur invalide, le nom d’utilisateur ne peut contenir que des lettres, des chiffres et les caractères spéciaux suivants @._+- ou doit être une adresse e-mail valide. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Impossible de supprimer l’utilisateur actuellement connecté. deleteUsernameExistsMessage=Le nom d’utilisateur n’existe pas et ne peut pas être supprimé. downgradeCurrentUserMessage=Impossible de rétrograder le rôle de l'utilisateur actuel. +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Impossible de rétrograder le rôle de l'utilisateur actuel. Par conséquent, l'utilisateur actuel ne sera pas affiché. userAlreadyExistsOAuthMessage=L'utilisateur existe déjà en tant qu'utilisateur OAuth2. userAlreadyExistsWebMessage=L'utilisateur existe déjà en tant qu'utilisateur Web. @@ -177,6 +179,7 @@ adminUserSettings.user=Utilisateur adminUserSettings.addUser=Ajouter un utilisateur adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Le nom d'utilisateur ne peut contenir que des lettres, des chiffres et les caractères spéciaux suivants @._+- ou doit être une adresse e-mail valide. adminUserSettings.roles=Rôles adminUserSettings.role=Rôle @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Forcer l’utilisateur à changer son nom d’util adminUserSettings.submit=Ajouter adminUserSettings.changeUserRole=Changer le rôle de l'utilisateur adminUserSettings.authenticated=Authentifié +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Votre compte a été verrouillé. login.signinTitle=Veuillez vous connecter login.ssoSignIn=Se connecter via l'authentification unique login.oauth2AutoCreateDisabled=OAUTH2 Création automatique d'utilisateur désactivée +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Demande d'autorisation introuvable login.oauth2InvalidUserInfoResponse=Réponse contenant les informations de l'utilisateur est invalide login.oauth2invalidRequest=Requête invalide login.oauth2AccessDenied=Accès refusé login.oauth2InvalidTokenResponse=Réponse contenant le jeton est invalide login.oauth2InvalidIdToken=Jeton d'identification invalide +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index b2422077..f5567315 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr=left to right, rtl = right to left) +# the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr pdfPrompt=Roghnaigh PDF(s) @@ -55,10 +55,12 @@ userNotFoundMessage=Úsáideoir gan aimsiú. incorrectPasswordMessage=Tá an pasfhocal reatha mícheart. usernameExistsMessage=Tá Ainm Úsáideora Nua ann cheana féin. invalidUsernameMessage=Ainm úsáideora neamhbhailí, ní féidir ach litreacha, uimhreacha agus na carachtair speisialta seo a leanas @._+- a bheith san ainm úsáideora nó ní mór gur seoladh ríomhphoist bailí é. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Ní mór Pasfhocal Nua agus Deimhnigh Pasfhocal Nua a bheith ag teacht leis. deleteCurrentUserMessage=Ní féidir an t-úsáideoir atá logáilte isteach faoi láthair a scriosadh. deleteUsernameExistsMessage=Níl an t-ainm úsáideora ann agus ní féidir é a scriosadh. downgradeCurrentUserMessage=Ní féidir ról an úsáideora reatha a íosghrádú +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Ní féidir ról an úsáideora reatha a íosghrádú. Mar sin, ní thaispeánfar an t-úsáideoir reatha. userAlreadyExistsOAuthMessage=Tá an t-úsáideoir ann cheana mar úsáideoir OAuth2. userAlreadyExistsWebMessage=Tá an t-úsáideoir ann cheana féin mar úsáideoir gréasáin. @@ -177,6 +179,7 @@ adminUserSettings.user=Úsáideoir adminUserSettings.addUser=Cuir Úsáideoir Nua leis adminUserSettings.deleteUser=Scrios Úsáideoir adminUserSettings.confirmDeleteUser=Ar cheart an t-úsáideoir a scriosadh? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Ní féidir ach litreacha, uimhreacha agus na carachtair speisialta seo a leanas @._+- a bheith san ainm úsáideora nó ní mór gur seoladh ríomhphoist bailí é. adminUserSettings.roles=Róil adminUserSettings.role=Ról @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Cuir iallach ar an úsáideoir pasfhocal a athrú adminUserSettings.submit=Sábháil Úsáideoir adminUserSettings.changeUserRole=Athraigh Ról an Úsáideora adminUserSettings.authenticated=Fíordheimhnithe +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Iompórtáil / Easpórtáil Bunachar Sonraí @@ -481,12 +491,14 @@ login.locked=Tá do chuntas glasáilte. login.signinTitle=Sínigh isteach le do thoil login.ssoSignIn=Logáil isteach trí Chlárú Aonair login.oauth2AutoCreateDisabled=OAUTH2 Uath-Chruthaigh Úsáideoir faoi Mhíchumas +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Níor aimsíodh iarratas údaraithe login.oauth2InvalidUserInfoResponse=Freagra Neamhbhailí Faisnéise Úsáideora login.oauth2invalidRequest=Iarratas Neamhbhailí login.oauth2AccessDenied=Rochtain Diúltaithe login.oauth2InvalidTokenResponse=Freagra Comhartha Neamhbhailí login.oauth2InvalidIdToken=Comhartha Aitheantais Neamhbhailí +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 88082fa3..38bf33d5 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -55,10 +55,12 @@ userNotFoundMessage=उपयोगकर्ता नहीं मिला। incorrectPasswordMessage=वर्तमान पासवर्ड गलत है। usernameExistsMessage=नया उपयोगकर्ता नाम पहले से मौजूद है। invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता। इसलिए, वर्तमान उपयोगकर्ता को नहीं दिखाया जाएगा। userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=उपयोगकर्ता adminUserSettings.addUser=नया उपयोगकर्ता जोड़ें adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=रोल्स adminUserSettings.role=रोल @@ -190,6 +193,13 @@ adminUserSettings.forceChange=उपयोगकर्ता को लॉगि adminUserSettings.submit=उपयोगकर्ता को सहेजें adminUserSettings.changeUserRole=यूज़र की भूमिका बदलें adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=आपका खाता लॉक कर दिया गया login.signinTitle=कृपया साइन इन करें login.ssoSignIn=सिंगल साइन - ऑन के ज़रिए लॉग इन करें login.oauth2AutoCreateDisabled=OAUTH2 ऑटो - क्रिएट यूज़र अक्षम किया गया +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index 76bf2d27..e169a228 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Korisnik nije pronađen. incorrectPasswordMessage=Kriva zaporka. usernameExistsMessage=Korisničko ime već postoji invalidUsernameMessage=Nevažeće korisničko ime, korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Nije moguće izbrisati trenutno prijavljenog korisnika. deleteUsernameExistsMessage=Korisničko ime ne postoji i ne može se izbrisati. downgradeCurrentUserMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika. Dakle, trenutni korisnik neće biti prikazan. userAlreadyExistsOAuthMessage=Korisnik već postoji kao OAuth2 korisnik. userAlreadyExistsWebMessage=Korisnik već postoji kao web korisnik. @@ -177,6 +179,7 @@ adminUserSettings.user=Korisnik adminUserSettings.addUser=Dodaj novog korisnika adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte. adminUserSettings.roles=Uloge adminUserSettings.role=Uloga @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Prisiliti korisnika da promijeni lozinku prilikom adminUserSettings.submit=Spremi korisnika adminUserSettings.changeUserRole=Promijenite korisničku ulogu adminUserSettings.authenticated=Autentificirano +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Vaš račun je zaključan. login.signinTitle=Molimo vas da se prijavite login.ssoSignIn=Prijavite se putem jedinstvene prijave login.oauth2AutoCreateDisabled=OAUTH2 automatsko kreiranje korisnika je onemogućeno +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Zahtjev za autorizaciju nije pronađen login.oauth2InvalidUserInfoResponse=Nevažeće informacije o korisniku login.oauth2invalidRequest=Neispravan zahtjev login.oauth2AccessDenied=Pristup odbijen login.oauth2InvalidTokenResponse=Nevažeći odgovor tokena login.oauth2InvalidIdToken=Nevažeći ID token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index a032a9ea..e74120fc 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -55,10 +55,12 @@ userNotFoundMessage=A felhasználó nem található. incorrectPasswordMessage=A jelenlegi jelszó helytelen. usernameExistsMessage=Az új felhasználónév már létezik. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=A jelenlegi felhasználó szerepkörét nem lehet visszaminősíteni +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Az aktuális felhasználó szerepkörét nem lehet visszaminősíteni. Ezért az aktuális felhasználó nem jelenik meg. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Felhasználó adminUserSettings.addUser=Új felhasználó hozzáadása adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Szerepek adminUserSettings.role=Szerep @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Kényszerítse a felhasználót a felhasználóné adminUserSettings.submit=Felhasználó mentése adminUserSettings.changeUserRole=Felhasználó szerepkörének módosítása adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=A fiókja zárolva lett! login.signinTitle=Kérjük, jelentkezzen be! login.ssoSignIn=Bejelentkezés egyszeri bejelentkezéssel login.oauth2AutoCreateDisabled=OAUTH2 Felhasználó automatikus létrehozása letiltva +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index f081c1e3..2beee887 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Pengguna tidak ditemukan. incorrectPasswordMessage=Kata sandi saat ini salah. usernameExistsMessage=Nama pengguna baru sudah ada. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Tidak dapat menurunkan peran pengguna saat ini +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Tidak dapat menurunkan peran pengguna saat ini. Oleh karena itu, pengguna saat ini tidak akan ditampilkan. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Pengguna adminUserSettings.addUser=Tambahkan Pengguna Baru adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Peran adminUserSettings.role=Peran @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Memaksa pengguna untuk mengubah nama pengguna/kata adminUserSettings.submit=Simpan Pengguna adminUserSettings.changeUserRole=Ubah Peran Pengguna adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Akun Anda telah dikunci. login.signinTitle=Silakan masuk login.ssoSignIn=Masuk melalui Single Sign - on login.oauth2AutoCreateDisabled=OAUTH2 Buat Otomatis Pengguna Dinonaktifkan +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index d2a80a29..5d8b1eac 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Utente non trovato. incorrectPasswordMessage=La password attuale non è corretta. usernameExistsMessage=Il nuovo nome utente esiste già. invalidUsernameMessage=Nome utente non valido, il nome utente può contenere solo lettere, numeri e i seguenti caratteri speciali @._+- o deve essere un indirizzo email valido. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=La nuova password e la conferma della nuova password devono corrispondere. deleteCurrentUserMessage=Impossibile eliminare l'utente attualmente connesso. deleteUsernameExistsMessage=Il nome utente non esiste e non può essere eliminato. downgradeCurrentUserMessage=Impossibile declassare il ruolo dell'utente corrente +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Impossibile declassare il ruolo dell'utente corrente. Pertanto, l'utente corrente non verrà visualizzato. userAlreadyExistsOAuthMessage=L'utente esiste già come utente OAuth2. userAlreadyExistsWebMessage=L'utente esiste già come utente web. @@ -177,6 +179,7 @@ adminUserSettings.user=Utente adminUserSettings.addUser=Aggiungi un nuovo Utente adminUserSettings.deleteUser=Elimina utente adminUserSettings.confirmDeleteUser=L'utente deve essere eliminato? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Il nome utente può contenere solo lettere, numeri e i seguenti caratteri speciali @._+- oppure deve essere un indirizzo email valido. adminUserSettings.roles=Ruoli adminUserSettings.role=Ruolo @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Forza l'utente a cambiare nome username/password a adminUserSettings.submit=Salva utente adminUserSettings.changeUserRole=Cambia il ruolo dell'utente adminUserSettings.authenticated=Autenticato +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Importazione/Esportazione database @@ -481,12 +491,14 @@ login.locked=Il tuo account è stato bloccato. login.signinTitle=Per favore accedi login.ssoSignIn=Accedi tramite Single Sign-on login.oauth2AutoCreateDisabled=Creazione automatica utente OAUTH2 DISABILITATA +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Richiesta di autorizzazione non trovata login.oauth2InvalidUserInfoResponse=Risposta relativa alle informazioni utente non valida login.oauth2invalidRequest=Richiesta non valida login.oauth2AccessDenied=Accesso negato login.oauth2InvalidTokenResponse=Risposta token non valida login.oauth2InvalidIdToken=Id Token non valido +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 8ef8dcc8..afaf0d80 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -55,10 +55,12 @@ userNotFoundMessage=ユーザーが見つかりません。 incorrectPasswordMessage=現在のパスワードが正しくありません。 usernameExistsMessage=新しいユーザー名はすでに存在します。 invalidUsernameMessage=ユーザー名が無効です。ユーザー名には文字、数字、およびそれに続く特殊文字 @._+- のみを含めることができます。または、有効な電子メール アドレスである必要があります。 +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=新しいパスワードと新しいパスワードの確認は一致する必要があります。 deleteCurrentUserMessage=現在ログインしているユーザーは削除できません。 deleteUsernameExistsMessage=そのユーザー名は存在しないため削除できません。 downgradeCurrentUserMessage=現在のユーザーの役割をダウングレードできません +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=現在のユーザーの役割をダウングレードできません。したがって、現在のユーザーは表示されません。 userAlreadyExistsOAuthMessage=ユーザーは既にOAuth2ユーザーとして存在します。 userAlreadyExistsWebMessage=ユーザーは既にWebユーザーとして存在します。 @@ -177,6 +179,7 @@ adminUserSettings.user=ユーザー adminUserSettings.addUser=新しいユーザを追加 adminUserSettings.deleteUser=ユーザの削除 adminUserSettings.confirmDeleteUser=ユーザを本当に削除しますか? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=ユーザー名には、文字、数字、および次の特殊文字 @._+- のみを含めることができます。または、有効な電子メール アドレスである必要があります。 adminUserSettings.roles=役割 adminUserSettings.role=役割 @@ -190,6 +193,13 @@ adminUserSettings.forceChange=ログイン時にユーザー名/パスワード adminUserSettings.submit=ユーザーの保存 adminUserSettings.changeUserRole=ユーザーの役割を変更する adminUserSettings.authenticated=認証済 +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=データベースのインポート/エクスポート @@ -481,12 +491,14 @@ login.locked=あなたのアカウントはロックされています。 login.signinTitle=サインインしてください login.ssoSignIn=シングルサインオンでログイン login.oauth2AutoCreateDisabled=OAuth 2自動作成ユーザーが無効 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=認証リクエストが見つかりません login.oauth2InvalidUserInfoResponse=無効なユーザー情報の応答 login.oauth2invalidRequest=無効なリクエスト login.oauth2AccessDenied=アクセス拒否 login.oauth2InvalidTokenResponse=無効なトークン応答 login.oauth2InvalidIdToken=無効なIDトークン +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index a382f9d3..aaa68fba 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=사용자를 찾을 수 없습니다. incorrectPasswordMessage=현재 비밀번호가 틀립니다. usernameExistsMessage=새 사용자명이 이미 존재합니다. invalidUsernameMessage=잘못된 사용자 이름입니다. 사용자 이름에는 문자, 숫자 및 다음 특수 문자(@._+-)만 포함할 수 있거나 유효한 이메일 주소여야 합니다. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다. deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다. downgradeCurrentUserMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다 +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다. 따라서 현재 사용자는 표시되지 않습니다. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=사용자 adminUserSettings.addUser=새 사용자 추가 adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=사용자 이름은 문자, 숫자, 특수 문자 @._+-만 포함할 수 있으며 유효한 이메일 주소여야 합니다. adminUserSettings.roles=역할 adminUserSettings.role=역할 @@ -190,6 +193,13 @@ adminUserSettings.forceChange=다음 로그인 때 사용자명과 비밀번호 adminUserSettings.submit=사용자 저장 adminUserSettings.changeUserRole=사용자의 역할 변경 adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=계정이 잠겼습니다. login.signinTitle=로그인해 주세요. login.ssoSignIn=싱글사인온을 통한 로그인 login.oauth2AutoCreateDisabled=OAUTH2 사용자 자동 생성 비활성화됨 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 30396fda..a77e861b 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Gebruiker niet gevonden. incorrectPasswordMessage=Huidige wachtwoord is onjuist. usernameExistsMessage=Nieuwe gebruikersnaam bestaat al. invalidUsernameMessage=Ongeldige gebruikersnaam, gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Nieuw wachtwoord en bevestig wachtwoord moeten overeenkomen. deleteCurrentUserMessage=Kan niet een momenteel ingelogde gebruiker verwijderen. deleteUsernameExistsMessage=De gebruikersnaam bestaat niet en kan niet verwijderd worden. downgradeCurrentUserMessage=Kan de rol van de huidige gebruiker niet downgraden +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Kan de rol van de huidige gebruiker niet downgraden. Huidige gebruiker wordt dus niet weergegeven. userAlreadyExistsOAuthMessage=De gebruiker bestaat al als een OAuth2 gebruiker. userAlreadyExistsWebMessage=De gebruiker bestaat al als een web gebruiker. @@ -177,6 +179,7 @@ adminUserSettings.user=Gebruiker adminUserSettings.addUser=Voeg nieuwe gebruiker toe adminUserSettings.deleteUser=Verwijder gebruiker adminUserSettings.confirmDeleteUser=Moet deze gebruiker verwijderd worden? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn. adminUserSettings.roles=Rollen adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Forceer gebruiker om gebruikersnaam/wachtwoord te adminUserSettings.submit=Gebruiker opslaan adminUserSettings.changeUserRole=De rol van de gebruiker wijzigen adminUserSettings.authenticated=Geauthenticeerd +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Je account is geblokkeerd. login.signinTitle=Gelieve in te loggen login.ssoSignIn=Inloggen via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Automatisch aanmaken gebruiker uitgeschakeld +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Autorisatieverzoek niet gevonden login.oauth2InvalidUserInfoResponse=Ongeldige reactie op gebruikersinfo login.oauth2invalidRequest=Ongeldig verzoek login.oauth2AccessDenied=Toegang geweigerd login.oauth2InvalidTokenResponse=Ongeldige tokenreactie login.oauth2InvalidIdToken=Ongeldige ID token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 41f1870a..b4dcc466 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Bruker ikke funnet. incorrectPasswordMessage=Nåværende passord er feil. usernameExistsMessage=Det nye brukernavnet eksisterer allerede. invalidUsernameMessage=Ugyldig brukernavn, brukernavnet kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Nytt passord og Bekreft nytt passord må være like. deleteCurrentUserMessage=Kan ikke slette den innloggede brukeren. deleteUsernameExistsMessage=Brukernavnet eksisterer ikke og kan ikke slettes. downgradeCurrentUserMessage=Kan ikke nedgradere den innloggede brukerens rolle. +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Kan ikke nedgradere den innloggede brukerens rolle. Derfor vil ikke den innloggede brukeren bli vist. userAlreadyExistsOAuthMessage=Brukeren eksisterer allerede som en OAuth2-bruker. userAlreadyExistsWebMessage=Brukeren eksisterer allerede som en web-bruker. @@ -177,6 +179,7 @@ adminUserSettings.user=Bruker adminUserSettings.addUser=Legg til Ny Bruker adminUserSettings.deleteUser=Slett Bruker adminUserSettings.confirmDeleteUser=Skal brukeren slettes? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Brukernavn kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse. adminUserSettings.roles=Roller adminUserSettings.role=Rolle @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Tving bruker til å endre passord ved innlogging adminUserSettings.submit=Lagre Bruker adminUserSettings.changeUserRole=Endre Brukerens Rolle adminUserSettings.authenticated=Autentisert +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Eksport @@ -481,12 +491,14 @@ login.locked=Kontoen din har blitt låst. login.signinTitle=Vennligst logg inn login.ssoSignIn=Logg inn via Enkel Pålogging login.oauth2AutoCreateDisabled=OAUTH2 Auto-Opretting av bruker deaktivert +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Autentiseringsforespørsel ikke funnet login.oauth2InvalidUserInfoResponse=Ugyldig brukerinforespons login.oauth2invalidRequest=Ugyldig forespørsel login.oauth2AccessDenied=Tilgang nektet login.oauth2InvalidTokenResponse=Ugyldig tokenrespons login.oauth2InvalidIdToken=Ugyldig Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 55ce74f9..8958e6d0 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Brak użytkownika. incorrectPasswordMessage=Nieprawidłowe hasło. usernameExistsMessage=Taki uzytkownik już istnieje. invalidUsernameMessage=Niewłaściwa nazwa użytkownika - musi zawierać litery, cyfry i @._+- LUB być adresem email. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Wpisz poprawnie hasło w OBA pola. deleteCurrentUserMessage=Nie można usunąć zalogowanego użytkownika deleteUsernameExistsMessage=Nie można usunąć zalogowanego użytkownika downgradeCurrentUserMessage=Nie można obniżyć roli bieżącego użytkownika +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nie można obniżyć roli bieżącego użytkownika. W związku z tym bieżący użytkownik nie zostanie wyświetlony. userAlreadyExistsOAuthMessage=Takie konto użytkownika istnieje - stworzone za pomocą OAuth2. userAlreadyExistsWebMessage=Takie konto użytkownika istnieje - stworzone za pomocą przeglądarki. @@ -177,6 +179,7 @@ adminUserSettings.user=Użytkownik adminUserSettings.addUser=Dodaj nowego użytkownika adminUserSettings.deleteUser=Usuń użytkownika adminUserSettings.confirmDeleteUser=Czy na pewno usunąć użytkownika? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Niewłaściwa nazwa użytkownika - musi zawierać litery, cyfry i @._+- LUB być adresem email. adminUserSettings.roles=Role adminUserSettings.role=Rola @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Wymuś zmianę hasło po zalogowaniu adminUserSettings.submit=Zapisz użytkownika adminUserSettings.changeUserRole=Zmień rolę użytkownika adminUserSettings.authenticated=Zalogowany +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Import/Eksport bazy danych @@ -481,12 +491,14 @@ login.locked=Konto jest zablokowane login.signinTitle=Zaloguj się login.ssoSignIn=Zaloguj się za pomocą logowania jednokrotnego login.oauth2AutoCreateDisabled=Wyłączono automatyczne tworzenie użytkownika OAUTH2 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Błąd logowania OAuth2 login.oauth2InvalidUserInfoResponse=Niewłaściwe dane logowania login.oauth2invalidRequest=Nieprawidłowe żądanie login.oauth2AccessDenied=Brak dostępu login.oauth2InvalidTokenResponse=Nieprawidłowa odpowiedź na token login.oauth2InvalidIdToken=Nieprawidłowa wartość tokenu +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index 362d5233..cda5cc43 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Usuário não encontrado. incorrectPasswordMessage=A senha atual está incorreta. usernameExistsMessage=Novo Usuário já existe. invalidUsernameMessage=Usuário inválido, nome de usuário só pode incluir letras, números e os seguintes caracteres especiais @._+- ou deve ser um email válido. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Nova Senha e Confirmar Nova Senha devem ser iguais. deleteCurrentUserMessage=Não é possível apagar o usuário da sessão atual. deleteUsernameExistsMessage=O usuário não existe e não pode ser apagado. downgradeCurrentUserMessage=Não é possível fazer downgrade da função do usuário atual +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Não é possível fazer downgrade da função do usuário atual. Portanto, o usuário atual não será mostrado. userAlreadyExistsOAuthMessage=O usuário já existe como um usuário OAuth2. userAlreadyExistsWebMessage=O usuário já existe como um usuário web. @@ -190,6 +192,13 @@ adminUserSettings.forceChange=Forçar usuário a trocar a senha ao iniciar sess adminUserSettings.submit=Salvar usuário adminUserSettings.changeUserRole=Alterar Função de Usuário adminUserSettings.authenticated=Autenticado +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Importar/Exportar banco de dados @@ -208,6 +217,7 @@ database.fileNotFound=Arquivo não encontrado database.fileNullOrEmpty=O arquivo não estar nulo ou vazio database.failedImportFile=Falha ao importar arquivo + ############# # HOME-PAGE # ############# @@ -481,12 +491,15 @@ login.locked=Sua conta foi bloqueada. login.signinTitle=Por favor, inicie a sessão login.ssoSignIn=Iniciar sessão através de início de sessão único login.oauth2AutoCreateDisabled=Auto-Criar Usuário OAUTH2 Desativado +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Solicitação de autorização não encontrada login.oauth2InvalidUserInfoResponse=Resposta de informação de usuário inválida login.oauth2invalidRequest=Requisição inválida login.oauth2AccessDenied=Acesso negado login.oauth2InvalidTokenResponse=Resposta de token inválida login.oauth2InvalidIdToken=Id de token inválido +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. + #auto-redact diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 512ba300..82d2721c 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Utilizador inexistente. incorrectPasswordMessage=Senha incorreta. usernameExistsMessage=Esse utilizador já existe. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Não é possível fazer downgrade da função do utilizador atual +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Não é possível fazer downgrade da função do utilizador atual. Portanto, o utilizador atual não será mostrado. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Alterar usuário adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=A sua conta foi bloqueada. login.signinTitle=Introduza os seus dados de acesso login.ssoSignIn=Iniciar sessão através de início de sessão único login.oauth2AutoCreateDisabled=OAUTH2 Criação Automática de Utilizador Desativada +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 421efcfd..83d43c1d 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Rolul utilizatorului curent nu poate fi retrogradat +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Rolul utilizatorului curent nu poate fi retrogradat. Prin urmare, utilizatorul curent nu va fi afișat. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Schimbați rolul utilizatorului adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Conectare prin conectare unică login.oauth2AutoCreateDisabled=OAUTH2 Creare automată utilizator dezactivată +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 2f42ced2..4ffd0751 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Пользователь не найден. incorrectPasswordMessage=Текущий пароль неверен. usernameExistsMessage=Новое имя пользователя уже существует. invalidUsernameMessage=Неверное имя пользователя. Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Невозможно удалить пользователя, вошедшего в систему. deleteUsernameExistsMessage=Имя пользователя не существует и не может быть удалено. downgradeCurrentUserMessage=Невозможно понизить роль текущего пользователя +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Невозможно понизить роль текущего пользователя. Следовательно, текущий пользователь не будет отображаться. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Пользователь adminUserSettings.addUser=Добавить нового пользователя adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты. adminUserSettings.roles=Роли adminUserSettings.role=Роль @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Просить пользователя измен adminUserSettings.submit=Сохранить пользователя adminUserSettings.changeUserRole=Изменить роль пользователя adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Ваша учетная запись заблокирована. login.signinTitle=Пожалуйста, войдите login.ssoSignIn=Вход через единый вход login.oauth2AutoCreateDisabled=OAUTH2 Автоматическое создание пользователя отключено +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 43ce8c67..80ed3079 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Používateľ nebol nájdený. incorrectPasswordMessage=Aktuálne heslo je nesprávne. usernameExistsMessage=Nové používateľské meno už existuje. invalidUsernameMessage=Neplatné používateľské meno, používateľské meno musí obsahovať len abecedné znaky a čísla. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Nie je možné zmazať aktuálne prihláseného používateľa. deleteUsernameExistsMessage=Používateľské meno neexistuje a nemôže byť zmazané. downgradeCurrentUserMessage=Nie je možné znížiť rolu aktuálneho používateľa +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nie je možné znížiť rolu aktuálneho používateľa. Preto, aktuálny používateľ nebude zobrazený. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Používateľ adminUserSettings.addUser=Pridať nového používateľa adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Používateľské meno musí obsahovať iba písmená a čísla, žiadne medzery alebo špeciálne znaky. adminUserSettings.roles=Role adminUserSettings.role=Rola @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Donútiť používateľa zmeniť heslo pri prihlá adminUserSettings.submit=Uložiť používateľa adminUserSettings.changeUserRole=Zmeniť rolu používateľa adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Váš účet bol uzamknutý. login.signinTitle=Prosím, prihláste sa login.ssoSignIn=Prihlásiť sa cez Single Sign-on login.oauth2AutoCreateDisabled=Vytváranie používateľa cez OAUTH2 je zakázané +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 6147c20b..0bb09c90 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Korisnik nije pronađen. incorrectPasswordMessage=Trenutna šifra je netačna. usernameExistsMessage=Novi korisnik već postoji invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Nije moguće degradirati ulogu trenutnog korisnika +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nije moguće unazaditi ulogu trenutnog korisnika. Dakle, trenutni korisnik neće biti prikazan. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Korisnik adminUserSettings.addUser=Dodaj novog korisnika adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Uloge adminUserSettings.role=Uloga @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Prisili korisnika da promeni korisničko ime/lozin adminUserSettings.submit=Sačuvaj korisnika adminUserSettings.changeUserRole=Promenite ulogu korisnika adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Vaš nalog je zaključan. login.signinTitle=Molimo vas da se prijavite login.ssoSignIn=Prijavite se putem jedinstvene prijave login.oauth2AutoCreateDisabled=OAUTH2 automatsko kreiranje korisnika je onemogućeno +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 3fe4c0e9..a4a24f72 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Kan inte nedgradera nuvarande användares roll +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Kan inte nedgradera nuvarande användares roll. Därför kommer den aktuella användaren inte att visas. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Ändra användarens roll adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Logga in via enkel inloggning login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User inaktiverad +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index c38234e1..33cbd7ff 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -55,10 +55,12 @@ userNotFoundMessage=ไม่พบผู้ใช้ incorrectPasswordMessage=รหัสผ่านปัจจุบันไม่ถูกต้อง usernameExistsMessage=ชื่อผู้ใช้ใหม่มีอยู่แล้ว invalidUsernameMessage=ชื่อผู้ใช้ไม่ถูกต้อง ชื่อผู้ใช้สามารถประกอบด้วยตัวอักษร ตัวเลข และอักขระพิเศษต่อไปนี้ @._+- หรือจะต้องเป็นที่อยู่อีเมลที่ถูกต้อง +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=รหัสผ่านใหม่และยืนยันรหัสผ่านใหม่ต้องตรงกัน deleteCurrentUserMessage=ไม่สามารถลบผู้ใช้ที่เข้าสู่ระบบในปัจจุบันได้ deleteUsernameExistsMessage=ชื่อผู้ใช้ไม่ปรากฏและไม่สามารถลบได้ downgradeCurrentUserMessage=ไม่สามารถลดระดับบทบาทของผู้ใช้ปัจจุบันได้ +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=ไม่สามารถลดระดับบทบาทของผู้ใช้ปัจจุบันได้ ดังนั้นผู้ใช้ปัจจุบันจะไม่ปรากฏ userAlreadyExistsOAuthMessage=ผู้ใช้มีอยู่แล้วในฐานะผู้ใช้ OAuth2 userAlreadyExistsWebMessage=ผู้ใช้มีอยู่แล้วในฐานะผู้ใช้เว็บ @@ -177,6 +179,7 @@ adminUserSettings.user=ผู้ใช้ adminUserSettings.addUser=เพิ่มผู้ใช้ใหม่ adminUserSettings.deleteUser=ลบผู้ใช้ adminUserSettings.confirmDeleteUser=ควรลบผู้ใช้นี้หรือไม่? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=ชื่อผู้ใช้สามารถประกอบด้วยตัวอักษร ตัวเลข และอักขระพิเศษต่อไปนี้ @._+- หรือจะต้องเป็นที่อยู่อีเมลที่ถูกต้อง adminUserSettings.roles=บทบาท adminUserSettings.role=บทบาท @@ -190,6 +193,13 @@ adminUserSettings.forceChange=บังคับให้ผู้ใช้เ adminUserSettings.submit=บันทึกผู้ใช้ adminUserSettings.changeUserRole=เปลี่ยนบทบาทของผู้ใช้ adminUserSettings.authenticated=ได้รับการยืนยันแล้ว +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=การนำเข้า/ส่งออกฐานข้อมูล @@ -481,12 +491,14 @@ login.locked=บัญชีของคุณถูกล็อค login.signinTitle=กรุณาลงชื่อเข้าใช้ login.ssoSignIn=เข้าสู่ระบบด้วย Single Sign-on login.oauth2AutoCreateDisabled=การสร้างผู้ใช้ OAuth2 อัตโนมัติถูกปิดใช้งาน +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=ไม่พบคำขอการอนุญาต login.oauth2InvalidUserInfoResponse=การตอบกลับข้อมูลผู้ใช้ไม่ถูกต้อง login.oauth2invalidRequest=คำขอไม่ถูกต้อง login.oauth2AccessDenied=การเข้าถึงถูกปฏิเสธ login.oauth2InvalidTokenResponse=การตอบกลับโทเค็นไม่ถูกต้อง login.oauth2InvalidIdToken=โทเค็น Id ไม่ถูกต้อง +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 6a03d547..b87f611f 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Kullanıcı bulunamadı. incorrectPasswordMessage=Mevcut şifre yanlış. usernameExistsMessage=Yeni Kullanıcı Adı zaten var. invalidUsernameMessage=Geçersiz kullanıcı adı, kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Yeni Şifre ve Yeni Şifreyi Onayla eşleşmelidir. deleteCurrentUserMessage=Şu anda oturum açmış olan kullanıcı silinemiyor. deleteUsernameExistsMessage=Kullanıcı adı mevcut değil ve silinemez. downgradeCurrentUserMessage=Mevcut kullanıcının rolü düşürülemiyor +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Mevcut kullanıcının rolü düşürülemiyor. Bu nedenle, mevcut kullanıcı gösterilmeyecektir. userAlreadyExistsOAuthMessage=Kullanıcı zaten bir OAuth2 kullanıcısı olarak mevcut. userAlreadyExistsWebMessage=Kullanıcı zaten bir web kullanıcısı olarak mevcut. @@ -177,6 +179,7 @@ adminUserSettings.user=Kullanıcı adminUserSettings.addUser=Yeni Kullanıcı Ekle adminUserSettings.deleteUser=Kullanıcı Sil adminUserSettings.confirmDeleteUser=Kullanıcı silinsin mi? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır. adminUserSettings.roles=Roller adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Kullanıcının girişte kullanıcı adı/şifre d adminUserSettings.submit=Kullanıcıyı Kaydet adminUserSettings.changeUserRole=Kullanıcı rolünü değiştir adminUserSettings.authenticated=Onaylandı +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Veri Tabanını İçe/Dışa Aktar @@ -481,12 +491,14 @@ login.locked=Hesabınız kilitlendi. login.signinTitle=Lütfen giriş yapınız. login.ssoSignIn=Tek Oturum Açma ile Giriş Yap login.oauth2AutoCreateDisabled=OAUTH2 Otomatik Oluşturma Kullanıcı Devre Dışı Bırakıldı +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Yetkilendirme isteği bulunamadı login.oauth2InvalidUserInfoResponse=Geçersiz Kullanıcı Bilgisi Yanıtı login.oauth2invalidRequest=Geçersiz İstek login.oauth2AccessDenied=Erişim Reddedildi login.oauth2InvalidTokenResponse=Geçersiz Belirteç Yanıtı login.oauth2InvalidIdToken=Geçersiz Kimlik Belirteci +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 6e601195..a9df1da4 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Користувача не знайдено. incorrectPasswordMessage=Поточний пароль невірний. usernameExistsMessage=Нове ім'я користувача вже існує. invalidUsernameMessage=Недійсне ім’я користувача, ім’я користувача може містити лише літери, цифри та наступні спеціальні символи @._+- або має бути дійсною електронною адресою. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Неможливо видалити користувача, який увійшов в систему. deleteUsernameExistsMessage=Ім'я користувача не існує і не може бути видалено. downgradeCurrentUserMessage=Неможливо понизити роль поточного користувача +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Неможливо понизити роль поточного користувача. Отже, поточний користувач не відображатиметься. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Користувач adminUserSettings.addUser=Додати нового користувача adminUserSettings.deleteUser=Видалити користувача adminUserSettings.confirmDeleteUser=Видалити цього користувача? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Ім’я користувача може містити лише літери, цифри та наступні спеціальні символи @._+- або має бути дійсною електронною адресою. adminUserSettings.roles=Ролі adminUserSettings.role=Роль @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Примусити користувача змін adminUserSettings.submit=Зберегти користувача adminUserSettings.changeUserRole=Змінити роль користувача adminUserSettings.authenticated=Автентифіковано +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Ваш обліковий запис заблоковано. login.signinTitle=Будь ласка, увійдіть login.ssoSignIn=Увійти через єдиний вхід login.oauth2AutoCreateDisabled=Автоматичне створення користувача OAUTH2 ВИМКНЕНО +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Запит на авторизація не знайдено login.oauth2InvalidUserInfoResponse=Недійсна відповідь з інформацією користувача login.oauth2invalidRequest=Недійсний запит login.oauth2AccessDenied=Доступ заблоковано login.oauth2InvalidTokenResponse=Недійсна відповідь з токеном login.oauth2InvalidIdToken=Недійсний Id токен +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index b6234488..b8f1eb09 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr=left to right, rtl = right to left) +# the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr pdfPrompt=Chọn (các) tệp PDF @@ -55,10 +55,12 @@ userNotFoundMessage=Không tìm thấy người dùng. incorrectPasswordMessage=Mật khẩu hiện tại không chính xác. usernameExistsMessage=Tên người dùng mới đã tồn tại. invalidUsernameMessage=Tên người dùng không hợp lệ, tên người dùng chỉ có thể chứa chữ cái, số và các ký tự đặc biệt sau @._+- hoặc phải là một địa chỉ email hợp lệ. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Mật khẩu mới và Xác nhận mật khẩu mới phải khớp nhau. deleteCurrentUserMessage=Không thể xóa người dùng đang đăng nhập. deleteUsernameExistsMessage=Tên người dùng không tồn tại và không thể bị xóa. downgradeCurrentUserMessage=Không thể hạ cấp vai trò của người dùng hiện tại +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Không thể hạ cấp vai trò của người dùng hiện tại. Do đó, người dùng hiện tại sẽ không được hiển thị. userAlreadyExistsOAuthMessage=Người dùng đã tồn tại dưới dạng người dùng OAuth2. userAlreadyExistsWebMessage=Người dùng đã tồn tại dưới dạng người dùng web. @@ -177,6 +179,7 @@ adminUserSettings.user=Người dùng adminUserSettings.addUser=Thêm người dùng mới adminUserSettings.deleteUser=Xóa người dùng adminUserSettings.confirmDeleteUser=Bạn có muốn xóa người dùng không? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Tên người dùng chỉ có thể chứa chữ cái, số và các ký tự đặc biệt sau @._+- hoặc phải là một địa chỉ email hợp lệ. adminUserSettings.roles=Vai trò adminUserSettings.role=Vai trò @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Buộc người dùng thay đổi mật khẩu khi adminUserSettings.submit=Lưu người dùng adminUserSettings.changeUserRole=Thay đổi vai trò của người dùng adminUserSettings.authenticated=Đã xác thực +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Nhập/Xuất cơ sở dữ liệu @@ -481,12 +491,14 @@ login.locked=Tài khoản của bạn đã bị khóa. login.signinTitle=Vui lòng đăng nhập login.ssoSignIn=Đăng nhập qua Single Sign-on login.oauth2AutoCreateDisabled=Tự động tạo người dùng OAUTH2 bị vô hiệu hóa +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Không tìm thấy yêu cầu ủy quyền login.oauth2InvalidUserInfoResponse=Phản hồi thông tin người dùng không hợp lệ login.oauth2invalidRequest=Yêu cầu không hợp lệ login.oauth2AccessDenied=Truy cập bị từ chối login.oauth2InvalidTokenResponse=Phản hồi token không hợp lệ login.oauth2InvalidIdToken=Id Token không hợp lệ +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 690c8e05..918576ff 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -55,10 +55,12 @@ userNotFoundMessage=未找到用户。 incorrectPasswordMessage=当前密码不正确。 usernameExistsMessage=新用户名已存在。 invalidUsernameMessage=用户名无效,用户名只能包含字母、数字和以下特殊字符@._+- 或必须是有效的电子邮件地址。 +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=两次密码不一致。 deleteCurrentUserMessage=无法删除当前登录的用户。 deleteUsernameExistsMessage=用户名不存在,无法删除。 downgradeCurrentUserMessage=无法降级当前用户的角色 +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=无法降级当前用户的角色。因此,当前用户将不会显示。 userAlreadyExistsOAuthMessage=该用户已作为OAuth2用户存在。 userAlreadyExistsWebMessage=该用户已作为Web用户存在。 @@ -177,6 +179,7 @@ adminUserSettings.user=用户 adminUserSettings.addUser=添加新用户 adminUserSettings.deleteUser=删除用户 adminUserSettings.confirmDeleteUser=确认删除该用户? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=用户名只能包含字母、数字和以下特殊字符@._+-,或者必须是有效的电子邮件地址。 adminUserSettings.roles=角色 adminUserSettings.role=角色 @@ -190,6 +193,13 @@ adminUserSettings.forceChange=强制用户在登录时更改用户名/密码 adminUserSettings.submit=保存用户 adminUserSettings.changeUserRole=更改用户角色 adminUserSettings.authenticated=已验证 +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=数据库 导入/导出 @@ -481,12 +491,14 @@ login.locked=您的账户已被锁定。 login.signinTitle=请登录 login.ssoSignIn=通过单点登录登录 login.oauth2AutoCreateDisabled=OAuth2自动创建用户已禁用 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=找不到验证请求 login.oauth2InvalidUserInfoResponse=无效的用户信息响应 login.oauth2invalidRequest=无效请求 login.oauth2AccessDenied=拒绝访问 login.oauth2InvalidTokenResponse=无效的Token响应 login.oauth2InvalidIdToken=无效的Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index b2e9acea..9d158144 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -55,10 +55,12 @@ userNotFoundMessage=找不到使用者。 incorrectPasswordMessage=目前密碼不正確。 usernameExistsMessage=新使用者名稱已存在。 invalidUsernameMessage=使用者名稱無效,使用者名稱只能包含字母、數字和以下特殊字元 @._+- 或必須是有效的電子郵件地址。 +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=輸入的密碼必需和確認密碼相同。 deleteCurrentUserMessage=無法刪除目前登錄的使用者。 deleteUsernameExistsMessage=使用者名不存在,無法刪除。 downgradeCurrentUserMessage=無法降級目前使用者的角色 +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=無法降級目前使用者的角色。因此,不會顯示目前的使用者。 userAlreadyExistsOAuthMessage=該使用者已於 OAuth2 註冊。 userAlreadyExistsWebMessage=該使用者已於網頁註冊。 @@ -177,6 +179,7 @@ adminUserSettings.user=使用者 adminUserSettings.addUser=新增使用者 adminUserSettings.deleteUser=刪除使用者 adminUserSettings.confirmDeleteUser=確認刪除該使用者? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=使用者名稱只能包含字母、數字和以下特殊字元 @._+-,或必須是有效的電子郵件地址。 adminUserSettings.roles=角色 adminUserSettings.role=角色 @@ -190,6 +193,13 @@ adminUserSettings.forceChange=強制使用者在登入時修改使用者名稱/ adminUserSettings.submit=儲存 adminUserSettings.changeUserRole=更改使用者身份 adminUserSettings.authenticated=已驗證 +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=資料庫匯入/匯出 @@ -481,12 +491,14 @@ login.locked=你的帳戶已被鎖定。 login.signinTitle=請登入 login.ssoSignIn=透過織網單一簽入 login.oauth2AutoCreateDisabled=OAuth 2.0 自動建立使用者已停用 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=找不到驗證請求 login.oauth2InvalidUserInfoResponse=無效的使用者資訊回應 login.oauth2invalidRequest=無效的回應 login.oauth2AccessDenied=存取被拒 login.oauth2InvalidTokenResponse=無效的 Token 回應 login.oauth2InvalidIdToken=無效的 Tokne +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 5c516c1c..d139e712 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -43,6 +43,7 @@ security: clientId: '' # Client ID from your provider clientSecret: '' # Client Secret from your provider autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users + blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin useAsUsername: email # Default is 'email'; custom fields can be used as the username scopes: openid, profile, email # Specify the scopes for which the application will request permissions provider: google # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' diff --git a/src/main/resources/templates/addUsers.html b/src/main/resources/templates/addUsers.html index 025f758f..a91f0e46 100644 --- a/src/main/resources/templates/addUsers.html +++ b/src/main/resources/templates/addUsers.html @@ -2,6 +2,19 @@ + @@ -20,49 +33,82 @@
- + person_add Add New User - + edit Change User's Role +
+ Total Users: + Active Users: + Disabled Users: +
+
+
+
+ Default message if not found +
+
+
+
+ Default message if not found +
- Message + Default message if not found
- - - - - + + + + + + + - + - + + +
UIDUsernameRolesActionsAuthenticated#UsernameRolesAuthenticatedLast RequestActions
-
- -
- edit -
+
+ +
+ edit +
+
+ + + +
+
@@ -77,16 +123,11 @@ -
+
- +

-
+
diff --git a/src/main/resources/templates/security/cert-sign.html b/src/main/resources/templates/security/cert-sign.html index ee9c76ad..173cd06d 100644 --- a/src/main/resources/templates/security/cert-sign.html +++ b/src/main/resources/templates/security/cert-sign.html @@ -74,7 +74,7 @@
-
+
diff --git a/src/main/resources/templates/security/change-permissions.html b/src/main/resources/templates/security/change-permissions.html index 1a4bfbfb..1a8b5bfd 100644 --- a/src/main/resources/templates/security/change-permissions.html +++ b/src/main/resources/templates/security/change-permissions.html @@ -58,7 +58,7 @@

-
+
diff --git a/src/main/resources/templates/security/remove-cert-sign.html b/src/main/resources/templates/security/remove-cert-sign.html index 0fe1594e..216044eb 100644 --- a/src/main/resources/templates/security/remove-cert-sign.html +++ b/src/main/resources/templates/security/remove-cert-sign.html @@ -21,7 +21,7 @@
-
+
diff --git a/src/main/resources/templates/security/remove-password.html b/src/main/resources/templates/security/remove-password.html index b3345137..61558653 100644 --- a/src/main/resources/templates/security/remove-password.html +++ b/src/main/resources/templates/security/remove-password.html @@ -26,7 +26,7 @@

-
+
diff --git a/src/main/resources/templates/security/sanitize-pdf.html b/src/main/resources/templates/security/sanitize-pdf.html index ca622683..6325d8b4 100644 --- a/src/main/resources/templates/security/sanitize-pdf.html +++ b/src/main/resources/templates/security/sanitize-pdf.html @@ -41,7 +41,7 @@

-
+
-- 2.46.1 From 9661e940923d81ab4078a600ec1089ee36cf215c Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 14 Sep 2024 23:20:29 +0100 Subject: [PATCH 228/231] Css changes (#1899) * #1841 Signed-off-by: a
* #1841 for watermark Signed-off-by: a * #1869 and ensure naming Signed-off-by: a --------- Signed-off-by: a Co-authored-by: a --- .../resources/templates/misc/adjust-contrast.html | 12 ++++++++++-- src/main/resources/templates/misc/stamp.html | 7 +++++++ .../resources/templates/security/add-watermark.html | 6 ++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/resources/templates/misc/adjust-contrast.html b/src/main/resources/templates/misc/adjust-contrast.html index f54ac108..d10ea8e6 100644 --- a/src/main/resources/templates/misc/adjust-contrast.html +++ b/src/main/resources/templates/misc/adjust-contrast.html @@ -21,7 +21,9 @@
+
+
+
+
+ diff --git a/src/main/resources/templates/fragments/footer.html b/src/main/resources/templates/fragments/footer.html index 40f64419..7aab85dc 100644 --- a/src/main/resources/templates/fragments/footer.html +++ b/src/main/resources/templates/fragments/footer.html @@ -1,22 +1,13 @@ -
\ No newline at end of file + -- 2.46.1