From 0545c3f9978b92baa7c3e71176130776fb664b84 Mon Sep 17 00:00:00 2001 From: ConnorYoh <40631091+ConnorYoh@users.noreply.github.com> Date: Thu, 12 Mar 2026 20:23:13 +0000 Subject: [PATCH] Cleanup-conversion-translations (#5906) Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- .../common/util/EmlProcessingUtils.java | 3 +- .../web/ReactRoutingController.java | 6 ++-- .../service/PdfJsonFallbackFontService.java | 7 ++-- .../software/SPDF/model/ApiEndpointTest.java | 3 +- .../service/LanguageServiceBasicTest.java | 4 ++- .../SPDF/service/LanguageServiceTest.java | 12 ++++--- .../security/service/EmailService.java | 9 ++--- build.gradle | 2 +- .../public/locales/en-GB/translation.toml | 33 +++++-------------- frontend/src-tauri/tauri.conf.json | 2 +- .../src/core/constants/convertConstants.ts | 25 ++++++++++++++ .../testing/serverExperienceSimulations.ts | 2 +- .../shared/SelfHostedOfflineBanner.tsx | 15 +++------ .../testing/serverExperienceSimulations.ts | 2 +- 14 files changed, 68 insertions(+), 57 deletions(-) diff --git a/app/common/src/main/java/stirling/software/common/util/EmlProcessingUtils.java b/app/common/src/main/java/stirling/software/common/util/EmlProcessingUtils.java index 25af604c8c..0bb76f9921 100644 --- a/app/common/src/main/java/stirling/software/common/util/EmlProcessingUtils.java +++ b/app/common/src/main/java/stirling/software/common/util/EmlProcessingUtils.java @@ -341,7 +341,8 @@ public class EmlProcessingUtils { } private String getFallbackStyles() { - return """ + return + """ /* Minimal fallback - main CSS resource failed to load */ body { font-family: var(--font-family, Helvetica, sans-serif); diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/web/ReactRoutingController.java b/app/core/src/main/java/stirling/software/SPDF/controller/web/ReactRoutingController.java index e903ed8e59..8f8dcb0b8e 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/web/ReactRoutingController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/web/ReactRoutingController.java @@ -178,7 +178,8 @@ public class ReactRoutingController { String escapedBaseUrlJs = JavaScriptUtils.javaScriptEscape(baseUrl); String serverUrl = "(window.location.origin + '" + escapedBaseUrlJs + "')"; - return """ + return + """ @@ -237,7 +238,8 @@ public class ReactRoutingController { String escapedBaseUrlJs = JavaScriptUtils.javaScriptEscape(baseUrl); String serverUrl = "(window.location.origin + '" + escapedBaseUrlJs + "')"; - return """ + return + """ diff --git a/app/core/src/main/java/stirling/software/SPDF/service/PdfJsonFallbackFontService.java b/app/core/src/main/java/stirling/software/SPDF/service/PdfJsonFallbackFontService.java index be51dd74eb..4f2a46f0c1 100644 --- a/app/core/src/main/java/stirling/software/SPDF/service/PdfJsonFallbackFontService.java +++ b/app/core/src/main/java/stirling/software/SPDF/service/PdfJsonFallbackFontService.java @@ -581,9 +581,10 @@ public class PdfJsonFallbackFontService { Character.UnicodeScript script = Character.UnicodeScript.of(codePoint); return switch (script) { - // HAN script is used by both Simplified and Traditional Chinese - // Default to Simplified (mainland China, 1.4B speakers) as it's more common - // Traditional Chinese PDFs are detected via font name aliases (MingLiU, PMingLiU, etc.) + // HAN script is used by both Simplified and Traditional Chinese + // Default to Simplified (mainland China, 1.4B speakers) as it's more common + // Traditional Chinese PDFs are detected via font name aliases (MingLiU, PMingLiU, + // etc.) case HAN -> FALLBACK_FONT_CJK_ID; case HIRAGANA, KATAKANA -> FALLBACK_FONT_JP_ID; case HANGUL -> FALLBACK_FONT_KR_ID; diff --git a/app/core/src/test/java/stirling/software/SPDF/model/ApiEndpointTest.java b/app/core/src/test/java/stirling/software/SPDF/model/ApiEndpointTest.java index a9293f1161..bba0720b9f 100644 --- a/app/core/src/test/java/stirling/software/SPDF/model/ApiEndpointTest.java +++ b/app/core/src/test/java/stirling/software/SPDF/model/ApiEndpointTest.java @@ -21,8 +21,7 @@ class ApiEndpointTest { return postNodeWithParams(description, true, names); } - private JsonNode postNodeWithParams( - String description, boolean required, String... names) { + private JsonNode postNodeWithParams(String description, boolean required, String... names) { ObjectNode post = mapper.createObjectNode(); post.put("description", description); ArrayNode params = mapper.createArrayNode(); diff --git a/app/core/src/test/java/stirling/software/SPDF/service/LanguageServiceBasicTest.java b/app/core/src/test/java/stirling/software/SPDF/service/LanguageServiceBasicTest.java index 79b23f8076..ddce2b3422 100644 --- a/app/core/src/test/java/stirling/software/SPDF/service/LanguageServiceBasicTest.java +++ b/app/core/src/test/java/stirling/software/SPDF/service/LanguageServiceBasicTest.java @@ -103,7 +103,9 @@ class LanguageServiceBasicTest { // Verify filtering by restrictions assertTrue(supportedLanguages.contains("en_US"), "Allowed language should be included"); assertTrue(supportedLanguages.contains("fr_FR"), "Allowed language should be included"); - assertFalse(supportedLanguages.contains("en_GB"), "en_GB should NOT be included when not in whitelist"); + assertFalse( + supportedLanguages.contains("en_GB"), + "en_GB should NOT be included when not in whitelist"); assertFalse(supportedLanguages.contains("de_DE"), "Restricted language should be excluded"); } diff --git a/app/core/src/test/java/stirling/software/SPDF/service/LanguageServiceTest.java b/app/core/src/test/java/stirling/software/SPDF/service/LanguageServiceTest.java index 734f7589e6..a0d235e70d 100644 --- a/app/core/src/test/java/stirling/software/SPDF/service/LanguageServiceTest.java +++ b/app/core/src/test/java/stirling/software/SPDF/service/LanguageServiceTest.java @@ -84,11 +84,13 @@ class LanguageServiceTest { // Verify assertEquals( - allowedLanguages, - supportedLanguages, - "Should return only whitelisted languages"); - assertFalse(supportedLanguages.contains("en_GB"), "en_GB should NOT be included when not in whitelist"); - assertFalse(supportedLanguages.contains("de_DE"), "de_DE should NOT be included when not in whitelist"); + allowedLanguages, supportedLanguages, "Should return only whitelisted languages"); + assertFalse( + supportedLanguages.contains("en_GB"), + "en_GB should NOT be included when not in whitelist"); + assertFalse( + supportedLanguages.contains("de_DE"), + "de_DE should NOT be included when not in whitelist"); } @Test diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/security/service/EmailService.java b/app/proprietary/src/main/java/stirling/software/proprietary/security/service/EmailService.java index 5c1cf75450..0d35e8bf34 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/security/service/EmailService.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/security/service/EmailService.java @@ -161,7 +161,7 @@ public class EmailService { String subject = "Welcome to Stirling PDF"; String body = - """ + """
@@ -220,7 +220,7 @@ public class EmailService { String subject = "You've been invited to Stirling PDF"; String body = - """ + """
@@ -269,7 +269,8 @@ public class EmailService { String passwordSection = newPassword == null ? "" - : """ + : + """

Temporary Password: %s

@@ -277,7 +278,7 @@ public class EmailService { .formatted(newPassword); String body = - """ + """
diff --git a/build.gradle b/build.gradle index 9afe38dd13..1b48160810 100644 --- a/build.gradle +++ b/build.gradle @@ -78,7 +78,7 @@ springBoot { allprojects { group = 'stirling.software' - version = '2.7.0' + version = '2.7.1' configurations.configureEach { exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat" diff --git a/frontend/public/locales/en-GB/translation.toml b/frontend/public/locales/en-GB/translation.toml index c403d835d7..7de7327dec 100644 --- a/frontend/public/locales/en-GB/translation.toml +++ b/frontend/public/locales/en-GB/translation.toml @@ -2759,6 +2759,15 @@ webOptions = "Web to PDF Options" wordDoc = "Word Document" wordDocExt = "Word Document (.docx)" zoomLevel = "Zoom Level" +cbrToPdf = "CBR → PDF" +cbzToPdf = "CBZ → PDF" +ebookToPdf = "eBook → PDF" +emlToPdf = "Email → PDF" +fileToPdf = "Office/Document → PDF" +pdfToCbr = "PDF → CBR" +pdfToCbz = "PDF → CBZ" +pdfToEpub = "PDF → EPUB" +svgToPdf = "SVG → PDF" [convert.ebookOptions] ebookOptions = "eBook to PDF Options" @@ -5822,30 +5831,6 @@ showTools = "View unavailable tools ▾" title = "Your Stirling-PDF server is unreachable" toolNotAvailableLocally = "Your Stirling-PDF server is offline and \"{{endpoint}}\" is not available on the local backend." -[selfHosted.offline.conversionTypes] -cbr-to-pdf = "CBR → PDF" -cbz-to-pdf = "CBZ → PDF" -eml-to-pdf = "Email → PDF" -ebook-to-pdf = "eBook → PDF" -file-to-pdf = "Office/Document → PDF" -html-to-pdf = "HTML → PDF" -img-to-pdf = "Image → PDF" -markdown-to-pdf = "Markdown → PDF" -pdf-to-cbr = "PDF → CBR" -pdf-to-cbz = "PDF → CBZ" -pdf-to-csv = "PDF → CSV" -pdf-to-epub = "PDF → EPUB" -pdf-to-html = "PDF → HTML" -pdf-to-img = "PDF → Image" -pdf-to-markdown = "PDF → Markdown" -pdf-to-pdfa = "PDF → PDF/A" -pdf-to-presentation = "PDF → Presentation" -pdf-to-text = "PDF → Text" -pdf-to-word = "PDF → Word" -pdf-to-xml = "PDF → XML" -pdf-to-xlsx = "PDF → XLSX" -svg-to-pdf = "SVG → PDF" - [session] expired = "Your session has expired. Please refresh the page and try again." refreshPage = "Refresh Page" diff --git a/frontend/src-tauri/tauri.conf.json b/frontend/src-tauri/tauri.conf.json index 304b876af4..1578a571d0 100644 --- a/frontend/src-tauri/tauri.conf.json +++ b/frontend/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "productName": "Stirling-PDF", - "version": "2.6.0", + "version": "2.7.1", "identifier": "stirling.pdf.dev", "build": { "frontendDist": "../dist", diff --git a/frontend/src/core/constants/convertConstants.ts b/frontend/src/core/constants/convertConstants.ts index 2c351753b0..1016d5f6c0 100644 --- a/frontend/src/core/constants/convertConstants.ts +++ b/frontend/src/core/constants/convertConstants.ts @@ -71,6 +71,31 @@ export const ENDPOINT_NAMES = { 'text-editor-pdf': 'text-editor-to-pdf' } as const; +/** Maps conversion endpoint → [i18n key, English fallback] for display names */ +export const ENDPOINT_I18N: Record = { + 'img-to-pdf': ['imageToPDF.header', 'Image → PDF'], + 'html-to-pdf': ['HTMLToPDF.header', 'HTML → PDF'], + 'markdown-to-pdf': ['MarkdownToPDF.header', 'Markdown → PDF'], + 'pdf-to-img': ['pdfToImage.title', 'PDF → Image'], + 'pdf-to-word': ['PDFToWord.header', 'PDF → Word'], + 'pdf-to-presentation': ['PDFToPresentation.header', 'PDF → Presentation'], + 'pdf-to-text': ['PDFToText.header', 'PDF → Text'], + 'pdf-to-csv': ['PDFToCSV.header', 'PDF → CSV'], + 'pdf-to-xlsx': ['PDFToXLSX.header', 'PDF → Excel'], + 'pdf-to-markdown': ['PDFToMarkdown.header', 'PDF → Markdown'], + 'pdf-to-html': ['PDFToHTML.header', 'PDF → HTML'], + 'pdf-to-xml': ['PDFToXML.header', 'PDF → XML'], + 'pdf-to-pdfa': ['pdfToPDFA.header', 'PDF → PDF/A'], + 'file-to-pdf': ['convert.fileToPdf', 'Office/Document → PDF'], + 'cbr-to-pdf': ['convert.cbrToPdf', 'CBR → PDF'], + 'cbz-to-pdf': ['convert.cbzToPdf', 'CBZ → PDF'], + 'eml-to-pdf': ['convert.emlToPdf', 'Email → PDF'], + 'ebook-to-pdf': ['convert.ebookToPdf', 'eBook → PDF'], + 'svg-to-pdf': ['convert.svgToPdf', 'SVG → PDF'], + 'pdf-to-cbr': ['convert.pdfToCbr', 'PDF → CBR'], + 'pdf-to-cbz': ['convert.pdfToCbz', 'PDF → CBZ'], + 'pdf-to-epub': ['convert.pdfToEpub', 'PDF → EPUB'], +}; // Grouped file extensions for dropdowns export const FROM_FORMAT_OPTIONS = [ diff --git a/frontend/src/core/testing/serverExperienceSimulations.ts b/frontend/src/core/testing/serverExperienceSimulations.ts index 953c596d47..9c82016898 100644 --- a/frontend/src/core/testing/serverExperienceSimulations.ts +++ b/frontend/src/core/testing/serverExperienceSimulations.ts @@ -38,7 +38,7 @@ const FREE_LICENSE_INFO: LicenseInfo = { const BASE_NO_LOGIN_CONFIG: AppConfig = { enableAnalytics: true, - appVersion: '2.6.0', + appVersion: '2.7.1', serverCertificateEnabled: false, enableAlphaFunctionality: false, serverPort: 8080, diff --git a/frontend/src/desktop/components/shared/SelfHostedOfflineBanner.tsx b/frontend/src/desktop/components/shared/SelfHostedOfflineBanner.tsx index 9011ea77e8..0ab5d04ec0 100644 --- a/frontend/src/desktop/components/shared/SelfHostedOfflineBanner.tsx +++ b/frontend/src/desktop/components/shared/SelfHostedOfflineBanner.tsx @@ -8,7 +8,7 @@ import { selfHostedServerMonitor, type SelfHostedServerState } from '@app/servic import { connectionModeService, type ConnectionMode } from '@app/services/connectionModeService'; import { tauriBackendService } from '@app/services/tauriBackendService'; import { endpointAvailabilityService } from '@app/services/endpointAvailabilityService'; -import { EXTENSION_TO_ENDPOINT } from '@app/constants/convertConstants'; +import { EXTENSION_TO_ENDPOINT, ENDPOINT_I18N } from '@app/constants/convertConstants'; import { ENDPOINTS as SPLIT_ENDPOINTS } from '@app/constants/splitConstants'; import type { ToolId } from '@app/types/toolId'; @@ -28,14 +28,6 @@ const SPLIT_ENDPOINT_I18N: Record = { 'split-for-poster-print': ['split.methods.byPoster.name', 'Printable Chunks'], }; -/** Conversion endpoint keys that have translations under selfHosted.offline.conversionTypes */ -const KNOWN_CONVERSION_ENDPOINTS = new Set([ - 'file-to-pdf', 'pdf-to-img', 'img-to-pdf', 'svg-to-pdf', 'cbz-to-pdf', - 'pdf-to-cbz', 'pdf-to-word', 'pdf-to-presentation', 'pdf-to-text', 'pdf-to-csv', - 'pdf-to-xlsx', 'pdf-to-markdown', 'pdf-to-html', 'pdf-to-xml', 'pdf-to-pdfa', - 'html-to-pdf', 'markdown-to-pdf', 'eml-to-pdf', 'cbr-to-pdf', 'pdf-to-cbr', - 'ebook-to-pdf', 'pdf-to-epub', -]); /** @@ -136,8 +128,9 @@ export function SelfHostedOfflineBanner() { } const conversionNames = [...unavailableEndpoints] .map(ep => { - const suffix = KNOWN_CONVERSION_ENDPOINTS.has(ep) - ? t(`selfHosted.offline.conversionTypes.${ep}`, ep) + const i18n = ENDPOINT_I18N[ep]; + const suffix = i18n + ? (i18n[0] ? t(i18n[0], i18n[1]) : i18n[1]) : ep; return `${convertPrefix}: ${suffix}`; }) diff --git a/frontend/src/proprietary/testing/serverExperienceSimulations.ts b/frontend/src/proprietary/testing/serverExperienceSimulations.ts index c76235be0f..0750d1cba2 100644 --- a/frontend/src/proprietary/testing/serverExperienceSimulations.ts +++ b/frontend/src/proprietary/testing/serverExperienceSimulations.ts @@ -48,7 +48,7 @@ const FREE_LICENSE_INFO: LicenseInfo = { const BASE_NO_LOGIN_CONFIG: AppConfig = { enableAnalytics: true, - appVersion: '2.6.0', + appVersion: '2.7.1', serverCertificateEnabled: false, enableAlphaFunctionality: false, enableDesktopInstallSlide: true,