Skip to content

Commit 10de9d5

Browse files
committed
Merge branch 'development'
2 parents e4c8df1 + e3a3de8 commit 10de9d5

22 files changed

Lines changed: 2867 additions & 576 deletions

SafePDF/ctrl/safe_pdf_controller.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
class SafePDFController:
2424
"""Controller class that manages application state and logic"""
2525

26-
def __init__(self, progress_callback=None):
26+
def __init__(self, progress_callback=None, language_manager=None):
2727
# Application state
2828
self.selected_files = []
2929
self.selected_file = None
@@ -43,14 +43,17 @@ def __init__(self, progress_callback=None):
4343
# Module logger (needed for _load_pro_status)
4444
self.logger = get_logger('SafePDF.Controller')
4545

46+
# Language manager for localization
47+
self.language_manager = language_manager
48+
4649
# License manager for verification (must be initialized BEFORE _load_pro_status)
4750
self.license_manager = LicenseManager(logger=self.logger)
4851

4952
# Load saved pro status
5053
self._load_pro_status()
5154

5255
# PDF operations handler
53-
self.pdf_ops = PDFOperations(progress_callback=progress_callback)
56+
self.pdf_ops = PDFOperations(progress_callback=progress_callback, language_manager=language_manager)
5457

5558
# Updates handler for GitHub releases and signed keys
5659
self.updates = SafePDFUpdates()

SafePDF/ops/pdf_operations.py

Lines changed: 85 additions & 69 deletions
Large diffs are not rendered by default.

SafePDF/safe_pdf_app.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,19 @@ def __init__(self, root):
3838
# Keep a reference to icon image to avoid GC
3939
self._icon_image = None
4040

41-
# Initialize controller with progress callback
41+
# Initialize controller with progress callback (language_manager will be set later)
4242
self.controller = SafePDFController(progress_callback=self.update_progress)
4343

4444
# Initialize UI with controller reference
4545
self.ui = SafePDFUI(root, self.controller)
4646

47+
# Now that UI is created, update controller with language_manager from UI
48+
if hasattr(self.ui, 'lang_manager'):
49+
self.controller.language_manager = self.ui.lang_manager
50+
# Also update the pdf_ops with the language_manager
51+
if hasattr(self.controller, 'pdf_ops') and self.controller.pdf_ops:
52+
self.controller.pdf_ops.language_manager = self.ui.lang_manager
53+
4754
# Module logger
4855
self.logger = get_logger('SafePDF.App')
4956

SafePDF/text/de/ui.json

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,127 @@
114114
"selected_file": "✅ Ausgewählt: {filename}",
115115
"pdf_info_pages": "Seiten: {pages}",
116116
"pdf_info_size": "Größe: {size} KB",
117-
"file_info_format": "{current}\n{info}"
117+
"file_info_format": "{current}\n{info}",
118+
"preview": "Vorschau:",
119+
"preview_no_file_selected": "Keine Datei\nausgewählt",
120+
"preview_unavailable": "Vorschau\nNicht verfügbar",
121+
"select_second_merge_pdf": "Zweite PDF-Datei zum Zusammenführen auswählen",
122+
"select_output_dir": "Ausgabeverzeichnis auswählen",
123+
"nav_execute": "Ausführen",
124+
"nav_open_output": "📂 Öffnen",
125+
"info": "Info",
126+
"contact_us": "kontaktieren Sie uns",
127+
"check_for_updates": "Nach Updates suchen",
128+
"results_starting": "Vorgang wird gestartet...\n",
129+
"results_operation_completed": "Vorgang abgeschlossen!",
130+
"results_status": "Status:",
131+
"results_details": "Details:",
132+
"results_success": "Erfolg",
133+
"results_failed": "Fehlgeschlagen",
134+
"cancel_no_operation": "Derzeit läuft kein Vorgang. \r\nMöchten Sie die Anwendung schließen?",
135+
"cancel_operation_title": "Vorgang abbrechen",
136+
"cancel_confirm": "Sind Sie sicher, dass Sie den aktuellen Vorgang abbrechen möchten?",
137+
"cancel_confirm_title": "Abbruch bestätigen",
138+
"cancel_final": "Dies wird den Vorgang stoppen. Möchten Sie wirklich abbrechen?",
139+
"operation_cancelled": "Vorgang vom Benutzer abgebrochen.",
140+
"pro_dialog_title": "SafePDF Pro",
141+
"pro_active_header": "🎉 Pro-Version aktiv!",
142+
"pro_expired": "Ihre Pro-Lizenz ist abgelaufen",
143+
"pro_remaining": "Tage verbleibend auf Ihrer Pro-Lizenz",
144+
"pro_remaining_single": "Tag verbleibend auf Ihrer Pro-Lizenz",
145+
"pro_enabled_features": "✅ Aktivierte Pro-Funktionen:",
146+
"pro_extend_license": "🔄 Lizenz verlängern/erneuern:",
147+
"pro_extend_desc": "Laden Sie eine neue Lizenzdatei hoch, um Ihren Pro-Zugang zu verlängern",
148+
"pro_upgrade_header": "Upgrade für ein leistungsfähigeres SafePDF",
149+
"pro_upgrade_sub": "Schalten Sie Premium-Funktionen für das beste PDF-Erlebnis frei",
150+
"pro_have_license": "🔑 Haben Sie eine Lizenzdatei?",
151+
"pro_upload_desc": "Laden Sie Ihre Lizenzdatei hoch, um Pro-Funktionen zu aktivieren",
152+
"pro_select_file": "Lizenzdatei auswählen",
153+
"pro_file_type": "Lizenzdateien",
154+
"pro_activation": "Aktivierung",
155+
"pro_select_file_warning": "Bitte wählen Sie eine Lizenzdatei aus.",
156+
"pro_file_not_exist": "Lizenzdatei existiert nicht.",
157+
"pro_activation_success": "🎉 Aktivierung erfolgreich!",
158+
"pro_activation_failed": "Aktivierung fehlgeschlagen",
159+
"pro_features_include": "💎 Pro-Funktionen umfassen:",
160+
"pro_get_now": "🌐 Holen Sie sich jetzt die Pro-Version",
161+
"pro_redirecting": "Weiterleitung",
162+
"pro_opening_website": "Öffnen der SafePDF-Website für Kaufinformationen...",
163+
"pro_could_not_open": "Website konnte nicht geöffnet werden.",
164+
"update_checking_title": "🔍 Nach Updates suchen",
165+
"update_checking": "🔄 Nach Updates suchen...",
166+
"update_up_to_date": "✅ Aktuell",
167+
"update_latest_version": "Sie verwenden die neueste Version!",
168+
"update_check_failed": "❌ Update-Prüfung fehlgeschlagen",
169+
"update_could_not_check": "Konnte nicht nach Updates suchen:",
170+
"update_available_title": "Update verfügbar",
171+
"update_whats_new": "📋 Was ist neu:",
172+
"update_no_changelog": "Kein Änderungsprotokoll verfügbar",
173+
"update_download": "⬇️ Update herunterladen",
174+
"update_view_release": "🔗 Release anzeigen",
175+
"update_later": "❌ Später",
176+
"update_downloading_title": "⬇️ Update herunterladen",
177+
"update_downloading": "Update wird heruntergeladen...",
178+
"update_downloaded": "✅ Update heruntergeladen",
179+
"update_download_success": "Update erfolgreich heruntergeladen und verifiziert!\n\nBitte starten Sie die Anwendung neu, um das Update anzuwenden.",
180+
"update_download_failed": "❌ Download fehlgeschlagen",
181+
"update_could_not_download": "Update konnte nicht heruntergeladen werden:",
182+
"update_error": "Fehler",
183+
"update_could_not_download_e": "Update konnte nicht heruntergeladen werden:",
184+
"github_error": "GitHub-Repository konnte nicht geöffnet werden.",
185+
"url_security_warning": "Sicherheitswarnung",
186+
"url_invalid_scheme": "Ungültiges URL-Schema.",
187+
"url_error": "URL konnte nicht geöffnet werden:",
188+
"btn_browse": "Durchsuchen",
189+
"btn_activate_now": "Jetzt aktivieren!",
190+
"pro_status_expired": "✓ PRO (ABGELAUFEN)",
191+
"pro_status_active": "✓ PRO ({days} Tag{days_plural} verbleibend)",
192+
"pro_status_free": "KOSTENLOSE Version - Jetzt upgraden!",
193+
"pro_badge_expired": "PRO (Abgelaufen)",
194+
"pro_badge_active": "PRO (Aktiv)",
195+
"pro_badge_free": "KOSTENLOS",
196+
"error_generic": "Fehler",
197+
"error_open_dialog": "Dialog konnte nicht geöffnet werden:",
198+
"op_pypdf_unavailable": "PyPDF2/pypdf nicht verfügbar",
199+
"op_input_file_not_exist": "Eingabedatei existiert nicht",
200+
"op_invalid_pdf": "Eingabedatei ist keine gültige PDF",
201+
"op_cancelled": "Vorgang vom Benutzer abgebrochen",
202+
"op_no_pages": "Eingabe-PDF hat keine Seiten",
203+
"op_invalid_output": "Komprimierung abgeschlossen, aber Ausgabedatei ungültig",
204+
"op_zero_size": "Ursprüngliche Dateigröße ist null. Komprimierung kann nicht berechnet werden.",
205+
"op_compress_success": "PDF erfolgreich komprimiert. Qualität: {quality}. Größe um {compression_ratio:.1f}% reduziert",
206+
"op_compress_increased": "Komprimierung erhöhte die Dateigröße um {increase_pct:.1f}%. Bitte versuchen Sie eine andere Qualitätseinstellung.",
207+
"op_no_compression": "Keine Größenreduzierung erreicht. Bitte versuchen Sie eine andere Qualitätseinstellung oder verwenden Sie 'Microsoft Print to PDF' aus dem Druckdialog.",
208+
"op_compress_failed": "Komprimierung fehlgeschlagen: {error}",
209+
"op_split_pages": "PDF in {total_pages} Dateien aufgeteilt",
210+
"op_split_ranges": "PDF basierend auf Bereichen in {num_ranges} Dateien aufgeteilt",
211+
"op_split_failed": "Aufteilen fehlgeschlagen: {error}",
212+
"op_merge_success": "{total_files} PDF-Dateien erfolgreich zusammengeführt",
213+
"op_merge_failed": "Zusammenführen fehlgeschlagen: {error}",
214+
"op_pymupdf_unavailable": "PyMuPDF für PDF-zu-Bild-Konvertierung nicht verfügbar",
215+
"op_jpg_success": "{total_pages} Seiten in JPG-Bilder konvertiert",
216+
"op_jpg_failed": "PDF-zu-JPG-Konvertierung fehlgeschlagen: {error}",
217+
"op_rotate_success": "PDF um {angle} Grad gedreht",
218+
"op_rotate_failed": "Drehung fehlgeschlagen: {error}",
219+
"op_repair_success": "PDF repariert. {pages_recovered} Seiten wiederhergestellt",
220+
"op_repair_no_pages": "Keine Seiten konnten aus der PDF wiederhergestellt werden",
221+
"op_repair_failed": "Reparatur fehlgeschlagen: {error}",
222+
"op_text_success": "Text nach {output_path} extrahiert",
223+
"op_text_failed": "Textextraktion fehlgeschlagen: {error}",
224+
"op_hidden_success": "Versteckte Informationen nach {output_path} extrahiert",
225+
"op_hidden_failed": "Extraktion versteckter Informationen fehlgeschlagen: {error}",
226+
"op_docx_unavailable": "python-docx nicht installiert. Bitte installieren mit: pip install python-docx",
227+
"op_word_pymupdf_unavailable": "PyMuPDF für PDF-zu-Word-Konvertierung nicht verfügbar",
228+
"op_word_cancelled": "Vorgang abgebrochen",
229+
"op_word_success": "PDF in Word-Dokument konvertiert: {output_path}",
230+
"op_word_failed": "PDF-zu-Word-Konvertierung fehlgeschlagen: {error}",
231+
"op_compression_info": "Komprimierung Info",
232+
"op_compression_info_msg": "Komprimierung abgeschlossen, aber keine Größenreduzierung festgestellt.\nDiese Datei wurde bereits optimiert oder enthält\nElemente, die nicht weiter komprimiert werden können.\nFür weitere Komprimierung erwägen Sie die Verwendung der\n'Microsoft Print to PDF'-Option aus dem Druckdialog.",
233+
"tooltip_welcome": "Beginnen Sie hier - Willkommen und Einführung in SafePDF",
234+
"tooltip_operation": "Wählen Sie den PDF-Vorgang aus, den Sie ausführen möchten",
235+
"tooltip_file": "Wählen Sie die PDF-Datei(en) aus, die Sie verarbeiten möchten",
236+
"tooltip_settings": "Konfigurieren Sie vorgangsspezifische Einstellungen",
237+
"tooltip_results": "Zeigen Sie die Ergebnisse Ihres PDF-Vorgangs an",
238+
"tooltip_app_settings": "Anwendungseinstellungen und -einstellungen",
239+
"tooltip_help": "Hilfe und Dokumentation"
118240
}
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
Willkommen
22

3-
Klicken Sie auf „Weiter“, um den Prozess zu starten und Ihre gewünschte Aktion auszuwählen.
3+
Klicken Sie auf „Weiter“, um den Vorgang zu starten und Ihre gewünschte Aktion auszuwählen.
44

5-
📋 Prozessschritte:
5+
📋 Ablauf:
66

77
(1) Startseite dieser Anwendung
88
(2) Quelldatei auswählen
@@ -14,8 +14,9 @@ Keine Sorge, Ihre Dateien verlassen Ihren Computer nicht.
1414

1515
💻 Softwareinformationen
1616

17-
Version: v1.0.9
17+
Version: v1.0.10
1818
🔗 Nach Updates suchen
19-
👨‍💻 von mcagriaksoy – 2025
2019

21-
Weitere Informationen und Updates finden Sie in unserem GitHub-Repository.
20+
21+
22+
Für weitere Informationen und Updates kontaktieren Sie uns. SafePdf™ – 2025

SafePDF/text/en/ui.json

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,127 @@
114114
"selected_file": "✅ Selected: {filename}",
115115
"pdf_info_pages": "Pages: {pages}",
116116
"pdf_info_size": "Size: {size} KB",
117-
"file_info_format": "{current}\n{info}"
117+
"file_info_format": "{current}\n{info}",
118+
"preview": "Preview:",
119+
"preview_no_file_selected": "No file\nselected",
120+
"preview_unavailable": "Preview\nUnavailable",
121+
"select_second_merge_pdf": "Select Second PDF File to Merge",
122+
"select_output_dir": "Select Output Directory",
123+
"nav_execute": "Execute",
124+
"nav_open_output": "📂 Open",
125+
"info": "Info",
126+
"contact_us": "contact us",
127+
"check_for_updates": "Check for Updates",
128+
"results_starting": "Starting operation...\n",
129+
"results_operation_completed": "Operation completed!",
130+
"results_status": "Status:",
131+
"results_details": "Details:",
132+
"results_success": "Success",
133+
"results_failed": "Failed",
134+
"cancel_no_operation": "No operation is currently running. \r\nDo you want to close the application?",
135+
"cancel_operation_title": "Cancel Operation",
136+
"cancel_confirm": "Are you sure you want to cancel the current operation?",
137+
"cancel_confirm_title": "Confirm Cancel",
138+
"cancel_final": "This will stop the operation. Do you really want to cancel?",
139+
"operation_cancelled": "Operation cancelled by user.",
140+
"pro_dialog_title": "SafePDF Pro",
141+
"pro_active_header": "🎉 Pro Version Active!",
142+
"pro_expired": "Your Pro license has expired",
143+
"pro_remaining": "days remaining on your Pro license",
144+
"pro_remaining_single": "day remaining on your Pro license",
145+
"pro_enabled_features": "✅ Enabled Pro Features:",
146+
"pro_extend_license": "🔄 Extend/Renew License:",
147+
"pro_extend_desc": "Upload a new license file to extend your Pro access",
148+
"pro_upgrade_header": "Upgrade for a more powerful SafePDF",
149+
"pro_upgrade_sub": "Unlock premium features for the best PDF experience",
150+
"pro_have_license": "🔑 Have a license file?",
151+
"pro_upload_desc": "Upload your license file to activate Pro features",
152+
"pro_select_file": "Select License File",
153+
"pro_file_type": "License files",
154+
"pro_activation": "Activation",
155+
"pro_select_file_warning": "Please select a license file.",
156+
"pro_file_not_exist": "License file does not exist.",
157+
"pro_activation_success": "🎉 Activation Successful!",
158+
"pro_activation_failed": "Activation Failed",
159+
"pro_features_include": "💎 Pro Features Include:",
160+
"pro_get_now": "🌐 Get Pro Version Now",
161+
"pro_redirecting": "Redirecting",
162+
"pro_opening_website": "Opening SafePDF website for purchase information...",
163+
"pro_could_not_open": "Could not open website.",
164+
"update_checking_title": "🔍 Checking for Updates",
165+
"update_checking": "🔄 Checking for updates...",
166+
"update_up_to_date": "✅ Up to Date",
167+
"update_latest_version": "You are running the latest version!",
168+
"update_check_failed": "❌ Update Check Failed",
169+
"update_could_not_check": "Could not check for updates:",
170+
"update_available_title": "Update Available",
171+
"update_whats_new": "📋 What's New:",
172+
"update_no_changelog": "No changelog available",
173+
"update_download": "⬇️ Download Update",
174+
"update_view_release": "🔗 View Release",
175+
"update_later": "❌ Later",
176+
"update_downloading_title": "⬇️ Downloading Update",
177+
"update_downloading": "Downloading update...",
178+
"update_downloaded": "✅ Update Downloaded",
179+
"update_download_success": "Update downloaded and verified successfully!\n\nPlease restart the application to apply the update.",
180+
"update_download_failed": "❌ Download Failed",
181+
"update_could_not_download": "Could not download update:",
182+
"update_error": "Error",
183+
"update_could_not_download_e": "Could not download update:",
184+
"github_error": "Could not open GitHub repository.",
185+
"url_security_warning": "Security Warning",
186+
"url_invalid_scheme": "Invalid URL scheme.",
187+
"url_error": "Could not open URL:",
188+
"btn_browse": "Browse",
189+
"btn_activate_now": "Activate Now!",
190+
"pro_status_expired": "✓ PRO (EXPIRED)",
191+
"pro_status_active": "✓ PRO ({days} day{days_plural} remaining)",
192+
"pro_status_free": "FREE Version - Upgrade now!",
193+
"pro_badge_expired": "PRO (Expired)",
194+
"pro_badge_active": "PRO (Active)",
195+
"pro_badge_free": "FREE",
196+
"error_generic": "Error",
197+
"error_open_dialog": "Could not open dialog:",
198+
"op_pypdf_unavailable": "PyPDF2/pypdf not available",
199+
"op_input_file_not_exist": "Input file does not exist",
200+
"op_invalid_pdf": "Input file is not a valid PDF",
201+
"op_cancelled": "Operation cancelled by user",
202+
"op_no_pages": "Input PDF has no pages",
203+
"op_invalid_output": "Compression completed but output file is invalid",
204+
"op_zero_size": "Original file size is zero. Cannot calculate compression.",
205+
"op_compress_success": "PDF compressed successfully. Quality: {quality}. Size reduced by {compression_ratio:.1f}%",
206+
"op_compress_increased": "Compression increased file size by {increase_pct:.1f}%. Please try a different quality setting.",
207+
"op_no_compression": "No size reduction achieved. Please try a different quality setting or use 'Microsoft Print to PDF' from the print dialog.",
208+
"op_compress_failed": "Compression failed: {error}",
209+
"op_split_pages": "PDF split into {total_pages} files",
210+
"op_split_ranges": "PDF split into {num_ranges} files based on ranges",
211+
"op_split_failed": "Split failed: {error}",
212+
"op_merge_success": "Successfully merged {total_files} PDF files",
213+
"op_merge_failed": "Merge failed: {error}",
214+
"op_pymupdf_unavailable": "PyMuPDF not available for PDF to image conversion",
215+
"op_jpg_success": "Converted {total_pages} pages to JPG images",
216+
"op_jpg_failed": "PDF to JPG conversion failed: {error}",
217+
"op_rotate_success": "PDF rotated by {angle} degrees",
218+
"op_rotate_failed": "Rotation failed: {error}",
219+
"op_repair_success": "PDF repaired. Recovered {pages_recovered} pages",
220+
"op_repair_no_pages": "Could not recover any pages from the PDF",
221+
"op_repair_failed": "Repair failed: {error}",
222+
"op_text_success": "Text extracted to {output_path}",
223+
"op_text_failed": "Text extraction failed: {error}",
224+
"op_hidden_success": "Hidden information extracted to {output_path}",
225+
"op_hidden_failed": "Hidden info extraction failed: {error}",
226+
"op_docx_unavailable": "python-docx not installed. Please install with: pip install python-docx",
227+
"op_word_pymupdf_unavailable": "PyMuPDF not available for PDF to Word conversion",
228+
"op_word_cancelled": "Operation cancelled",
229+
"op_word_success": "PDF converted to Word document: {output_path}",
230+
"op_word_failed": "PDF to Word conversion failed: {error}",
231+
"op_compression_info": "Compression Info",
232+
"op_compression_info_msg": "Compression completed but no size reduction detected.\nThis file has already been optimized or contains\nelements that cannot be compressed further.\nIf you need further compression, consider using the\n'Microsoft Print to PDF' option from the print dialog.",
233+
"tooltip_welcome": "Start here - Welcome and introduction to SafePDF",
234+
"tooltip_operation": "Choose the PDF operation you want to perform",
235+
"tooltip_file": "Select the PDF file(s) you want to process",
236+
"tooltip_settings": "Configure operation-specific settings",
237+
"tooltip_results": "View the results of your PDF operation",
238+
"tooltip_app_settings": "Application settings and preferences",
239+
"tooltip_help": "Help and documentation"
118240
}

SafePDF/text/en/welcome_content.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ Don’t worry, your files never left your computer.
1515

1616
💻 Software Information
1717

18-
Version: v1.0.9
18+
Version: v1.0.10
1919
🔗 Check for Updates
20-
👨‍💻 by mcagriaksoy - 2025
2120

2221

23-
For more information and updates, visit our GitHub repository.
22+
23+
For more information and updates contact us. SafePdf™ - 2025

0 commit comments

Comments
 (0)