Πώς να Μεταφράσετε αρχεία XLIFF (Drupal, Symfony, Angular, iOS)

Μια προγραμματίστρια Drupal δημοσίευσε στο Stack Overflow την περασμένη εβδομάδα μια ιστορία που εκτυλίσσεται χιλιάδες φορές το χρόνο σε ομάδες τοπικής προσαρμογής επιχειρήσεων. Η ομάδα της εξήγαγε ένα αρχείο XLIFF 40MB από τον ιστότοπό τους στο Drupal. Το άνοιξε σε έναν επεξεργαστή κειμένου, επικόλλησε κομμάτια στο Google Translate, συναρμολόγησε ξανά το αρχείο, το εισήγαγε πίσω στο Drupal - και οι μισές σελίδες αρνήθηκαν να εμφανιστούν επειδή οι μεταφρασμένες συμβολοσειρές περιείχαν λανθασμένο XML, χαρακτήρες διαφυγής σε λάθος σημεία και χαλασμένες ετικέτες <g> όπου είχε καταστραφεί η ενσωματωμένη μορφοποίηση.
Το XLIFF είναι το πρότυπο τοπικής προσαρμογής επιχειρήσεων για έναν λόγο. Βασίζεται σε XML, είναι ανεξάρτητο από εργαλεία και υποστηρίζει τα πλούσια μεταδεδομένα που χρειάζονται σοβαρά μεταφραστικά έργα: καταστάσεις μετάφρασης, εναλλακτικές μεταφράσεις, σημειώσεις μεταξύ μεταφραστών και προγραμματιστών και δομημένο ενσωματωμένο σήμα (markup). Ωστόσο, η ίδια του η ευελιξία το καθιστά εύκολο να καταστραφεί, και τα εργαλεία που χειρίζονται με ασφάλεια αρχεία .po συχνά αποτυγχάνουν στο XLIFF.
Αυτός ο οδηγός εξηγεί τι κάνει το XLIFF να ξεχωρίζει, γιατί οι γενικές προσεγγίσεις μετάφρασης το καταστρέφουν και τον σωστό τρόπο μετάφρασης αρχείων XLIFF για Drupal, Symfony, Angular και iOS – τις τέσσερις πλατφόρμες όπου το XLIFF χρησιμοποιείται πιο συχνά το 2026.
Τι είναι το XLIFF (και γιατί το χρησιμοποιούν οι ομάδες επιχειρήσεων)
Το XLIFF σημαίνει XML Localization Interchange File Format (Μορφή αρχείου ανταλλαγής τοπικής προσαρμογής XML). Είναι ένα πρότυπο OASIS σχεδιασμένο ειδικά για τη μεταφορά μεταφραστικού περιεχομένου μεταξύ εργαλείων – συστημάτων διαχείρισης περιεχομένου, βάσεων δεδομένων μεταφραστικής μνήμης, εργαλείων CAT και πλατφορμών τοπικής προσαρμογής. Σε αντίθεση με τα αρχεία Gettext .po (τα οποία αποθηκεύουν απλά ζεύγη κλειδιών-τιμών) ή τα αρχεία τοπικής προσαρμογής JSON (τα οποία φωλιάζουν αυθαίρετα), το XLIFF είναι ένα δομημένο έγγραφο XML με ένα τυποποιημένο σχήμα.
XLIFF 1.2 έναντι XLIFF 2.0
Δύο εκδόσεις υπάρχουν σε χρήση και δεν είναι πλήρως συμβατές.
Το XLIFF 1.2 είναι η παλαιότερη, πιο διαδεδομένη έκδοση. Χρησιμοποιεί στοιχεία <trans-unit> για την περικύκλωση μεταφράσιμου περιεχομένου, με παιδιά <source> και <target>. Η ενσωματωμένη μορφοποίηση χρησιμοποιεί ζευγαρωτές ετικέτες <g>, <x> και <bpt> / <ept>. Το εργαλείο Translation Management Tool του Drupal και πολλές παλαιότερες πλατφόρμες εξακολουθούν να εξάγουν την έκδοση 1.2.
Το XLIFF 2.0 είναι η αναθεώρηση του 2014, απλούστερη και καθαρότερη. Χρησιμοποιεί <unit> και <segment> με <source> και <target>. Το ενσωματωμένο σήμα χρησιμοποιεί <pc> (paired code) και <ph> (placeholder). Το μεταφραστικό στοιχείο του Symfony και οι σύγχρονες εξαγωγές iOS προτιμούν από προεπιλογή την έκδοση 2.0.
Ένα μεταφραστικό εργαλείο που χειρίζεται την έκδοση 1.2 δεν χειρίζεται αυτόματα την έκδοση 2.0. Τα λεξιλόγια των ετικετών είναι διαφορετικά και οι κανόνες διαφυγής διαφέρουν ελαφρώς. Πάντα να ελέγχετε ποια έκδοση εξάγει η πλατφόρμα σας πριν επιλέξετε μια διαδικασία μετάφρασης.
Η Ανατομία μιας μονάδας XLIFF
Μια ελάχιστη μονάδα μετάφρασης XLIFF 1.2 μοιάζει με αυτήν:
<trans-unit id="msg_welcome" datatype="plaintext">
<source>Welcome, <g id="1">%name%</g>!</source>
<target state="needs-translation">Welcome, <g id="1">%name%</g>!</target>
<note>Displayed on the homepage after login</note>
</trans-unit>
Το <g id="1"> περιβάλλει μια μεταβλητή placeholder. Το χαρακτηριστικό state ενημερώνει την πλατφόρμα ότι αυτή η συμβολοσειρά χρειάζεται μετάφραση. Το <note> είναι μια υπόδειξη για τον προγραμματιστή. Ένας μεταφραστής που κατανοεί το XLIFF θα πρέπει να παράγει:
<target state="translated">¡Bienvenido, <g id="1">%name%</g>!</target>
Ένας μεταφραστής που αντιμετωπίζει το αρχείο ως απλό κείμενο μπορεί να παράγει οποιαδήποτε από αυτές τις χαλασμένες παραλλαγές:
<target>¡Bienvenido, <g id="1">%nombre%</g>!</target>
<target>¡Bienvenido, <g id="1">%name%</g>!</target>
<target>¡Bienvenido, %name%!</target>
Καθένα από αυτά χαλάει την εισαγωγή με διαφορετικό τρόπο. Το πρώτο μετονομάζει τη μεταβλητή. Το δεύτερο διαφεύγει το XML. Το τρίτο απορρίπτει εντελώς την ετικέτα μορφοποίησης.
Κακές Λύσεις (Γιατί δεν μπορείτε απλά να μεταφράσετε XML)
Οι περισσότερες ομάδες ξεκινούν με τις ίδιες τρεις προσεγγίσεις και χάνουν αρκετές ημέρες πριν τα παρατήσουν.
Τροφοδοτώντας το XLIFF σε μια Γενική AI
Αντιγράψτε το αρχείο, επικολλήστε το σε Claude ή ChatGPT, ζητήστε μετάφραση. Το μοντέλο συνήθως κάνει μια λογική δουλειά με το κείμενο, αλλά χειρίζεται τις ετικέτες XLIFF ασυνεπώς. Μερικές φορές διατηρεί τις ετικέτες <g>, μερικές φορές μεταφράζει το χαρακτηριστικό id, μερικές φορές τις αφαιρεί εντελώς. Η επικύρωση αποτυγχάνει. Η εισαγωγή σας εμφανίζει σφάλματα ανάλυσης XML.
Χρήση εργαλείου CAT χωρίς υποστήριξη XLIFF
Εργαλεία όπως το Poedit είναι κατασκευασμένα για τη μορφή .po. Μπορεί να ανοίξουν αρχεία XLIFF αλλά τα αντιμετωπίζουν ως ένα γενικό δοχείο κειμένου. Οι ενσωματωμένες ετικέτες δεν είναι κλειδωμένες. Οι κρατούμενες θέσεις (placeholders) δεν προστατεύονται. Παίρνετε μια μετάφραση που φαίνεται εντάξει στον επεξεργαστή αλλά αποτυγχάνει στην επικύρωση σχήματος κατά την εισαγωγή.
Συγγραφή Προσαρμοσμένου Σεναρίου
Η ομάδα σας γράφει ένα σενάριο Node ή Python που αναλύει το XLIFF με xml2js, εξάγει τις αρχικές συμβολοσειρές, καλεί το Google Translate και επανεγγράφει τους στόχους. Λειτουργεί για το 90% των συμβολοσειρών. Το άλλο 10% – συμβολοσειρές με ενσωματωμένη μορφοποίηση, πληθυντικούς ομάδες ή ειδικούς χαρακτήρες – χαλάει με τρόπους που εμφανίζονται μόνο αφού έχετε ήδη κυκλοφορήσει.
Ο ίδιος τρόπος αποτυχίας «ευέλικτη μορφή συναντά αφελής μεταφραστής» επηρεάζει αρχεία i18next JSON και Gettext .po. Ο οδηγός μας για τη μετάφραση αρχείων i18next JSON για React και Next.js και η ανάρτησή μας για το πώς να μεταφράσετε αρχεία .po χωρίς να χαλάσετε τις μεταβλητές κώδικα καλύπτουν τα παράλληλα προβλήματα για αυτές τις μορφές.
Ο Σωστός Τρόπος: Επεξεργασία XLIFF με επίγνωση της σύνταξης
Μια σωστή διαδικασία μετάφρασης XLIFF ακολουθεί τις ίδιες αρχές με τον μηχανισμό PO μας, προσαρμοσμένες για XML.
Ανάλυση, όχι Κανονικές Εκφράσεις
Αντιμετωπίστε το XLIFF ως ένα δομημένο έγγραφο. Αναλύστε το με έναν πραγματικό αναλυτή XML, δημιουργήστε ένα δέντρο και περιηγηθείτε στα στοιχεία <trans-unit> (ή <unit> για 2.0). Η προσπάθεια αντιστοίχισης περιεχομένου πηγής και στόχου με κανονικές εκφράσεις είναι ο γρήγορος δρόμος προς τα κατεστραμμένα αρχεία.
Κλείδωμα Ενσωματωμένων Ετικετών πριν τη Μετάφραση
Κάθε <g>, <x>, <bpt>, <ept>, <ph>, <pc> μέσα σε ένα <source> πρέπει να διατηρείται κατά θέση και χαρακτηριστικό id. Αντικαταστήστε τα με αριθμητικά placeholders πριν στείλετε το κείμενο στο LLM, και στη συνέχεια επανεισαγάγετε τις αρχικές ετικέτες με τα χαρακτηριστικά τους αφού επιστρέψει η μετάφραση.
Σεβασμός της μηχανής καταστάσεων
Οι μονάδες XLIFF έχουν χαρακτηριστικά κατάστασης: new, needs-translation, translated, reviewed, final, signed-off. Μια διαδικασία θα πρέπει να μεταφράζει μόνο μονάδες σε κατάσταση new ή needs-translation, και να ορίζει την κατάσταση εξόδου σε translated (όχι final – ένας επιθεωρητής θα πρέπει ακόμα να επαληθεύσει).
Διατήρηση Δομής πέρα από τις Μονάδες Μετάφρασης
Τα αρχεία XLIFF περιέχουν κεφαλίδες, μεταδεδομένα, χαρακτηριστικά επιπέδου αρχείου, σημειώσεις και εναλλακτικές μεταφράσεις (<alt-trans>). Αυτά πρέπει να παραμείνουν αμετάβλητα καθ' όλη τη διάρκεια της διπλής διαδρομής. Η αφαίρεση ή η αναδιάταξή τους χαλάει τη συμβατότητα διπλής διαδρομής με την πλατφόρμα πηγής.
Επικύρωση πριν την Παράδοση
Πριν την επιστροφή μεταφρασμένου XLIFF, επικυρώστε έναντι του σχήματος. Το XLIFF 1.2 έχει επίσημο XSD. Το XLIFF 2.0 έχει το δικό του. Ένα εργαλείο που δεν μπορεί να αυτο-επικυρωθεί είναι ένα εργαλείο που θα σας παραδώσει χαλασμένα αρχεία.
Σημειώσεις ανά Πλατφόρμα
Κάθε κύρια πλατφόρμα που χρησιμοποιεί XLIFF έχει ιδιομορφίες που αξίζει να γνωρίζετε.
Drupal
Το Translation Management Tool (TMGMT) του Drupal εξάγει XLIFF 1.2. Οι τύποι περιεχομένου περιλαμβάνουν κόμβους (σελίδες, άρθρα), όρους ταξινόμησης και διαμόρφωση. Το TMGMT περιβάλλει κάθε μεταφράσιμο πεδίο σε μια ξεχωριστή <trans-unit> με μορφή ID ειδική για το Drupal (fieldname:delta:format).
Προσοχή: Το Drupal αποθηκεύει πληροφορίες μορφής κειμένου (φιλτραρισμένο HTML, πλήρες HTML, απλό κείμενο) μαζί με το περιεχόμενο. Η μετάφραση πρέπει να διατηρεί το σήμα HTML όταν το επιτρέπει η μορφή, να αφαιρεί το απλό κείμενο όταν η μορφή δεν το επιτρέπει. Η διαδικασία σας χρειάζεται επίγνωση ανά πεδίο.
Symfony
Το μεταφραστικό στοιχείο του Symfony χρησιμοποιεί XLIFF 2.0 από προεπιλογή (από το Symfony 4). Οι συμβολοσειρές βρίσκονται στα translations/messages.xx.xliff. Το Symfony υποστηρίζει τη μορφή μηνυμάτων ICU μέσα στο XLIFF, πράγμα που σημαίνει ότι μια ενιαία μονάδα μπορεί να περιέχει δομές {count, plural, one {...} other {...}}.
Προσοχή: Οι πληθυντικές κατηγορίες ICU μέσα στο XLIFF χρειάζονται διπλή προστασία. Οι ετικέτες XML παραμένουν ανέπαφες, ΚΑΙ οι λέξεις-κλειδιά ICU (plural, one, other, =0) δεν πρέπει να μεταφραστούν. Πολλά εργαλεία XLIFF χειρίζονται ένα επίπεδο αλλά όχι και τα δύο.
Angular i18n
Το Angular εξάγει XLIFF 1.2 ή 2.0 μέσω της εντολής ng extract-i18n. Τα αρχεία περιέχουν συμβολοσειρές προτύπων συστατικών, με ετικέτες <x> που αντιπροσωπεύουν εκφράσεις Angular και παρεμβολές όπως {{ count }}.
Προσοχή: Το Angular χρησιμοποιεί συγκρούσεις hash id σε πανομοιότυπες αρχικές συμβολοσειρές. Μια μετάφραση πρέπει να διατηρεί ακριβώς τα αναγνωριστικά μονάδων, αλλιώς το Angular δεν μπορεί να τα αντιστοιχίσει κατά την εισαγωγή. Η μετονομασία των χαρακτηριστικών id κατά την επεξεργασία είναι άμεση βλάβη.
iOS (Εξαγωγή Xcode)
Το Xcode εξάγει XLIFF 1.2 για την τοπική προσαρμογή εφαρμογών μέσω Product > Export Localizations. Οι συμβολοσειρές προέρχονται από αρχεία Localizable.strings, καταχωρήσεις Info.plist, storyboards και XIBs. Οι κανόνες πληθυντικού του iOS βρίσκονται σε αρχεία .stringsdict που εξάγονται ως πρόσθετες μονάδες μετάφρασης.
Προσοχή: Οι συμβολοσειρές storyboard του iOS αναφέρονται σε αναγνωριστικά στοιχείων UI. Αυτά δεν πρέπει να αλλοιωθούν. Επίσης, το Xcode απαιτεί το χαρακτηριστικό target-language να ταιριάζει ακριβώς με την αναμενόμενη μορφή τοπικής ρύθμισης (es, όχι es-ES, σε ορισμένα περιβάλλοντα) αλλιώς αγνοεί σιωπηλά την εισαγωγή.
Μετάφραση XLIFF με το SimplePoTranslate
Το SimplePoTranslate υποστηρίζει XLIFF στα προγράμματα Pro και Lifetime. Η ροή εργασίας είναι η ίδια με αυτή για τα αρχεία .po.
1. Εξαγωγή του XLIFF σας
Από την πλατφόρμα πηγής σας, εξάγετε ένα ή περισσότερα αρχεία .xliff. Για το Drupal, χρησιμοποιήστε την ενέργεια εξαγωγής του TMGMT. Για το Symfony, βρείτε το translations/messages.en.xliff. Για το Angular, εκτελέστε ng extract-i18n --format=xlf2. Για το Xcode, χρησιμοποιήστε την εξαγωγή Localization.
2. Ανέβασμα στο SimplePoTranslate
Σύρετε το αρχείο στον πίνακα εργαλείων. Η πλατφόρμα ανιχνεύει αυτόματα την έκδοση XLIFF (1.2 ή 2.0), αναλύει τη δομή και αναγνωρίζει τις μεταφράσιμες μονάδες. Επιλέξτε τη γλώσσα-στόχο και τον τόνο σας.
3. Μετάφραση με Επίγνωση Σύνταξης
Οι ενσωματωμένες ετικέτες, οι παράμετροι ICU, οι κρατούμενες θέσεις (placeholders) και τα αναγνωριστικά μονάδων κλειδώνονται πριν τη μετάφραση. Ο υποκείμενος μηχανισμός AI βλέπει μόνο καθαρό κείμενο με περιβάλλον. Το μεταφρασμένο κείμενο επανεισάγεται στην ακριβή αρχική δομή, οι καταστάσεις ενημερώνονται και το αρχείο επικυρώνεται έναντι του σχήματος XLIFF πριν την παράδοση.
4. Λήψη και Εισαγωγή
Κατεβάστε το μεταφρασμένο XLIFF (συν τα ισοδύναμα .po, .json και .php αν χρειάζεστε διαπλατφορμική συμβατότητα). Εισάγετε στην πλατφόρμα πηγής σας. Επικυρώστε εμφανίζοντας μερικές μεταφρασμένες σελίδες ή προβολές πριν την κυκλοφορία.
# Angular example
ng extract-i18n --format=xlf2 --output-path=src/locale
# upload src/locale/messages.xlf to SimplePoTranslate
# download messages.es.xlf
# reference in angular.json i18n configuration
ng build --localize
5. Ενσωμάτωση στο CI
Μόλις εμπιστευτείτε τη διαδικασία, αυτοματοποιήστε την. Εξάγετε XLIFF σε κάθε έκδοση, υποβάλετε μέσω API, κατεβάστε μεταφρασμένα αρχεία, κάντε commit στο repo, αναπτύξτε. Αυτό είναι το ίδιο φιλικό προς το CI μοτίβο που χρησιμοποιούν πολλά πρακτορεία για τη μετάφραση .po του WordPress – δείτε την ανάρτησή μας για τη μετάφραση cloud χωρίς χαλασμένους ιστότοπους για το αρχιτεκτονικό μοτίβο.
Συνδυάζοντας τα Όλα Μαζί
Το XLIFF είναι το σωστό εργαλείο για σοβαρές εργασίες τοπικής προσαρμογής – δομημένο, ανεξάρτητο από εργαλεία και αρκετά πλούσιο για να μεταφέρει μεταδεδομένα έργου σε όλα τα συστήματα. Όμως η δομή XML του είναι επίσης εύθραυστη. Κάθε ετικέτα, χαρακτηριστικό και τιμή κατάστασης έχει σημασιολογικό βάρος, και ένας μεταφραστής που δεν κατανοεί το XLIFF ως μορφή θα καταστρέψει το αρχείο σας με τρόπους που μπορεί να μην εμφανιστούν μέχρι να αποτύχει η εισαγωγή ή ένας χρήστης να αναφέρει χαλασμένο UI.
Η ασφαλής προσέγγιση έχει επίγνωση της σύνταξης: αναλύστε το XML, κλειδώστε τα δομικά στοιχεία, μεταφράστε μόνο τις επιφάνειες κειμένου με περιβάλλον, επικυρώστε έναντι του σχήματος πριν την παράδοση. Αυτό ισχύει είτε παραδίδετε έναν ιστότοπο Drupal, ένα API Symfony, μια SPA Angular ή μια εφαρμογή iOS. Η πλατφόρμα διαφέρει, αλλά η πειθαρχία του XLIFF όχι.
Είστε έτοιμοι να μεταφράσετε αρχεία XLIFF για Drupal, Symfony, Angular ή iOS χωρίς χαλασμένες ετικέτες; Δοκιμάστε το SimplePoTranslate δωρεάν - δεν απαιτείται πιστωτική κάρτα. Ανεβάστε
.xliff, κατεβάστε ασφαλείς μεταφράσεις, εισάγετε στην πλατφόρμα σας.