=encoding utf-8

=head1 NAME

App::Greple::xlate - μονάδα υποστήριξης μετάφρασης για το greple

=head1 SYNOPSIS

    greple -Mxlate --xlate-engine gpt5 --xlate pattern target-file

    greple -Mxlate --xlate-engine deepl --xlate pattern target-file

=head1 VERSION

Version 2.01

=head1 DESCRIPTION

B<Greple> B<xlate> το module βρίσκει τα επιθυμητά μπλοκ κειμένου και τα αντικαθιστά με το μεταφρασμένο κείμενο. Η κύρια μηχανή είναι το GPT-5.5 (F<llm/gpt5.pm>), το οποίο καλεί την εντολή L<llm|https://llm.datasette.io/>· περιλαμβάνονται επίσης το DeepL (F<deepl.pm>) και παλαιότερες μηχανές βασισμένες σε B<gpty>.

Οι μεταφράσεις αποθηκεύονται στην κρυφή μνήμη ανά αρχείο, έτσι η επανεκτέλεση μιας εντολής δεν κοστίζει τίποτα για αμετάβλητο κείμενο. Όταν ένα έγγραφο επεξεργάζεται, μόνο οι αλλαγμένες παράγραφοι αποστέλλονται ξανά στο API· μια μηχανή με επίγνωση συμφραζομένων λαμβάνει επίσης τις περιβάλλουσες μεταφράσεις, το ακατέργαστο κείμενο πηγής γύρω από την αλλαγή και την προηγούμενη έκδοση της επεξεργασμένης παραγράφου, ώστε η νέα μετάφραση να διατηρεί την καθιερωμένη διατύπωση (βλ. B<--xlate-context-window>). Ευαίσθητες συμβολοσειρές μπορούν να αποκρυφθούν πριν από τη μετάδοση (βλ. L</ANONYMIZATION AND TEMPLATES>).

Αν θέλετε να μεταφράσετε κανονικά μπλοκ κειμένου σε ένα έγγραφο γραμμένο στο στυλ pod της Perl, χρησιμοποιήστε την εντολή B<greple> με C<--xlate-engine gpt5> και το module C<perl> ως εξής:

    greple -Mxlate --xlate-engine gpt5 -Mperl --pod --re '^([\w\pP].*\n)+' --all foo.pm

Σε αυτή την εντολή, η συμβολοσειρά μοτίβου C<^([\w\pP].*\n)+> σημαίνει διαδοχικές γραμμές που αρχίζουν με αλφαριθμητικό και σημείο στίξης. Αυτή η εντολή εμφανίζει την περιοχή προς μετάφραση με επισήμανση. Η επιλογή B<--all> χρησιμοποιείται για την παραγωγή ολόκληρου του κειμένου.

=for html <p>
<img width="750" src="https://raw.githubusercontent.com/kaz-utashiro/App-Greple-xlate/main/images/select-area.png">
</p>

Έπειτα προσθέστε την επιλογή C<--xlate> για να μεταφράσετε την επιλεγμένη περιοχή. Τότε, θα βρει τα επιθυμητά τμήματα και θα τα αντικαταστήσει με την έξοδο της μηχανής μετάφρασης.

Από προεπιλογή, το αρχικό και το μεταφρασμένο κείμενο εκτυπώνεται σε μορφή "conflict marker" συμβατή με το L<git(1)>. Χρησιμοποιώντας τη μορφή C<ifdef>, μπορείτε να λάβετε το επιθυμητό μέρος εύκολα με την εντολή L<unifdef(1)>. Η μορφή εξόδου μπορεί να καθοριστεί με την επιλογή B<--xlate-format>.

=for html <p>
<img width="750" src="https://raw.githubusercontent.com/kaz-utashiro/App-Greple-xlate/main/images/format-conflict.png">
</p>

Αν θέλετε να μεταφράσετε ολόκληρο το κείμενο, χρησιμοποιήστε την επιλογή B<--match-all>. Αυτό είναι μια συντόμευση για να καθορίσετε το μοτίβο C<(?s).+> που ταιριάζει σε ολόκληρο το κείμενο.

Τα δεδομένα σε μορφή conflict marker μπορούν να προβληθούν σε διάταξη δίπλα-δίπλα με την εντολή L<sdif|App::sdif> και την επιλογή C<-V>. Εφόσον δεν έχει νόημα η σύγκριση σε βάση ανά-συμβολοσειρά, συνιστάται η επιλογή C<--no-cdif>. Αν δεν χρειάζεται να χρωματίσετε το κείμενο, καθορίστε C<--no-textcolor> (ή C<--no-tc>).

    sdif -V --no-filename --no-tc --no-cdif data_shishin.deepl-EN-US.cm

=for html <p>
<img width="750" src="https://raw.githubusercontent.com/kaz-utashiro/App-Greple-xlate/main/images/sdif-cm-view.png">
</p>

=head1 NORMALIZATION

Η επεξεργασία γίνεται σε καθορισμένες μονάδες, αλλά στην περίπτωση ακολουθίας πολλαπλών γραμμών μη κενoύ κειμένου, αυτές μετατρέπονται μαζί σε μία μόνο γραμμή. Η λειτουργία εκτελείται ως εξής:

=over 2

=item *

Αφαιρέστε τα κενά στην αρχή και στο τέλος κάθε γραμμής.

=item *

Αν μια γραμμή τελειώνει με χαρακτήρα σημείου στίξης πλήρους πλάτους, συγκολλήστε με την επόμενη γραμμή.

=item *

Αν μια γραμμή τελειώνει με χαρακτήρα πλήρους πλάτους και η επόμενη γραμμή αρχίζει με χαρακτήρα πλήρους πλάτους, συγκολλήστε τις γραμμές.

=item *

Αν είτε το τέλος είτε η αρχή μιας γραμμής δεν είναι χαρακτήρας πλήρους πλάτους, συγκολλήστε τις εισάγοντας έναν χαρακτήρα κενού.

=back

Τα δεδομένα cache διαχειρίζονται βάσει του κανονικοποιημένου κειμένου, επομένως ακόμη κι αν γίνουν τροποποιήσεις που δεν επηρεάζουν τα αποτελέσματα κανονικοποίησης, τα αποθηκευμένα δεδομένα μετάφρασης θα παραμείνουν αποτελεσματικά.

Αυτή η διαδικασία κανονικοποίησης εκτελείται μόνο για το πρώτο (0ό) και τα ζυγά μοτίβα. Έτσι, αν καθοριστούν δύο μοτίβα ως εξής, το κείμενο που ταιριάζει με το πρώτο μοτίβο θα υποβληθεί σε επεξεργασία μετά την κανονικοποίηση, και δεν θα εκτελεστεί διαδικασία κανονικοποίησης στο κείμενο που ταιριάζει με το δεύτερο μοτίβο.

    greple -Mxlate -E normalized -E not-normalized

Επομένως, χρησιμοποιήστε το πρώτο μοτίβο για κείμενο που πρόκειται να υποβληθεί σε επεξεργασία συνδυάζοντας πολλές γραμμές σε μία μόνο γραμμή, και χρησιμοποιήστε το δεύτερο μοτίβο για προ-μορφοποιημένο κείμενο. Αν δεν υπάρχει κείμενο που να ταιριάζει στο πρώτο μοτίβο, χρησιμοποιήστε ένα μοτίβο που δεν ταιριάζει με τίποτα, όπως το C<(?!)>.

=head1 MASKING

Περιστασιακά, υπάρχουν τμήματα κειμένου που δεν θέλετε να μεταφραστούν. Για παράδειγμα, ετικέτες σε αρχεία markdown. Η DeepL προτείνει ότι σε τέτοιες περιπτώσεις, το τμήμα του κειμένου που θα αποκλειστεί να μετατραπεί σε ετικέτες XML, να μεταφραστεί και στη συνέχεια να αποκατασταθεί μετά την ολοκλήρωση της μετάφρασης. Για να υποστηριχθεί αυτό, είναι δυνατό να καθοριστούν τα τμήματα που θα καλυφθούν (masked) από τη μετάφραση.

    --xlate-setopt maskfile=MASKPATTERN

Αυτό θα ερμηνεύσει κάθε γραμμή του αρχείου C<MASKPATTERN> ως κανονική έκφραση, θα μεταφράσει τις συμβολοσειρές που την αντιστοιχούν και θα επανέλθει μετά την επεξεργασία. Γραμμές που αρχίζουν με C<#> αγνοούνται.

Μπορεί να γραφτεί σύνθετο μοτίβο σε πολλές γραμμές με newline διαφυγμένο με ανάστροφη κάθετο.

Το πώς μετασχηματίζεται το κείμενο μέσω masking μπορεί να φανεί με την επιλογή B<--xlate-mask>.

Το masking προστατεύει τη σήμανση από τη μετάφραση. Για να αποκρύψετε ευαίσθητες συμβολοσειρές από την ίδια την υπηρεσία μετάφρασης, δείτε L</ANONYMIZATION AND TEMPLATES>· και τα δύο μπορούν να χρησιμοποιηθούν μαζί.

Αυτό το περιβάλλον διεπαφής είναι πειραματικό και ενδέχεται να αλλάξει στο μέλλον.

=head1 ANONYMIZATION AND TEMPLATES

Τα ευαίσθητα strings μπορούν να αποκρύπτονται πριν σταλούν στο translation API και να αποκαθίστανται στην έξοδο. Διατίθενται τρεις πηγές κανόνων ανωνυμοποίησης: ένα αρχείο dictionary (B<--xlate-anonymize>), inline marks στο ίδιο το έγγραφο (B<--xlate-anonymize-mark>), και τιμές YAML front matter (B<--xlate-frontmatter>). Κάθε string αντικαθίσταται από ένα category tag όπως C<< <person id=1 /> >> κατά τη μετάδοση. Ο στόχος απόκρυψης είναι μόνο η μετάδοση API: τα τοπικά cache files αποθηκεύουν αποκατεστημένο plain text. Χρησιμοποιήστε B<--xlate-dryrun> για να ελέγξετε ακριβώς τι θα μεταδιδόταν.

Για έγγραφα φόρμας (τριμηνιαίες αναφορές και παρόμοια), ορίστε τους actors εκ των προτέρων και αναφερθείτε σε αυτούς στο σώμα:

    ---
    報告者: 山田太郎
    発注会社: アクメ株式会社
    ---
    本件について {{ 報告者 }} が調査を行った。

Μεταφράστε το template μία φορά ανά γλώσσα με C<--xlate-template> (και C<--xlate-frontmatter> όταν οι τιμές διατηρούνται στο αρχείο), έπειτα αποδώστε κάθε περίπτωση με τη standalone λειτουργία B<pandoc-embedz> -- οι τιμές κάτω από C<global:> σε εξωτερικό config δεν φτάνουν ποτέ καθόλου στο translation API:

    greple -Mxlate --xlate --xlate-engine=gpt5 --xlate-to=EN-US \
           --xlate-template= --xlate-format=xtxt \
           --match-paragraph --all --need=0 \
           report-template.md > report-template.EN.md
    pandoc-embedz --standalone report-template.EN.md \
                  -c case-123.yaml -o report-123.EN.md < /dev/null

Για inline marks, η παροχή ενός config ορισμού macro κάνει το ίδιο μεταφρασμένο template να αποδίδει είτε τα πραγματικά ονόματα είτε μια redacted έκδοση:

    # macros.yaml           # macros-redacted.yaml
    preamble: |             preamble: |
      {% macro person(name) %}{{ name }}{% endmacro %}
                              {% macro person(name) %}(関係者){% endmacro %}

Εξαιρέστε τα μπλοκ embedz από τη μετάφραση όταν ένα έγγραφο τα περιέχει:

    --exclude '^```embedz\n(?s:.*?)^```\n'

=head1 OPTIONS

=over 7

=item B<--xlate>

=item B<--xlate-color>

=item B<--xlate-fold>

=item B<--xlate-fold-width>=I<n> (Default: 70)

Εκκινεί τη διαδικασία μετάφρασης για κάθε ταιριασμένη περιοχή.

Χωρίς αυτήν την επιλογή, το B<greple> συμπεριφέρεται ως κανονική εντολή αναζήτησης. Έτσι μπορείτε να ελέγξετε ποιο μέρος του αρχείου θα αποτελέσει αντικείμενο μετάφρασης πριν εκκινήσετε την πραγματική εργασία.

Το αποτέλεσμα της εντολής πηγαίνει στο standard out, οπότε κάντε ανακατεύθυνση σε αρχείο αν χρειάζεται, ή σκεφτείτε να χρησιμοποιήσετε το module L<App::Greple::update>.

Η επιλογή B<--xlate> καλεί την επιλογή B<--xlate-color> με την επιλογή B<--color=never>.

Με την επιλογή B<--xlate-fold>, το μετατρεπόμενο κείμενο διπλώνεται στο καθορισμένο πλάτος. Το προεπιλεγμένο πλάτος είναι 70 και μπορεί να οριστεί με την επιλογή B<--xlate-fold-width>. Τέσσερις στήλες δεσμεύονται για λειτουργία run-in, οπότε κάθε γραμμή μπορεί να χωρέσει το πολύ 74 χαρακτήρες.

=item B<--xlate-engine>=I<engine>

Καθορίζει τη μηχανή μετάφρασης που θα χρησιμοποιηθεί.

Αυτή τη στιγμή, οι ακόλουθες μηχανές είναι διαθέσιμες

=over 2

=item * B<gpt5>: gpt-5.5 (via the C<llm> command)

=item * B<deepl>: DeepL API (via the C<deepl> command)

=item * B<gpt3>: gpt-3.5-turbo (legacy, via the C<gpty> command)

=item * B<gpt4o>: gpt-4o-mini (legacy, via the C<gpty> command)

=back

Οι μονάδες μηχανής αναζητούνται πρώτα στους χώρους ονομάτων backend (C<llm>, έπειτα C<gpty>), και στη συνέχεια απευθείας κάτω από το C<App::Greple::xlate>. Έτσι, το C<gpt5> φορτώνει το C<App::Greple::xlate::llm::gpt5> που καλεί την εντολή C<llm>, ενώ το C<gpt4o> επιστρέφει εφεδρικά στο C<App::Greple::xlate::gpty::gpt4o>. Χρησιμοποιήστε το C<--xlate-setopt backend=gpty> για να επιβάλετε ένα συγκεκριμένο backend.

=item B<--xlate-labor>

=item B<--xlabor>

Αντί να καλέσετε μηχανή μετάφρασης, αναμένεται να εργαστείτε χειροκίνητα. Αφού προετοιμάσετε το κείμενο προς μετάφραση, αντιγράφεται στο πρόχειρο. Αναμένεται να το επικολλήσετε στη φόρμα, να αντιγράψετε το αποτέλεσμα στο πρόχειρο και να πατήσετε return.

=item B<--xlate-to> (Default: C<EN-US>)

Καθορίστε τη γλώσσα-στόχο. Οι μηχανές LLM δέχονται οποιοδήποτε όνομα ή κωδικό γλώσσας κατανοεί το μοντέλο· παρεμβάλλεται στο prompt μετάφρασης. Μπορείτε να λάβετε τις διαθέσιμες γλώσσες με την εντολή C<deepl languages> όταν χρησιμοποιείτε τη μηχανή B<DeepL>.

=item B<--xlate-from> (Default: C<ORIGINAL>)

Ετικέτα που χρησιμοποιείται για το αρχικό κείμενο στις μορφές εξόδου C<conflict>, C<colon> και C<ifdef>. Με τη μηχανή B<DeepL>, μια μη προεπιλεγμένη τιμή μεταβιβάζεται επίσης ως γλώσσα προέλευσης.

=item B<--xlate-format>=I<format> (Default: C<conflict>)

Καθορίστε τη μορφή εξόδου για το αρχικό και το μεταφρασμένο κείμενο.

Οι ακόλουθες μορφές εκτός από το C<xtxt> υποθέτουν ότι το τμήμα προς μετάφραση είναι μια συλλογή γραμμών. Στην πράξη, είναι δυνατό να μεταφραστεί μόνο ένα μέρος μιας γραμμής, αλλά ο καθορισμός μορφής διαφορετικής από το C<xtxt> δεν θα παράγει ουσιαστικά αποτελέσματα.

=over 4

=item B<conflict>, B<cm>

Το αρχικό και το μετατρεπόμενο κείμενο εκτυπώνονται σε μορφή conflict marker του L<git(1)>.

    <<<<<<< ORIGINAL
    original text
    =======
    translated Japanese text
    >>>>>>> JA

Μπορείτε να ανακτήσετε το αρχικό αρχείο με την επόμενη εντολή L<sed(1)>.

    sed -e '/^<<<<<<< /d' -e '/^=======$/,/^>>>>>>> /d'

=item B<colon>, I<:::::::>

Το αρχικό και το μεταφρασμένο κείμενο εξάγονται σε στυλ custom container του markdown.

    ::::::: ORIGINAL
    original text
    :::::::
    ::::::: JA
    translated Japanese text
    :::::::

Το παραπάνω κείμενο θα μετατραπεί ως εξής σε HTML.

    <div class="ORIGINAL">
    original text
    </div>
    <div class="JA">
    translated Japanese text
    </div>

Ο αριθμός των άνω και κάτω τελειών είναι 7 από προεπιλογή. Αν καθορίσετε ακολουθία άνω και κάτω τελειών όπως C<:::::>, αυτή χρησιμοποιείται αντί για 7 άνω και κάτω τελείες.

=item B<ifdef>

Το αρχικό και το μετατρεπόμενο κείμενο εκτυπώνονται σε μορφή L<cpp(1)> C<#ifdef>.

    #ifdef ORIGINAL
    original text
    #endif
    #ifdef JA
    translated Japanese text
    #endif

Μπορείτε να ανακτήσετε μόνο το ιαπωνικό κείμενο με την εντολή B<unifdef>:

    unifdef -UORIGINAL -DJA foo.ja.pm

=item B<space>

=item B<space+>

Το αρχικό και το μετατρεπόμενο κείμενο εκτυπώνονται χωρισμένα από μια κενή γραμμή. Για το C<space+>, εξάγει επίσης μια αλλαγή γραμμής μετά το μετατρεπόμενο κείμενο.

=item B<xtxt>

Αν η μορφή είναι C<xtxt> (μεταφρασμένο κείμενο) ή άγνωστη, εκτυπώνεται μόνο το μεταφρασμένο κείμενο.

=back

=item B<--xlate-maxlen>=I<chars> (Default: 0)

Καθορίστε το μέγιστο μήκος κειμένου που θα αποστέλλεται στο API κάθε φορά. Η προεπιλεγμένη τιμή 0 σημαίνει το ίδιο το όριο της μηχανής: για τον δωρεάν λογαριασμό DeepL αυτό είναι 128K για το API (B<--xlate>) και 5000 για τη διεπαφή προχείρου (B<--xlate-labor>). Ίσως μπορείτε να αλλάξετε αυτές τις τιμές αν χρησιμοποιείτε την υπηρεσία Pro.

=item B<--xlate-maxline>=I<n> (Default: 0)

Καθορίστε το μέγιστο πλήθος γραμμών κειμένου που θα αποστέλλεται στο API κάθε φορά.

Ορίστε αυτήν την τιμή σε 1 αν θέλετε να μεταφράζετε μία γραμμή κάθε φορά. Αυτή η επιλογή υπερισχύει της επιλογής C<--xlate-maxlen>.

=item B<--xlate-prompt>=I<text>

Καθορίστε μια προσαρμοσμένη προτροπή που θα σταλεί στη μηχανή μετάφρασης. Αυτή η επιλογή είναι διαθέσιμη για τις μηχανές LLM (C<gpt3>, C<gpt4o>, C<gpt5>) αλλά όχι για το DeepL. Μπορείτε να προσαρμόσετε τη συμπεριφορά μετάφρασης παρέχοντας συγκεκριμένες οδηγίες στο μοντέλο AI. Αν η προτροπή περιέχει C<%s>, θα αντικατασταθεί με το όνομα της γλώσσας-στόχου.

=item B<--xlate-context>=I<text>

Καθορίστε πρόσθετες πληροφορίες συμφραζομένων που θα σταλούν στη μηχανή μετάφρασης. Αυτή η επιλογή μπορεί να χρησιμοποιηθεί πολλές φορές για να δοθούν πολλαπλές συμβολοσειρές συμφραζομένων. Οι πληροφορίες συμφραζομένων βοηθούν τη μηχανή μετάφρασης να κατανοήσει το υπόβαθρο και να παράγει πιο ακριβείς μεταφράσεις.

=item B<--xlate-context-window>=I<n>

(Context-aware engines only, e.g. C<gpt5> on the llm backend)
Αριθμός των γύρω μεταφρασμένων μπλοκ που περνούν ως συμφραζόμενα αναφοράς κατά την επαναμετάφραση αλλαγμένων μπλοκ (προεπιλογή 2). Τα συμφραζόμενα περιλαμβάνουν επίσης το ακατέργαστο πηγαίο κείμενο γύρω από την αλλαγμένη περιοχή (επικεφαλίδες, δομή λίστας, λεζάντες) και, όταν είναι διαθέσιμη, την προηγούμενη έκδοση του αλλαγμένου κειμένου που ανακτήθηκε από την cache, ώστε να διατηρείται η αμετάβλητη διατύπωση. Ορίστε σε 0 για να απενεργοποιήσετε πλήρως τη μετάφραση με επίγνωση συμφραζομένων. Σημειώστε ότι κάθε αλλαγμένη περιοχή μεταφράζεται στη δική της κλήση API και τα συμφραζόμενα μπορούν να προσθέσουν έως περίπου 8000 χαρακτήρες στην προτροπή συστήματος, επομένως η μετάφραση με επίγνωση συμφραζομένων ανταλλάσσει κάποιο επιπλέον κόστος με συνέπεια.

=item B<--xlate-cache-seed>=I<file>

Αρχικοποιήστε την cache ενός νέου εγγράφου από το αρχείο cache άλλου εγγράφου. Χρήσιμο για περιοδικές αναφορές: τροφοδοτήστε την cache του νέου τεύχους με εκείνη του προηγούμενου τεύχους, ώστε οι αμετάβλητες παράγραφοι να μην επαναμεταφράζονται και οι επεξεργασμένες παράγραφοι να διατηρούν τη διατύπωση του προηγούμενου τεύχους. Το seed χρησιμοποιείται μόνο όταν η cache-στόχος είναι κενή· διαφορετικά αγνοείται με προειδοποίηση. Με το προεπιλεγμένο C<--xlate-cache=auto>, ο καθορισμός seed συνεπάγεται επίσης τη δημιουργία του αρχείου cache του νέου εγγράφου.

=item B<--xlate-anonymize>=I<file>

Ανωνυμοποιήστε ευαίσθητες συμβολοσειρές πριν σταλούν στο API μετάφρασης και επαναφέρετέ τες στην έξοδο. Το αρχείο λεξικού δίνει μία καταχώριση ανά στοιχείο: σε JSON (κανονική, παραγώγιμη από μηχανή)

    [ { "category": "person",  "text": "山田太郎" },
      { "category": "company", "regex": "アクメ(株式会社)?" } ]

ή σε απλή μορφή γραμμής (C<category pattern>, C</.../> για regex). Κάθε στοιχείο αντικαθίσταται από μια ετικέτα κατηγορίας όπως C<< <person id=1 /> >>· η ίδια συμβολοσειρά λαμβάνει πάντα την ίδια ετικέτα, ώστε το μοντέλο να μπορεί να παρακολουθεί ποιος είναι ποιος. Άγνωστα πεδία JSON αγνοούνται, επομένως γεννήτριες (π.χ. ένα τοπικό LLM που εξάγει οντότητες) μπορούν να προσθέτουν τις δικές τους επισημάνσεις. Η κατηγορία C<lit> είναι δεσμευμένη. Τα τοπικά αρχεία cache εξακολουθούν να αποθηκεύουν επαναφερμένο απλό κείμενο: ο στόχος της απόκρυψης είναι μόνο η μετάδοση API.

Ένα λεξικό μπορεί να παραχθεί από εξωτερικό εργαλείο -- για παράδειγμα ένα τοπικό μοντέλο που εξάγει ευαίσθητες οντότητες:

    llm -m <local-model> \
        -s 'Extract sensitive entities as a JSON array of objects
            with "category" and "text" fields.' \
        < report.md > report.anon.json
    greple -Mxlate --xlate-anonymize=report.anon.json ...

Ένα UTF-8 BOM στο αρχείο γίνεται ανεκτό. Οι τιμές στη μορφή γραμμής front matter μπορούν να φέρουν τελικό σχόλιο μόνο στη δική τους γραμμή, όχι μετά την τιμή.

=item B<--xlate-anonymize-mark>[=I<regex>]

Συλλέξτε καταχωρίσεις ανωνυμοποίησης από inline marks στο ίδιο το έγγραφο. Επισημάνετε την πρώτη εμφάνιση όπως C<{{ person("山田太郎") }}> και κάθε εμφάνιση της συμβολοσειράς σε όλο το έγγραφο ανωνυμοποιείται. Το ίδιο το mark παραμένει στην πηγή και στη μετάφραση, ώστε ένα έγγραφο να μπορεί επίσης να υποβληθεί σε επεξεργασία από έναν macro processor τύπου Jinja2 (ορίστε τη macro C<person> ώστε να εκτυπώνει ή να αποκρύπτει το όνομα). Ένα προσαρμοσμένο I<regex> πρέπει να περιέχει named captures C<< (?<category>...) >> και C<< (?<text>...) >>.

Σημειώστε ότι με μια επιλογή προαιρετικής τιμής όπως αυτή, ένα επόμενο όρισμα αρχείου θα λαμβανόταν ως η τιμή: γράψτε C<--xlate-anonymize-mark=> (με ένα τελικό C<=>) όταν χρησιμοποιείτε την προεπιλεγμένη σημειογραφία.

Μπορούν να ρυθμιστούν εναλλακτικές σημειογραφίες, για παράδειγμα C<< --xlate-anonymize-mark='@@(?<category>[a-z][a-z0-9_]*):(?<text>[^\n]+?)@@' >> για marks τύπου C<@@person:NAME@@>, ή μια μορφή HTML-comment που παραμένει αόρατη στο rendered Markdown. Οι κανόνες marks συλλέγονται ανά έγγραφο: μια συμβολοσειρά που έχει επισημανθεί σε ένα αρχείο εισόδου δεν αποκρύπτεται σε άλλο αρχείο της ίδιας εκτέλεσης (σε αντίθεση με τις τιμές front matter, οι οποίες συσσωρεύονται μεταξύ αρχείων).

=item B<--xlate-template>[=I<regex>]

Αντιμετωπίστε τις εκφράσεις προτύπων (προεπιλογή: Jinja2 C<{{ ... }}>, C<{% ... %}>, C<{# ... #}>) ως αδιαφανή placeholders: δώστε οδηγία στο μοντέλο να τις αντιγράψει αμετάβλητες και επαληθεύστε, ανά block, ότι η απάντηση περιέχει ακριβώς τις ίδιες εκφράσεις, καθεμία τον ίδιο αριθμό φορών. Η σειρά τους μπορεί να αλλάξει, καθώς η μετάφραση εύλογα τις αναδιατάσσει ώστε να ακολουθεί τη σειρά λέξεων της γλώσσας-στόχου. Μια σπασμένη έκφραση διακόπτει την εκτέλεση· η cache γίνεται checkpoint και παγώνει, ώστε να μη χαθεί τίποτα πληρωμένο.

Σημειώστε ότι με μια επιλογή προαιρετικής τιμής όπως αυτή, ένα επόμενο όρισμα αρχείου θα θεωρούνταν ως η τιμή: γράψτε C<--xlate-template=> (με ένα τελικό C<=>) όταν χρησιμοποιείτε την προεπιλεγμένη σημειογραφία.

=item B<--xlate-frontmatter>

Αντιμετωπίστε ένα αρχικό block C<---> ... C<---> ως YAML front matter: εξαιρέστε το από τη μετάφραση και από τα τμήματα συμφραζομένων της φάσης 2, και προσθέστε τις επίπεδες τιμές C<key: value> του στους κανόνες ανωνυμοποίησης (κατηγορία C<var>) ως δίχτυ ασφαλείας. Με πολλαπλά αρχεία εισόδου, οι συλλεγμένες τιμές συσσωρεύονται (με προτίμηση προς την απόκρυψη).

Αφήνετε πάντα μια κενή γραμμή μετά το κλείσιμο C<--->. Με ένα μοτίβο αντιστοίχισης τύπου παραγράφου, front matter που συνεχίζεται απευθείας στο σώμα του κειμένου σχηματίζει ένα ενιαίο block που εκτείνεται και στις δύο περιοχές και το οποίο η εξαίρεση δεν μπορεί να καταστείλει (σε αυτήν την περίπτωση εκτυπώνεται προειδοποίηση)· οι τιμές εξακολουθούν να ανωνυμοποιούνται, αλλά το ίδιο το front matter θα αποστελλόταν για μετάφραση.

=item B<--xlate-glossary>=I<glossary>

Καθορίστε ένα αναγνωριστικό γλωσσαρίου που θα χρησιμοποιηθεί για τη μετάφραση. Αυτή η επιλογή είναι διαθέσιμη μόνο όταν χρησιμοποιείται η μηχανή DeepL. Το αναγνωριστικό γλωσσαρίου πρέπει να ληφθεί από τον λογαριασμό σας στο DeepL και εξασφαλίζει συνεπή μετάφραση συγκεκριμένων όρων.

=item B<--xlate-dryrun>

Μην καλείτε το API μετάφρασης· αντίθετα, εμφανίστε μέσω της ένδειξης προόδου κάθε payload ακριβώς όπως θα μεταδιδόταν (μετά την ανωνυμοποίηση και τη μάσκα). Χρήσιμο για τον έλεγχο του τι φεύγει από το μηχάνημα και για την εκτίμηση του κόστους μιας εκτέλεσης.

=item B<-->[B<no->]B<xlate-progress> (Default: True)

Δείτε το αποτέλεσμα της μετάφρασης σε πραγματικό χρόνο στην έξοδο STDERR. Το payload C<From> εμφανίζεται όπως μεταδίδεται, μετά την ανωνυμοποίηση και τη μάσκα.

=item B<--xlate-stripe>

Χρησιμοποιήστε τη μονάδα L<App::Greple::stripe> για να προβάλετε το ταιριαστό τμήμα με τρόπο ζέβρας. Αυτό είναι χρήσιμο όταν τα ταιριαστά τμήματα είναι ενωμένα διαδοχικά.

Η παλέτα χρωμάτων αλλάζει ανάλογα με το χρώμα φόντου του τερματικού. Αν θέλετε να το ορίσετε ρητά, μπορείτε να χρησιμοποιήσετε B<--xlate-stripe-light> ή B<--xlate-stripe-dark>.

=item B<--xlate-mask>

Εκτελέστε τη λειτουργία masking και εμφανίστε το μετατρεπόμενο κείμενο όπως είναι χωρίς αποκατάσταση.

=item B<--match-all>

Ορίστε ολόκληρο το κείμενο του αρχείου ως περιοχή στόχο.

=item B<--lineify-cm>

=item B<--lineify-colon>

Στις μορφές C<cm> και C<colon>, η έξοδος χωρίζεται και μορφοποιείται γραμμή προς γραμμή. Επομένως, αν πρόκειται να μεταφραστεί μόνο μέρος μιας γραμμής, δεν μπορεί να ληφθεί το αναμενόμενο αποτέλεσμα. Αυτά τα φίλτρα διορθώνουν έξοδο που έχει καταστραφεί μεταφράζοντας μέρος μιας γραμμής σε κανονική έξοδο ανά γραμμή.

Στην τρέχουσα υλοποίηση, αν μεταφραστούν πολλαπλά τμήματα μιας γραμμής, εξάγονται ως ανεξάρτητες γραμμές.

=back

=head1 CACHE OPTIONS

Η μονάδα B<xlate> μπορεί να αποθηκεύει προσωρινά μεταφρασμένο κείμενο για κάθε αρχείο και να το διαβάζει πριν την εκτέλεση για να εξαλείψει το κόστος ερωτήσεων προς τον διακομιστή. Με την προεπιλεγμένη στρατηγική cache C<auto>, διατηρεί δεδομένα cache μόνο όταν υπάρχει αρχείο cache για το αρχείο-στόχο.

Χρησιμοποιήστε το B<--xlate-cache=clear> για να εκκινήσετε τη διαχείριση της προσωρινής μνήμης ή για να καθαρίσετε όλα τα υπάρχοντα δεδομένα cache. Μόλις εκτελεστεί με αυτήν την επιλογή, θα δημιουργηθεί νέο αρχείο cache αν δεν υπάρχει και στη συνέχεια θα συντηρείται αυτόματα.

=over 7

=item --xlate-cache=I<strategy>

=over 4

=item C<auto> (Default)

Διατηρήστε το αρχείο cache αν υπάρχει.

=item C<create>

Δημιουργήστε κενό αρχείο cache και έξοδος.

=item C<always>, C<yes>, C<1>

Διατήρηση της προσωρινής μνήμης (cache) εφόσον ο προορισμός είναι κανονικό αρχείο.

=item C<clear>

Καθαρίστε πρώτα τα δεδομένα της προσωρινής μνήμης.

=item C<never>, C<no>, C<0>

Να μην χρησιμοποιείται ποτέ αρχείο cache, ακόμα κι αν υπάρχει.

=item C<accumulate>

Σύμφωνα με την προεπιλεγμένη συμπεριφορά, τα μη χρησιμοποιούμενα δεδομένα αφαιρούνται από το αρχείο cache. Αν δεν θέλετε να τα αφαιρέσετε και να τα διατηρήσετε στο αρχείο, χρησιμοποιήστε το C<accumulate>.

=back

=item B<--xlate-update>

Αυτή η επιλογή επιβάλλει την ενημέρωση του αρχείου cache ακόμα κι αν δεν είναι απαραίτητο.

=back

=head1 COMMAND LINE INTERFACE

Μπορείτε εύκολα να χρησιμοποιήσετε αυτό το module από τη γραμμή εντολών χρησιμοποιώντας την εντολή C<xlate> που περιλαμβάνεται στη διανομή. Δείτε τη σελίδα man C<xlate> για χρήση.

Η εντολή C<xlate> υποστηρίζει επιλογές τύπου GNU με μακριά ονόματα όπως C<--to-lang>, C<--from-lang>, C<--engine> και C<--file>. Χρησιμοποιήστε C<xlate -h> για να δείτε όλες τις διαθέσιμες επιλογές.

Η εντολή C<xlate> λειτουργεί σε συνδυασμό με το περιβάλλον Docker, οπότε ακόμα κι αν δεν έχετε τίποτα εγκατεστημένο τοπικά, μπορείτε να τη χρησιμοποιήσετε όσο είναι διαθέσιμο το Docker. Χρησιμοποιήστε την επιλογή C<-D> ή C<-C>.

Οι λειτουργίες Docker διαχειρίζονται από το L<App::dozo>, το οποίο μπορεί επίσης να χρησιμοποιηθεί ως αυτόνομη εντολή. Η εντολή C<dozo> υποστηρίζει το αρχείο διαμόρφωσης C<.dozorc> για επίμονες ρυθμίσεις κοντέινερ.

Επίσης, επειδή παρέχονται makefiles για διάφορα στυλ εγγράφων, είναι δυνατή η μετάφραση σε άλλες γλώσσες χωρίς ειδικές ρυθμίσεις. Χρησιμοποιήστε την επιλογή C<-M>.

Μπορείτε επίσης να συνδυάσετε τις επιλογές Docker και C<make> ώστε να εκτελείτε το C<make> σε περιβάλλον Docker.

Εκτέλεση όπως C<xlate -C> θα εκκινήσει ένα κέλυφος με το τρέχον αποθετήριο git του χώρου εργασίας προσαρτημένο.

Διαβάστε το ιαπωνικό άρθρο στην ενότητα L</SEE ALSO> για λεπτομέρειες.

=head1 EMACS

Φορτώστε το αρχείο F<xlate.el> που περιλαμβάνεται στο αποθετήριο για να χρησιμοποιήσετε την εντολή C<xlate> από τον επεξεργαστή Emacs. Η συνάρτηση C<xlate-region> μεταφράζει την επιλεγμένη περιοχή. Η προεπιλεγμένη γλώσσα είναι C<EN-US> και μπορείτε να καθορίσετε γλώσσα καλώντας τη με prefix argument.

=for html <p>
<img width="750" src="https://raw.githubusercontent.com/kaz-utashiro/App-Greple-xlate/main/images/emacs.png">
</p>

=head1 ENVIRONMENT

=over 7

=item DEEPL_AUTH_KEY

Ορίστε το κλειδί ταυτοποίησης για την υπηρεσία DeepL.

=item OPENAI_API_KEY

Κλειδί ταυτοποίησης OpenAI, που χρησιμοποιείται από τις legacy μηχανές B<gpty>. Η βασισμένη σε C<llm> μηχανή B<gpt5> διαβάζει επίσης αυτή τη μεταβλητή, αλλά λειτουργούν και κλειδιά αποθηκευμένα με C<llm keys set openai>.

=item GREPLE_XLATE_CACHE

Ορίστε την προεπιλεγμένη στρατηγική cache (βλ. L</CACHE OPTIONS>).

=back

=head1 INSTALL

=head2 CPANMINUS

    $ cpanm App::Greple::xlate

=head2 TOOLS

Εγκαταστήστε το εργαλείο γραμμής εντολών για τη μηχανή που χρησιμοποιείτε: C<llm> για τη μηχανή B<gpt5>, C<deepl> για DeepL, C<gpty> για τις legacy μηχανές GPT.

L<https://llm.datasette.io/>

L<https://github.com/DeepLcom/deepl-python>

L<https://github.com/tecolicom/App-gpty>

=head1 SEE ALSO

=head2 MODULES

L<App::Greple::xlate::llm>, L<App::Greple::xlate::deepl>

L<App::dozo> - Γενικός δρομέας Docker που χρησιμοποιείται από το xlate για λειτουργίες κοντέινερ

=head2 RELATED MODULES

=over 2

=item * L<App::Greple>

Δείτε το εγχειρίδιο B<greple> για λεπτομέρειες σχετικά με το μοτίβο στόχου κειμένου. Χρησιμοποιήστε τις επιλογές B<--inside>, B<--outside>, B<--include>, B<--exclude> για να περιορίσετε την περιοχή αντιστοίχισης.

=item * L<App::Greple::update>

Μπορείτε να χρησιμοποιήσετε το module C<-Mupdate> για να τροποποιήσετε αρχεία με το αποτέλεσμα της εντολής B<greple>.

=item * L<App::sdif>

Χρησιμοποιήστε το B<sdif> για να εμφανίσετε τη μορφή δεικτών σύγκρουσης σε παράθεση με την επιλογή B<-V>.

=item * L<App::Greple::stripe>

Το module Greple B<stripe> χρησιμοποιείται με την επιλογή B<--xlate-stripe>.

=back

=head2 RESOURCES

=over 2

=item * L<https://hub.docker.com/r/tecolicom/xlate>

Εικόνα κοντέινερ Docker.

=item * L<https://github.com/tecolicom/getoptlong>

Η βιβλιοθήκη C<getoptlong.sh> που χρησιμοποιείται για την ανάλυση επιλογών στο σkript C<xlate> και στο L<App::dozo>.

=item * L<https://llm.datasette.io/>

Η εντολή C<llm> που χρησιμοποιείται από τη μηχανή B<gpt5> για πρόσβαση σε μοντέλα LLM.

=item * L<https://github.com/DeepLcom/deepl-python>

Βιβλιοθήκη Python και εντολή CLI του DeepL.

=item * L<https://github.com/openai/openai-python>

Βιβλιοθήκη Python της OpenAI

=item * L<https://github.com/tecolicom/App-gpty>

Διεπαφή γραμμής εντολών OpenAI

=back

=head2 ARTICLES

=over 2

=item * L<https://qiita.com/kaz-utashiro/items/1c1a51a4591922e18250>

Greple module για μετάφραση και αντικατάσταση μόνο των απαραίτητων τμημάτων με το DeepL API (στα Ιαπωνικά)

=item * L<https://qiita.com/kaz-utashiro/items/a5e19736416ca183ecf6>

Δημιουργία εγγράφων σε 15 γλώσσες με το module DeepL API (στα Ιαπωνικά)

=item * L<https://qiita.com/kaz-utashiro/items/1b9e155d6ae0620ab4dd>

Περιβάλλον Docker αυτόματης μετάφρασης με το DeepL API (στα Ιαπωνικά)

=back

=head1 AUTHOR

Kazumasa Utashiro

=head1 LICENSE

Copyright © 2023-2026 Kazumasa Utashiro.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut
