Γιατί ξεκίνησα
Το fixops.pro έχει τέσσερις γλώσσες: τα αγγλικά ως κύρια, καθώς και γερμανικά, ελληνικά και ουκρανικά. Η χειροκίνητη μετάφραση κάθε σελίδας, κάθε ετικέτας φόρμας και κάθε ονόματος κατηγορίας παίρνει πολύ χρόνο, ενώ η αυτόματη μετάφραση του ίδιου του προσθέτου συχνά βγαίνει στεγνή και ανακριβής. Αποφάσισα να δοκιμάσω μια διαφορετική προσέγγιση: να αναθέσω τη ρουτίνα σε έναν πράκτορα ΤΝ και να κρατήσω εγώ τον έλεγχο.
Αυτή η ερευνητική σημείωση περιγράφει πώς λειτουργεί, τι βγήκε και ποια λάθη εντόπισα στην πορεία.
Ένα πείραμα με το Claude
Χρησιμοποιώ την ΤΝ στη δουλειά μου εδώ και καιρό και ήθελα να δω πόσο μακριά μπορώ να φτάσω με το Claude της Anthropic σε μία συγκεκριμένη εργασία: έναν πολύγλωσσο ιστότοπο WordPress. Δεν με ενδιέφερε να «ζητήσω από ένα μοντέλο να μεταφράσει μια παράγραφο», αλλά να το ενσωματώσω σε μια πραγματική διαδικασία: να βρίσκει μόνο του τις αμετάφραστες συμβολοσειρές, να γράφει το αποτέλεσμα εκεί που το περιμένει το πρόσθετο και να μην χαλάει τον ιστότοπο στην πορεία.
Πώς λειτουργεί τεχνικά
Το ίδιο το TranslatePress καταχωρίζει στο WordPress μόνο μερικές ενέργειες ρυθμίσεων (για παράδειγμα τη λίστα γλωσσών) και από προεπιλογή δεν είναι ανοιχτές στους πράκτορες μέσω MCP. Δεν έχει ενέργειες για ανάγνωση και εγγραφή των ίδιων των μεταφράσεων. Αυτό το κομμάτι που έλειπε το έγραψα ως ένα μικρό πρόσθετο, TranslatePress AI Bridge. Προσθέτει στον ιστότοπο «δυνατότητες» (abilities) για εργασία με το λεξικό, και από εκεί συνδέονται οι πράκτορες.
Επίπεδο ιστότοπου: WordPress Abilities
Από το WordPress 6.9 ο πυρήνας διαθέτει Abilities API: ένα πρόσθετο δηλώνει μικρές λειτουργίες με περιγραφή των εισόδων και των εξόδων τους. Το δικό μου πρόσθετο δηλώνει επτά τέτοιες:
| Ability | Τι κάνει |
|---|---|
get-strings | Επιστρέφει συμβολοσειρές λεξικού της επιλεγμένης γλώσσας, σελίδα προς σελίδα. Από προεπιλογή μόνο τις αμετάφραστες. |
register-page-strings | Φορτώνει μια σελίδα στη γλώσσα-στόχο ώστε το TranslatePress να προσθέσει τις συμβολοσειρές της στο λεξικό. |
save-translations | Γράφει ζεύγη «αναγνωριστικό και μετάφραση» μέσω του δικού του επιπέδου ερωτημάτων του TranslatePress. |
get-excluded-selectors και update-excluded-selectors | Διαβάζει και αλλάζει τη λίστα «Να μη μεταφράζονται αυτοί οι επιλογείς». |
purge-strings | Διαγράφει άχρηστες αμετάφραστες συμβολοσειρές με αναγνωριστικό ή κανονική έκφραση. |
translate-via-api | Μεταφράζει αμετάφραστες συμβολοσειρές με το Claude, μέσω του κλειδιού API που έχει οριστεί στο πρόσθετο. |
Επίπεδο σύνδεσης: MCP
Το Model Context Protocol συνδέει τέτοιες δυνατότητες με έναν πράκτορα ΤΝ ως εργαλεία. Ο ιστότοπος τρέχει το MCP Adapter, που δημοσιεύει τις σημειωμένες δυνατότητες. Ο πράκτορας ρωτά πρώτα τον ιστότοπο τι μπορεί να κάνει και ποιες παραμέτρους έχει κάθε ενέργεια, και μόνο μετά τις καλεί.
Έτσι στη συνομιλία λέω στο Claude «μετάφρασε τις συμβολοσειρές στα ελληνικά» και εκείνο διαβάζει το λεξικό, μεταφράζει και γράφει το αποτέλεσμα μόνο του. Δεν χρειάζεται να ανοίξω τον οπτικό επεξεργαστή του TranslatePress και να περιμένω την admin-ajax ουρά αιτημάτων.
Αυτόνομο επίπεδο: το δικό μου κλειδί Anthropic API
Η εργασία μέσω συνομιλίας σημαίνει ότι πρέπει να κάθομαι και να παρακολουθώ. Για να μπορεί ο ιστότοπος να μεταφράζει μόνος του, χωρίς πελάτη και χωρίς ανοιχτή συνεδρία MCP, πρόσθεσα στο πρόσθετο υποστήριξη του Anthropic API, με το δικό μου κλειδί (τη χρέωση την κάνει η Anthropic στον κάτοχο του κλειδιού). Υπάρχουν τρεις τρόποι να ξεκινήσει μια εκτέλεση:
- ένα κουμπί στις ρυθμίσεις του προσθέτου,
- μια εντολή WP-CLI:
wp trpab translate --lang=de_DE --dry-run, και μετά η ίδια χωρίς--dry-run; - η δυνατότητα
translate-via-apiή η ενσωματωμένη μηχανή «Claude (Anthropic API)» στην αυτόματη μετάφραση του TranslatePress.
Από προεπιλογή το πρόσθετο χρησιμοποιεί το μοντέλο claude-haiku-4-5 στέλνει 40 συμβολοσειρές ανά αίτημα και το πολύ 200 συμβολοσειρές ανά εκτέλεση. Στις ρυθμίσεις μπορούν να οριστούν γλωσσάριο και σημειώσεις ύφους, για παράδειγμα «γράφε Website και όχι Webseite». Το κλειδί μπορεί να βρίσκεται στο wp-config.php, σε μεταβλητή περιβάλλοντος ή κρυπτογραφημένο στη βάση δεδομένων. Η τελευταία επιλογή δεν εμφανίζει ποτέ ξανά το κλειδί.
Μοντέλο εμπιστοσύνης
Έστησα την εμπιστοσύνη έτσι ώστε ο πράκτορας να μπορεί να κάνει λάθη χωρίς μεγάλες συνέπειες:
- Δικαιώματα. Τα ίδια με του επεξεργαστή του TranslatePress (
manage_optionsαπό προεπιλογή). - Κατάσταση «μηχανική».
save-translationsαποθηκεύει μεταφράσεις με κατάσταση «μηχανική» και από προεπιλογή δεν αντικαθιστά ποτέ συμβολοσειρές που έχει ελέγξει άνθρωπος. - Δοκιμαστική εκτέλεση. Η εγγραφή, η διαγραφή και η μετάφραση μέσω API εκτελούνται από προεπιλογή ως δοκιμαστικές, δηλαδή δείχνουν τι θα γινόταν χωρίς να αλλάξουν τίποτα.
- Μόνο ο ίδιος ο ιστότοπος.
register-page-stringsζητά μόνο διευθύνσεις URL του δικού του τομέα. - Αντίγραφο ασφαλείας. Πριν από μαζικές λειτουργίες χρειάζεστε ένα αντίγραφο των
wp_trp_dictionary_*πινάκων.
Η αρχή είναι απλή: ο πράκτορας προτείνει και γράφει, ενώ εγώ ορίζω τους κανόνες, ελέγχω το αποτέλεσμα και παίρνω τις αποφάσεις.
Τι πήγε στραβά
Σκουπίδια στο λεξικό
Μόλις ο πράκτορας κατέγραψε την πρώτη σελίδα, το λεξικό γέμισε με πολύ περιττό υλικό:
- ονόματα εικονιδίων (
check_circle,gpp_bad,volunteer_activism). Πρόκειται για τη γραμματοσειρά Material Symbols, όπου ένα εικονίδιο ορίζεται ως κείμενο, και το πρόσθετο το πήρε τίμια για λέξεις, - κείμενο προτύπου του Divi όπως lorem ipsum και «Your content goes here»,
- δοκιμαστικές αναρτήσεις όπως «Hello world!»,
- η γραμμή που πληκτρολογείται στην κεφαλίδα: εμφανίζεται γράμμα προς γράμμα και κάθε ενδιάμεση έκδοση (
checking client-c.io … res,… resp,… respo) έγινε ξεχωριστή συμβολοσειρά, - αριθμοί και ζώνη ώρας όπως
18msκαιGMT+2.
Σε κάθε γλώσσα μαζεύτηκαν περίπου πενήντα τέτοιες συμβολοσειρές. Τις αφαίρεσα με κανονική έκφραση, πρώτα ως δοκιμαστική εκτέλεση που δείχνει ακριβώς τι θα διαγραφόταν, και μόνο μετά πραγματικά.
Όμως ο καθαρισμός του λεξικού αντιμετωπίζει μόνο το σύμπτωμα. Η αιτία είναι αλλού, γι' αυτό έκανα δύο πράγματα:
- πρόσθεσα στις εξαιρέσεις του προσθέτου τα στοιχεία που περιέχουν δυναμικό περιεχόμενο (
#tickerText,[data-count-to],.notranslate); - μετέφερα τα εικονίδια από το κείμενο στο CSS: αντί για μια λέξη στον κώδικα, το εικονίδιο σχεδιάζεται πλέον με
contentστο φύλλο στυλ. Το πρόσθετο δεν βλέπει αυτό το κείμενο, οπότε οι συμβολοσειρές δεν εμφανίζονται πια.
Τα αναγνωριστικά δεν είναι κοινά
Η ίδια αγγλική φράση έχει διαφορετικό αριθμό σε κάθε γλώσσα. Το ελληνικό λεξικό μου διέφερε από το γερμανικό κατά δεκάδες αναγνωριστικά. Αν εφαρμόσετε τη λίστα αναγνωριστικών μιας γλώσσας σε άλλη, η μετάφραση γράφεται σε λάθος συμβολοσειρές. Γι' αυτό ο πράκτορας παίρνει νέα λίστα για κάθε γλώσσα.
Η προσωρινή μνήμη δείχνει την παλιά σελίδα
Αποθήκευσα τις μεταφράσεις, άνοιξα τη σελίδα και είδα αγγλικά. Η αιτία ήταν η προσωρινή μνήμη του LiteSpeed, που σέρβιρε αποθηκευμένο αντίγραφο. Για να βεβαιωθώ ότι οι μεταφράσεις υπήρχαν, ζήτησα τη σελίδα με μια τυχαία παράμετρο στη διεύθυνση, που παρακάμπτει την προσωρινή μνήμη. Μετά τον καθαρισμό της προσωρινής μνήμης όλα μπήκαν στη θέση τους.
Οι σελίδες χωρίς αναρτήσεις δεν μεταφράζονται
Η κατηγορία «Off the Grid» είχε δημιουργηθεί αλλά δεν είχε ακόμη αναρτήσεις και η σελίδα της επέστρεφε σφάλμα 404. Οι συμβολοσειρές με το όνομά της εμφανίστηκαν στο λεξικό μόνο όταν η κατηγορία άρχισε να εμφανίζεται σε άλλες σελίδες.
Πού έκανε λάθη η ΤΝ
Αυτό είναι το πιο σημαντικό μέρος. Οι μεταφράσεις έμοιαζαν ρευστές, αλλά όταν τις ξαναδιάβασα προσεκτικά βρήκα πραγματικά λάθη.
Στα ελληνικά:
- μια ανύπαρκτη λέξη αντί για «ξεκίνησα» (στο κείμενο υπήρχε «Ύργισα» αντί για «Ξεκίνησα»),
- μια διατύπωση που σημαίνει «ιστότοποι που χάνονται εξαιτίας χάκερ» αντί για «ιστότοποι που παραβιάζονται»,
- τα στοιχεία λίστας τελείωναν με το σύμβολο «;». Στα ελληνικά αυτό είναι ερωτηματικό, οπότε η λίστα διαβαζόταν σαν αλυσίδα ερωτήσεων,
- η λέξη «πρόγραμμα» αντί για «εταιρεία» εκεί που εννοούνταν ένα πρακτορείο,
- αρκετά τυπογραφικά λάθη και λάθη συμφωνίας.
Στα ουκρανικά: μια λέξη περιείχε το λατινικό γράμμα i μέσα σε κυριλλικούς χαρακτήρες. Δεν φαίνεται με το μάτι, αλλά η αναζήτηση κειμένου δεν θα βρει μια τέτοια λέξη.
Διόρθωσα περίπου τριάντα ελληνικές συμβολοσειρές και μία ουκρανική. Τα γερμανικά δεν τα ξαναδιάβασα με το χέρι και αυτό είναι ένα ειλικρινές αδύνατο σημείο.
Το συμπέρασμα: μια μετάφραση από ΤΝ κάνει ως πρόχειρο, όχι ως τελικό αποτέλεσμα. Αυτό ισχύει ιδιαίτερα για γλώσσες που δεν διαβάζετε οι ίδιοι.
Πώς ελέγχω την ποιότητα
- Κατάσταση συμβολοσειράς. Κάθε μετάφραση αποθηκεύεται με κατάσταση «μηχανική». Οι συμβολοσειρές που έχει ελέγξει άνθρωπος παίρνουν την κατάσταση «ελεγμένη» και ο πράκτορας τις αφήνει από προεπιλογή ήσυχες.
- Δοκιμαστική εκτέλεση. Κάθε μαζική ενέργεια, ιδίως η διαγραφή, εκτελείται πρώτα σε λειτουργία που δεν αλλάζει τίποτα και δείχνει μόνο μια λίστα.
- Φυσικός ομιλητής. Για γλώσσες που δεν ξέρετε χρειάζεστε τουλάχιστον έναν αναγνώστη. Για τα ελληνικά αυτό είναι το βήμα που θα έκανα νωρίτερα την επόμενη φορά.
- Έλεγχος της ζωντανής σελίδας. Δεν εμπιστεύομαι μια εγγραφή στο λεξικό μέχρι να δω τη μετάφραση στη ζωντανή σελίδα, με παρακαμμένη την προσωρινή μνήμη.
Τι να ελέγξετε πριν το επαναλάβετε
- Άδεια και όροι. Το πρόσθετό μου είναι φτιαγμένο για το δωρεάν TranslatePress και λειτουργεί μέσω του δικού του επιπέδου ερωτημάτων. Οι επί πληρωμή εκδόσεις και τα πρόσθετα μπορεί να έχουν δικούς τους όρους χρήσης, γι' αυτό διαβάστε τους πριν συνδέσετε πράκτορα ΤΝ σε αυτά και ρωτήστε την υποστήριξη αν έχετε αμφιβολίες.
- Σε ποιον ανήκουν τα κείμενα. Οι συμβολοσειρές πάνε σε ένα μοντέλο. Για τον δικό σας ιστότοπο αυτό είναι εντάξει, αλλά δεν πρέπει να στέλνετε κείμενα πελατών με αυτόν τον τρόπο χωρίς συγκατάθεση.
- Ποιος πληρώνει. Με το API κάθε εκτέλεση χρεώνεται στο κλειδί σας. Ξεκινήστε με δοκιμαστική εκτέλεση: δείχνει πόσες συμβολοσειρές και πόσα tokens θα χρειαστούν.
- Αντίγραφο ασφαλείας. Πριν από μαζικές λειτουργίες κάντε αντίγραφο των πινάκων του λεξικού.
Σύνοψη
Σε μία μέρα μετέφρασα την ανάρτηση, τη διεπαφή και τις κατηγορίες σε τρεις γλώσσες και έβαλα σε τάξη το λεξικό. Με το χέρι θα είχε πάρει πολύ περισσότερο χρόνο.
Το κύριο αποτέλεσμα όμως είναι άλλο. Ο πράκτορας επιταχύνει τη ρουτίνα, ενώ η ευθύνη για την ακρίβεια μένει στον άνθρωπο. Χωρίς έλεγχο, μια λέξη που δεν υπάρχει θα είχε μείνει στο ελληνικό κείμενο.
Ας συνεργαστούμε
Αν χρειάζεστε έναν πολύγλωσσο ιστότοπο WordPress, βοήθεια με το TranslatePress ή έναν προσεκτικό τρόπο να φέρετε την ΤΝ σε τέτοιες διαδικασίες χωρίς να χάσετε ποιότητα, επικοινωνήστε μαζί μου. Απαντώ γρήγορα και χωρίς περιττές κλήσεις.