Ιστορικό¶
Αυτή η βιβλιοθήκη στέκεται στο σημείο συνάντησης δύο μακριών ιστοριών — μίας για το πώς μεταφράζεται το λογισμικό και μίας για το πώς η Python παρεμβάλλει τιμές σε συμβολοσειρές — που επιτέλους διασταυρώθηκαν το 2025 και μετά σταμάτησαν ακριβώς στο σημείο όπου χρειαζόταν μια μικρή, προσεκτική σύμβαση. Αυτή η σελίδα αφηγείται και τις δύο ιστορίες, με παραπομπές στις πηγές, γιατί οι σχεδιαστικές αποφάσεις αυτού του ιστότοπου κρίνονται ευκολότερα όταν βλέπετε τα ερωτήματα στα οποία απαντούν.
Το οικοσύστημα του gettext¶
Το GNU gettext είναι ο τρόπος με τον οποίο μεταφράζεται το ελεύθερο
λογισμικό από τα μέσα της δεκαετίας του 1990: επισήμανε τις συμβολοσειρές
στον κώδικα, εξήγαγέ τις σε ένα πρότυπο, δώσε στους μεταφραστές ένα αρχείο
καταλόγου ανά γλώσσα, μεταγλώττισε, φόρτωσε κατά την εκτέλεση. Γύρω από
αυτόν τον βρόχο αναπτύχθηκε ένα ολόκληρο οικοσύστημα — επεξεργαστές PO, ροές
αναθεώρησης και πλατφόρμες μετάφρασης που όλες μιλούν την ίδια μορφή αρχείου
— και η Python περιλαμβάνει ένα άρθρωμα gettext στην
τυπική της βιβλιοθήκη για περισσότερες από δύο δεκαετίες. Το κομμάτι του
χρόνου εκτέλεσης δεν ήταν ποτέ το πρόβλημα.
Το άλυτο κομμάτι ήταν πάντα το πώς μοιάζει η συμβολοσειρά του καταλόγου.
Ένα μήνυμα %(name)s παραδίδει στους μεταφραστές σύνταξη printf που ένα
διαγραμμένο γράμμα μετατρέπει σε κατάρρευση στην παραγωγή· ένα μήνυμα
.format() παραδίδει στον κατάλογο πρόσβαση σε ιδιότητες ζωντανών
αντικειμένων. (Το Γιατί t-strings εξετάζει και τα δύο, με
τις αποτυχίες σε κοινή θέα.) Και τα f-strings — η σύνταξη που προτιμά πλέον
ο περισσότερος κώδικας Python — δεν μπορούν να συμμετάσχουν καθόλου: μέχρι
να τα δει οποιαδήποτε βιβλιοθήκη, είναι ήδη μια τελειωμένη συμβολοσειρά. Ο
κόσμος προσπαθεί παρ' όλα αυτά, αρκετά συχνά ώστε ο ιχνηλάτης σφαλμάτων του
Babel να συλλέγει τις απόπειρες (#594, #715)· η
αποτυχία είναι δομική, όχι ένα χαρακτηριστικό που λείπει.
Δύο PEP, με δέκα χρόνια απόσταση¶
Το 2015, η Alyssa Coghlan και ο Nick Humrich έγραψαν το PEP 501, προτείνοντας πρότυπα παρεμβολής των οποίων το πρώτο δηλωμένο κίνητρο ήταν το i18n — «providing a cleaner syntax for i18n translation», με τα λόγια του ίδιου του PEP. Η πρόταση αναβλήθηκε, εν μέρει επειδή η συζήτηση έδειξε ότι η περίπτωση του i18n κουβαλούσε σημαντικές πρόσθετες παραμέτρους που απλούστερες περιπτώσεις χρήσης δεν είχαν.
Μια δεκαετία αργότερα, το PEP 750 — από τους Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, Lysandros Nikolaou και Dave Peck — αναβίωσε την ιδέα ως t-strings, έγινε αποδεκτό τον Απρίλιο του 2025 και κυκλοφόρησε με την Python 3.14 τον Οκτώβριο του 2025. Το PEP 501 αποσύρθηκε τότε υπέρ του. Μία λεπτομέρεια έχει σημασία για αυτή τη σελίδα: το i18n δεν είναι ανάμεσα στα δηλωμένα κίνητρα του PEP 750. Το PEP γενίκευσε τον μηχανισμό — έναν τύπο προτύπου που μπορεί να καταναλώσει οποιαδήποτε βιβλιοθήκη — και άφησε το ζήτημα της μετάφρασης ακριβώς εκεί όπου το είχε σταθμεύσει το PEP 501 δέκα χρόνια νωρίτερα: ανοιχτό.
Έτσι, από την Python 3.14, η γλώσσα είχε ακριβώς τη δομή δεδομένων που χρειάζεται ένας κατάλογος μηνυμάτων, και καμία σύμβαση για τη χρήση της ως τέτοιας.
Η συζήτηση για την τυπική βιβλιοθήκη¶
Δύο μήνες πριν κυκλοφορήσει η 3.14, ο Adrian Mönnich (ThiefMaster,
συντηρητής του έργου Indico) πρότεινε να κλείσει αυτό το κενό μέσα στην ίδια
την τυπική βιβλιοθήκη: το νήμα
Support t-strings in gettext στο discuss.python.org, που
άνοιξε τον Αύγουστο του 2025, ήρθε με ένα λειτουργικό
pull request που πρόσθετε υποστήριξη t-strings τόσο στο
gettext όσο και στο pygettext.
Το νήμα αξίζει να διαβαστεί ολόκληρο, γιατί αναδεικνύει κάθε δύσκολο ερώτημα στο οποίο αυτή η βιβλιοθήκη χρειάστηκε αργότερα να απαντήσει:
- Τι επιτρέπεται να είναι μια παρεμβολή; Μόνο ένα απλό όνομα, ή και ιδιότητες και κλήσεις με παράγωγο όνομα συμβόλου κράτησης θέσης; Κάθε απάντηση ανταλλάσσει ευκολία με σταθερότητα msgid και ασφάλεια καταλόγου.
- Τι απαιτούν οι μορφές πληθυντικού, όταν το σύστημα πληθυντικού της γλώσσας-στόχου διαφέρει από της πηγαίας;
- Είναι καν το gettext ο σωστός στόχος; Ο Barry Warsaw — που κατά την
ανάπτυξη του PEP 750 είχε υποστηρίξει ότι τα t-strings δεν ταιριάζουν στο
i18n — έδειξε το δικό του
flufl.i18nκαι το στυλ συμβολοσειρών$ως το φιλικότερο εργαλείο· άλλοι υποστήριξαν την πλήρη εγκατάλειψη του gettext υπέρ νεότερων συστημάτων όπως το Fluent. - Και το μεταερώτημα: ό,τι κι αν κυκλοφορήσει η τυπική βιβλιοθήκη, ουσιαστικά δεν μπορεί να αλλάξει ποτέ. Μια σύμβαση με τόσα ανοιχτά ζητήματα είναι επικίνδυνο πράγμα να παγώσει με την πρώτη προσπάθεια.
Συναίνεση δεν διαμορφώθηκε. Το ζήτημα στο CPython έκλεισε ως «not planned» και το pull request έκλεισε χωρίς συγχώνευση τον Οκτώβριο του 2025, λίγες μέρες μετά την κυκλοφορία της 3.14. Η δυνατότητα υπήρχε στη γλώσσα· η σύμβαση δεν είχε σπίτι.
Γιατί πρώτα ένα πακέτο¶
Αυτό είναι το κενό που αυτό το έργο επέλεξε να καλύψει έξω από την τυπική βιβλιοθήκη, με ένα συνειδητό στοίχημα: μια σύμβαση ωριμάζει γρηγορότερα εκεί όπου μπορεί να εκδίδεται ελεύθερα και να κερδίζει την υιοθέτηση περίπτωση την περίπτωση, και η τυπική βιβλιοθήκη — που πρέπει να είναι σωστή με την πρώτη — είναι εκεί όπου μια σύμβαση πρέπει να καταλήξει, όχι εκεί όπου πρέπει να επεξεργαστεί.
Συγκεκριμένα, κάθε αμφισβητούμενο ερώτημα του νήματος έχει εδώ μια γραπτή απάντηση, το καθένα στη δική του σελίδα:
- Οι παρεμβολές είναι μόνο απλά ονόματα, ώστε τα msgid να μένουν σταθερά και ουσιαστικά — ο οδηγός δείχνει τον κανόνα, το Πώς λειτουργεί τους λόγους.
- Η μορφοποίηση μένει εντελώς έξω από τον κατάλογο (Γιατί t-strings).
- Οι πληθυντικοί ακολουθούν έναν κανόνα ένωσης/τομής που επιτρέπει στο σύστημα πληθυντικού μιας γλώσσας-στόχου να διαφέρει από της πηγαίας (spec §4).
- Ένας χαλασμένος κατάλογος υποχωρεί αντί να καταρρεύσει, τηρώντας το ίδιο το συμβόλαιο του gettext (ο οδηγός).
- Και ολόκληρη η σύμβαση είναι μια εκδοσιοποιημένη προδιαγραφή με μηχανικά αναγνώσιμη σουίτα συμμόρφωσης — γραμμένη έτσι ώστε μια άλλη υλοποίηση, συμπεριλαμβανομένης μιας μελλοντικής στην τυπική βιβλιοθήκη, να μπορεί να την υιοθετήσει αναλλοίωτη και να διαλειτουργεί.
Η συζήτηση δεν έχει τελειώσει, και αυτό το έργο είναι συμμέτοχος σε αυτήν, όχι ετυμηγορία πάνω της. Αν έχετε εμπειρία gettext από την παραγωγή που αφορά αυτές τις επιλογές, το ίδιο νήμα και τα Discussions αυτού του αποθετηρίου είναι τα μέρη όπου συνεχίζεται η συζήτηση.
Χρονολόγιο¶
| Πότε | Τι συνέβη |
|---|---|
| μέσα δεκαετίας 1990 | Το GNU gettext καθιερώνει τη ροή εργασίας PO/POT/MO που μεταφραστές και πλατφόρμες μιλούν ακόμη. |
| 2015 | Το PEP 501 προτείνει πρότυπα παρεμβολής, με το i18n ως πρώτο του κίνητρο· αναβάλλεται. |
| 2016 | Τα f-strings κυκλοφορούν με την Python 3.6 — η παρεμβολή αποκτά τη σύνταξή της, και η μετάφραση δεν μπορεί να τη χρησιμοποιήσει. |
| Ιούλ 2024 | Το PEP 750 προτείνει τα t-strings. |
| Απρ 2025 | Το PEP 750 γίνεται αποδεκτό· το PEP 501 αποσύρεται υπέρ του. |
| Αύγ 2025 | Ανοίγει το νήμα Support t-strings in gettext, με ένα pull request για την τυπική βιβλιοθήκη. |
| Οκτ 2025 | Η Python 3.14 κυκλοφορεί με t-strings· το ζήτημα της τυπικής βιβλιοθήκης κλείνει ως not planned. |
| 2026 | Το gettext-tstrings κυκλοφορεί ως alpha, με το spec v1 και τη σουίτα συμμόρφωσής του. |