Code:
; v22 2024-11-14; 1. Initialisierung der Variablen:
; Am Anfang des Programms werden einige Variablen erstellt, die später verwendet werden. Zum Beispiel gibt es eine Variable, die das Wörterbuch mit den Übersetzungen speichert.
; 2. Laden des Wörterbuchs:
; Es gibt eine Funktion, die das Wörterbuch aus einer Datei lädt. Diese Datei enthält Paare von Wörtern auf Deutsch und ihren Übersetzungen (zum Beispiel Englisch oder Französisch). Die Funktion liest jede Zeile der Datei und speichert die Wörter in einer Liste.
; 3. Wörter übersetzen:
; Eine andere Funktion sucht nach einem deutschen Wort im Wörterbuch und gibt das entsprechende übersetzte Wort zurück.
; 4. Sprache auswählen:
; Es gibt eine Funktion, die verwendet wird, um die Sprache auszuwählen (Englisch oder Französisch). Diese Funktion lädt das entsprechende Wörterbuch, je nachdem, welche Sprache ausgewählt wurde. Sie sorgt auch dafür, dass die Liste der ausgewählten Texte geleert wird, wenn eine neue Sprache gewählt wird.
; 5. Texte ersetzen:
; Eine Hauptfunktion durchsucht die ausgewählten Texte und ersetzt die deutschen Wörter durch ihre Übersetzungen. Diese Funktion wird aufgerufen, nachdem der Benutzer die Texte ausgewählt hat und die gewünschte Sprache eingestellt wurde.
; 6. Dialog-Box:
; Der Code enthält auch einen Dialog, der es dem Benutzer ermöglicht, Texte auszuwählen und die Sprache für die Übersetzungen zu ändern. Es gibt Schaltflächen für Englisch und Französisch, die beim Klicken die entsprechende Spracheinstellung aktivieren.
; 7. Aktionen bei Ereignissen:
; Der Code hat Aktionen, die bei bestimmten Ereignissen ausgeführt werden, wie zum Beispiel wenn der Benutzer den Dialog bestätigt, abbricht oder beendet. Diese Aktionen setzen die Sprache zurück, damit keine Übersetzung ohne eine erneute Sprachwahl durchgeführt wird.
; Zusammengefasst:
; Der Benutzer kann Texte in einer Dialog-Box auswählen.
; Der Benutzer kann zwischen Englisch und Französisch als Übersetzungssprache wählen.
; Der Code ersetzt die deutschen Wörter in den ausgewählten Texten durch ihre Übersetzungen, basierend auf dem ausgewählten Wörterbuch.
; Die Liste der ausgewählten Texte wird geleert, wenn eine neue Sprache gewählt wird.
; Verwende das benutzerdefinierte Paket:
(in-package :custom)
; Verwende das Paket "oli":
(use-package :oli)
; Definiere die Variable für das Wörterbuch:
(defvar *translation-dict* nil)
; Initialisiere als nil, um anzuzeigen, dass keine Sprache ausgewählt ist:
(defvar *selected-language* nil)
; Lade das Übersetzungswörterbuch aus einer Datei mit UTF-8-Codierung:
(defun load-translation-dict-from-file (filename)
(DISPLAY (format nil "Wörterbuch: ~a" filename))
; Öffne die Datei mit UTF-8-Codierung:
(with-open-file (stream filename :external-format :utf-8)
; Lies jede Zeile der Datei:
(loop for line = (read-line stream nil)
while line
; Trenne die Zeile in deutsche und englische Wörter:
for (de en) = (split-string (string-trim '(#\Return #\Newline) line) #\Tab)
; Füge die Wörter als Paar ins Wörterbuch ein:
collect (cons de en) into dict
; Setze das Wörterbuch und zeige die Einträge an:
finally (return
(progn
(setf *translation-dict* dict)
(dolist (entry *translation-dict*)
(DISPLAY (format nil "Wörterbuch Eintrag: ~a" entry))
)
)
)
)
)
) ; Zeige jeden Eintrag im Wörterbuch an
(defun split-string (string char)
"Split a string by a given character."
(loop for i = 0 then (1+ j)
as j = (position char string :start i)
collect (subseq string i j)
while j))
; Übersetze ein Wort mit dem geladenen Wörterbuch:
(defun translate-word (word)
(cdr (assoc word *translation-dict* :test 'string=)))
; Setze die ausgewählte Sprache:
(defun set-language (language)
; Setze die ausgewählte Sprache:
(setf *selected-language* language)
; Lade das entsprechende Wörterbuch basierend auf der Sprache:
(case language
(:EN (load-translation-dict-from-file "dict-DE-EN.tsv")) ; Lade englisches Wörterbuch
(:FR (load-translation-dict-from-file "dict-DE-FR.tsv")) ; Lade französisches Wörterbuch
)
; Debug-Information:
; (DISPLAY (format nil "Ausgewählte Sprache: ~a" language))
)
; Definiere den Dialog:
(sd-defdialog 'click-text-to-replace
:dialog-title "Klicken Sie auf Text, um Version 7 zu ersetzen"
:toolbox-button t
; Definiere die Variablen für den Dialog:
:variables
'(
; Definiere die englische Schaltfläche:
(button-EN
:title "EN"
:push-action (set-language :EN)
:toggle-type :grouped-toggle
:after-input (progn (text-replace selected-text))
)
; Definiere die französische Schaltfläche:
(button-FR
:title "FR"
:push-action (set-language :FR)
:toggle-type :grouped-toggle
:after-input (progn
(text-replace selected-text)
)
)
; Definiere die Auswahl der Texte:
(selected-text
:selection *sd-anno-text-seltype*
:multiple-items t
:title "Text(e)"
:prompt-text "Klicken Sie auf Text(e)."
:size :third
:after-input (progn
(text-replace selected-text)
(setf selected-text nil)
)
)
) ; Ende der Variablen
; Definiere die lokalen Funktionen:
:local-functions
'(
; Funktion zum Ersetzen von Texten:
(text-replace (textliste)
(if (null *selected-language*)
; Zeige Nachricht an, wenn keine Sprache ausgewählt ist:
(DISPLAY "Bitte wählen Sie zuerst eine Sprache aus.")
; else
; Ersetze die Texte:
(let (text textpunkt)
(progn
(dolist (text textliste)
(dolist (line (my-am-inq-text-strings text))
(DISPLAY (format nil "Originalzeile: ~a" line)) ; Debug-Information
(when (stringp line)
(let ((new-line (translate-word line)))
(when new-line
(DISPLAY (format nil "Ersetze Zeile: ~a durch ~a" line new-line)) ; Debug-Information
(setf textpunkt
(sd-execute-annotator-function :fnc
(format nil "~a ~a ~a ~a ~a ~a ~a"
"INQ_SELECTED_ELEM GLOBAL TEXTS"
(sd-get-annotator-position :object text)
"let punkt (STR (INQ 101))"
"let punkt_s (DOCU_CSTRING_TO_LSTRING punkt)"
"(DOCU_OPEN_CONNECTION_TO_SD)"
"(DOCU_ADD_LINE_TO_SD punkt_s)"
"(DOCU_CLOSE_CONNECTION_TO_SD)")))
(DISPLAY (format nil "Textpunkt: ~a" textpunkt)) ; Debug-Information
(sd-execute-annotator-command :cmd
(format nil "~a ~s ~a ~a ~a"
"CHANGE_TEXT"
new-line
"GLOBAL"
textpunkt
"END"))
(DISPLAY (format nil "Text an Punkt geändert: ~a" textpunkt)) ; Debug-Information
)
)
)
)
)
; Leere die Liste der Texte:
(setf textliste nil)
) ; Ende von progn
) ; Ende von let
)
)
) ; Ende der lokalen Funktionen
; Aktion bei Abbruch:
:cancel-action
'(set-language nil)
; Aufräumaktion:
:cleanup-action
'(setf *selected-language* nil)
) ; Ende des sd-defdialogs
; Funktion, um die Texte zu analysieren:
(defun my-am-inq-text-strings (txt)
(first
(first
(sd-execute-annotator-function :fnc
(format nil "DOCU_INQ_TEXT GLOBAL POINTER '~a'" (sd-get-annotator-reference :object txt))
)
)
)
) ; Ende der Funktion my-am-inq-text-strings