=encoding utf-8

=head1 NAME

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

=head1 SYNOPSIS

    greple -Mxlate -e ENGINE --xlate pattern target-file

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

=head1 VERSION

Version 0.9908

=head1 DESCRIPTION

Η ενότητα B<Greple> B<xlate> βρίσκει τα επιθυμητά τμήματα κειμένου και τα αντικαθιστά με το μεταφρασμένο κείμενο. Επί του παρόντος, η ενότητα DeepL (F<deepl.pm>) και η ενότητα ChatGPT (F<gpt3.pm>) υλοποιούνται ως μηχανή back-end. Περιλαμβάνεται επίσης πειραματική υποστήριξη για gpt-4 και gpt-4o.

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

    greple -Mxlate::deepl -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> για να μεταφράσετε την επιλεγμένη περιοχή. Στη συνέχεια, θα βρει τα επιθυμητά τμήματα και θα τα αντικαταστήσει με την έξοδο της εντολής B<deepl>.

Από προεπιλογή, το πρωτότυπο και το μεταφρασμένο κείμενο εκτυπώνονται σε μορφή "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).+> που ταιριάζει σε ολόκληρο το κείμενο.

Τα δεδομένα μορφής δείκτη σύγκρουσης μπορούν να προβληθούν σε στυλ side-by-side με την εντολή C<sdif> με την επιλογή C<-V>. Δεδομένου ότι δεν έχει νόημα η σύγκριση ανά συμβολοσειρά, συνιστάται η επιλογή C<--no-cdif>. Αν δεν χρειάζεται να χρωματίσετε το κείμενο, καθορίστε την επιλογή C<--no-textcolor> (ή C<--no-tc>).

    sdif -V --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

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

=over 2

=item *

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

=item *

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

=item *

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

=item *

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

=back

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

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

    greple -Mxlate -E normalized -E not-normalized

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

=head1 MASKING

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

    --xlate-setopt maskfile=MASKPATTERN

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

Το σύνθετο μοτίβο μπορεί να γραφτεί σε πολλαπλές γραμμές με backslash escpaed newline.

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

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

=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> συμπεριφέρεται ως κανονική εντολή αναζήτησης. Έτσι, μπορείτε να ελέγξετε ποιο τμήμα του αρχείου θα αποτελέσει αντικείμενο της μετάφρασης πριν από την επίκληση της πραγματικής εργασίας.

Το αποτέλεσμα της εντολής πηγαίνει στην τυπική έξοδο, οπότε ανακατευθύνετε σε αρχείο αν είναι απαραίτητο, ή σκεφτείτε να χρησιμοποιήσετε την ενότητα 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>

Καθορίζει τη μηχανή μετάφρασης που θα χρησιμοποιηθεί. Αν καθορίσετε απευθείας τη μονάδα μηχανής, όπως C<-Mxlate::deepl>, δεν χρειάζεται να χρησιμοποιήσετε αυτή την επιλογή.

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

=over 2

=item * B<deepl>: DeepL API

=item * B<gpt3>: gpt-3.5-turbo

=item * B<gpt4>: gpt-4-turbo

=item * B<gpt4o>: gpt-4o-mini

Η διεπαφή του B<gpt-4o> είναι ασταθής και δεν μπορεί να εγγυηθεί ότι θα λειτουργεί σωστά αυτή τη στιγμή.

=back

=item B<--xlate-labor>

=item B<--xlabor>

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

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

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

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

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

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

=over 4

=item B<conflict>, B<cm>

Το αρχικό και το μετατρεπόμενο κείμενο εκτυπώνονται σε μορφή δείκτη σύγκρουσης L<git(1)>.

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

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

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

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

Το πρωτότυπο και το μεταφρασμένο κείμενο εξάγονται με το προσαρμοσμένο στυλ δοχείου 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 ταυτόχρονα. Η προεπιλεγμένη τιμή έχει οριστεί όπως για τη δωρεάν υπηρεσία λογαριασμού 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<-->[B<no->]B<xlate-progress> (Default: True)

Δείτε το αποτέλεσμα της μετάφρασης σε πραγματικό χρόνο στην έξοδο STDERR.

=item B<--xlate-stripe>

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

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

=item B<--xlate-mask>

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

=item B<--match-all>

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

=back

=head1 CACHE OPTIONS

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

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

=over 7

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

=over 4

=item C<auto> (Default)

Διατήρηση του αρχείου κρυφής μνήμης εάν υπάρχει.

=item C<create>

Δημιουργεί κενό αρχείο κρυφής μνήμης και τερματίζει.

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

Διατηρεί την κρυφή μνήμη ούτως ή άλλως εφόσον ο στόχος είναι κανονικό αρχείο.

=item C<clear>

Καθαρίστε πρώτα τα δεδομένα της κρυφής μνήμης.

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

Δεν χρησιμοποιεί ποτέ το αρχείο κρυφής μνήμης ακόμη και αν υπάρχει.

=item C<accumulate>

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

=back

=item B<--xlate-update>

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

=back

=head1 COMMAND LINE INTERFACE

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

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

Επίσης, δεδομένου ότι παρέχονται 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.

=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.

=back

=head1 INSTALL

=head2 CPANMINUS

    $ cpanm App::Greple::xlate

=head2 TOOLS

Πρέπει να εγκαταστήσετε τα εργαλεία γραμμής εντολών για τα DeepL και ChatGPT.

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

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

=head1 SEE ALSO

L<App::Greple::xlate>

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

L<App::Greple::xlate::gpt3>

=over 2

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

Εικόνα εμπορευματοκιβωτίου Docker.

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

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

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

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

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

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

=item * L<App::Greple>

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

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

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

=item * L<App::sdif>

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

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

Greple B<stripe> χρήση της μονάδας B<--xlate-stripe> με την επιλογή B<--xlate-stripe>.

=back

=head2 ARTICLES

=over 2

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

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

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

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

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

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

=back

=head1 AUTHOR

Kazumasa Utashiro

=head1 LICENSE

Copyright © 2023-2025 Kazumasa Utashiro.

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

=cut
