Μετάβαση στο περιεχόμενο

Μεταφράστε πλήρη μηνύματα
με t-strings της Python

Το gettext-tstrings συνδέει τα t-strings της Python 3.14+ με τους τυπικούς καταλόγους gettext και τα εργαλεία του Babel. Οι τιμές και η μορφοποίηση μένουν στον κώδικα της εφαρμογής· οι μεταφραστές δουλεύουν με πλήρη μηνύματα και απλά σύμβολα κράτησης θέσης {name}:

import gettext

from gettext_tstrings import Translator

_ = Translator(gettext.translation("messages", localedir="locales"))
name = "Ada"
print(_(t"Hello {name}"))  # with a Japanese catalog: こんにちは Ada

Ο κατάλογος περιέχει το Hello {name}. Μια μετάφραση μπορεί να μετακινήσει ή να επαναλάβει το {name}. Αν το παραλείψει, το μετονομάσει ή το ξαναμορφοποιήσει, η επικύρωση του καταλόγου αναφέρει το σφάλμα. Αν μια άκυρη καταχώριση φτάσει παρ' όλα αυτά στην παραγωγή, η βιβλιοθήκη καταγράφει μια προειδοποίηση και αποδίδει το πηγαίο μήνυμα αντί να καταρρεύσει.

Ξεκινήστε την πεντάλεπτη εκμάθηση Συγκρίνετε τις εναλλακτικές

Alpha · Python 3.14+ · τυπικοί κατάλογοι PO/MO · χωρίς εξαρτήσεις τρίτων κατά την εκτέλεση

Αυτός ο ιστότοπος εφαρμόζει όσα τεκμηριώνει: κάθε γλωσσική έκδοση — η πλοήγηση, οι ετικέτες και η αναφορά build με επίγνωση πληθυντικού — αποδίδεται από καταλόγους PO μέσω του ίδιου του gettext-tstrings.

Είναι για εσάς;

Ταιριάζει ήδη σήμερα όταν η εφαρμογή σας τρέχει σε Python 3.14 ή νεότερη· χρησιμοποιείτε ήδη gettext και Babel, ή θέλετε να υιοθετήσετε τη ροή εργασίας PO/MO τους· και θέλετε σύνταξη t-string με επώνυμα σύμβολα κράτησης θέσης που ελέγχονται πριν αποδοθούν.

Δεν ταιριάζει ακόμη όταν χρειάζεστε Python 3.13 ή παλαιότερη· απαιτείτε σταθερό Python API — αυτή είναι έκδοση alpha, και η προδιαγραφή είναι το μέρος της που έχει σταθεροποιηθεί· ή σχεδόν όλο το μεταφράσιμο κείμενό σας ζει σε μια γλώσσα προτύπων και όχι σε πηγαίο κώδικα Python.

Έχετε ήδη καταλόγους; Εξακολουθούν να δουλεύουν. Το _("Hello {name}").format(name=name) και το tr(t"Hello {name}") παράγουν το ίδιο msgid, οπότε οι υπάρχουσες μεταφράσεις επιβιώνουν από τη μετάβαση — η Μετάβαση διατρέχει ολόκληρη τη μετακίνηση.

Τι επιτρέπεται να πει ο κατάλογος

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

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

Νέοι στο gettext; Όλη η ροή εργασίας σε τέσσερις προτάσεις

Το gettext είναι ο καθιερωμένος τρόπος με τον οποίο μεταφράζεται το λογισμικό, στην Python και πολύ πέρα από αυτήν. Ο κώδικάς σας επισημαίνει τα μεταφράσιμα μηνύματα· ένας εξαγωγέας τα συλλέγει σε ένα αρχείο-πρότυπο (.pot)· ένας μεταφραστής — συνήθως όχι προγραμματιστής — συμπληρώνει ένα αρχείο καταλόγου (.po) ανά γλώσσα, το οποίο μεταγλωττίζεται σε ένα δυαδικό .mo που η εφαρμογή σας φορτώνει κατά την εκτέλεση. Το καθιερωμένο όνομα της συνάρτησης μετάφρασης είναι _, οπότε το _(t"Hello {name}") διαβάζεται ως «μετάφρασε αυτό το μήνυμα». Η εκμάθηση διατρέχει όλη τη διαδρομή — επισήμανση, εξαγωγή, μετάφραση, μεταγλώττιση, εκτέλεση — σε περίπου πέντε λεπτά.

Το πρόβλημα που λύνει

Ένα f-string έχει ήδη υποστεί παρεμβολή τιμών μέχρι να το δει οποιαδήποτε βιβλιοθήκη — το f"Hello {name}" έχει γίνει "Hello Ada", και η μετάφραση των τμημάτων γύρω από μια τιμή σπάει τη γραμματική των περισσότερων γλωσσών. Ένα t-string (PEP 750) κρατά χωριστά το στατικό κείμενο, τις αποτιμημένες τιμές, τις πηγαίες εκφράσεις, τις μετατροπές και τις προδιαγραφές μορφοποίησης — που είναι ακριβώς ο διαχωρισμός που χρειάζεται ένας κατάλογος μηνυμάτων. Τι αλλάζει αυτό, σε σύγκριση με τα %(name)s, .format() και τις συμβολοσειρές $.

Τίποτα όμως στο gettext ή στο Babel δεν ορίζει πώς ένα t-string γίνεται μήνυμα. Αυτή η βιβλιοθήκη κάνει αυτή την επιλογή, την καταγράφει ως εκδοσιοποιημένη προδιαγραφή και συνοδεύεται από τη σουίτα συμμόρφωσης για τον έλεγχό της.

Οι κανόνες σχεδίασης

  • Μεταφράζει ολόκληρα μηνύματα, ποτέ αποσπάσματα προτάσεων.
  • Δέχεται μόνο απλά ονόματα μεταβλητών όπως {name}.
  • Κρατά τα !r και :.2f υπό τον έλεγχο της εφαρμογής, έξω από τον κατάλογο.
  • Επιτρέπει στις μεταφράσεις να αναδιατάσσουν και να επαναλαμβάνουν γνωστά σύμβολα κράτησης θέσης, εμποδίζοντάς τες ταυτόχρονα να φτάσουν σε ιδιότητες ή να προσθέσουν μορφοποίηση.
  • Επαναχρησιμοποιεί συνηθισμένα αρχεία POT, PO και MO, και τα εργαλεία που ήδη τα διαβάζουν.

Και ο αντίστοιχος κατάλογος όσων αφήνει σκόπιμα ήσυχα: δεν τοπικοποιεί αριθμούς, νομίσματα ή ημερομηνίες — μορφοποιήστε τα πρώτα, με το Babel· δεν κάνει escape την αποδιδόμενη έξοδο για HTML, για ένα κέλυφος ή για ένα τερματικό· και δεν μπορεί να κρίνει αν μια μετάφραση είναι σωστή, παρά μόνο αν τα σύμβολα κράτησης θέσης της είναι ανέπαφα.

Εγκατάσταση

python -m pip install gettext-tstrings

Απαιτείται Python 3.14 ή νεότερη. Η απόδοση δεν έχει εξαρτήσεις — χρησιμοποιεί το gettext της τυπικής βιβλιοθήκης και τίποτα άλλο.

Η εξαγωγή και η επικύρωση καταλόγων περνούν μέσα από το Babel, οπότε εγκαταστήστε αυτό το extra όπου εκτελείται το pybabel, δηλαδή συνήθως σε περιβάλλον ανάπτυξης ή CI και όχι σε εικόνα παραγωγής:

python -m pip install "gettext-tstrings[babel]"

Πού να πάτε στη συνέχεια

Ξεκινήστε από εδώ — χωρίς να προϋποτίθεται εμπειρία με το gettext:

  • Εκμάθηση — από έναν άδειο κατάλογο σε μια λειτουργική ιαπωνική μετάφραση σε πέντε βήματα, με κάθε εντολή να εμφανίζεται μαζί με την έξοδό της.
  • Γιατί t-strings — το ίδιο μήνυμα γραμμένο με τέσσερις τρόπους, και τι παραδίδουν στον κατάλογο τα %(name)s, .format() και οι συμβολοσειρές $.

Χρησιμοποιήστε το — οι αναφορές εργασίας:

  • Οδηγός — το API χρόνου εκτέλεσης: ποιο σημείο εισόδου να χρησιμοποιήσετε, πληθυντικοί, γλώσσες ανά αίτημα, αναβαλλόμενες συμβολοσειρές, και τι συμβαίνει όταν ένας κατάλογος είναι λανθασμένος.
  • Εξαγωγή — η αναφορά του pybabel: ρύθμιση, προσαρμοσμένα ονόματα συναρτήσεων, και πώς τα υπάρχοντα εργαλεία επικυρώνουν αυτούς τους καταλόγους δωρεάν.
  • Στην παραγωγή — ο κύκλος όπως τον τρέχει μια ομάδα: ο κύκλος ενημέρωσης, οι καταχωρίσεις fuzzy, οι πύλες CI, οι πλατφόρμες μετάφρασης και η αποστολή.
  • Μετάβαση — υιοθέτησή του σε ένα έργο που έχει ήδη καταλόγους, ένα σημείο κλήσης τη φορά.
  • Για μεταφραστές — μία σελίδα για να τη δώσετε σε όποιον επεξεργάζεται τα αρχεία .po.

Κατανοήστε το — από την ιστορία ώς την υλοποίηση:

  • Ιστορικό — γιατί υπάρχει αυτή η βιβλιοθήκη: τριάντα χρόνια gettext, δύο PEP, και η συζήτηση για την τυπική βιβλιοθήκη που έκλεισε χωρίς απάντηση.
  • Παγίδες — τι έσπασε στην πραγματικότητα η μετάφραση αυτού του ιστότοπου σε τριάντα πέντε γλώσσες, και ποιο μισό μπορεί να πιάσει ένα εργαλείο.
  • Πώς λειτουργεί — από το αντικείμενο-πρότυπο του PEP 750 ώς την αποδιδόμενη συμβολοσειρά, και οι κρυφές μνήμες που κάνουν τον έλεγχο φθηνό.

Αναφορά — τα συμβόλαια:

  • API — όλα όσα εξάγει το πακέτο, σε μία σελίδα.
  • Προδιαγραφή — η σύμβαση t-string ↔ msgid ως σταθερό, εκδοσιοποιημένο συμβόλαιο, με μηχανικά αναγνώσιμη σουίτα συμμόρφωσης.

Κατάσταση

Έκδοση πακέτου 0.1.0a8
Σταθερότητα API alpha — το Python API μπορεί ακόμη να αλλάξει
Προδιαγραφή v1, με σουίτα συμμόρφωσης
Python 3.14 και νεότερη· δοκιμασμένη σε 3.14, 3.14t (free-threaded) και 3.15
Babel 2.18 ή νεότερη, και μόνο όπου εκτελείται το pybabel
Εξαρτήσεις κατά την εκτέλεση καμία — το gettext της τυπικής βιβλιοθήκης
Μορφή καταλόγων συνηθισμένα POT, PO και MO
Αλλαγές CHANGELOG

Έκδοση alpha. Το συμβόλαιο είναι σκόπιμα μικρό και η προδιαγραφή είναι το σταθερό του μέρος· το Python API μπορεί ακόμη να αλλάξει. Πριν από μια σταθερή έκδοση χρειάζονται fixtures σε περισσότερες γλώσσες, συνεχής παρακολούθηση επιδόσεων, αναθεώρηση του API από ανθρώπους που χρησιμοποιούν στα σοβαρά τα gettext και Babel, και δοκιμές συμβατότητας με κάθε υποστηριζόμενη έκδοση Python και Babel.

Τα Issues και τα Pull Requests είναι ευπρόσδεκτα — μια έκδοση alpha είναι ακριβώς η στιγμή που αξίζει ακόμη να συζητηθεί η διεπαφή.

Γίνετε μέλος της κοινότητας

  • Διαλέξτε ένα good first issue για μια οριοθετημένη συνεισφορά.
  • Κάντε ερωτήσεις χρήσης στα Q&A Discussions.
  • Φέρτε ροές εργασίας gettext από την παραγωγή και ιδέες για το API στα Ideas Discussions.
  • Διαβάστε τον οδηγό συνεισφοράς πριν ανοίξετε ένα Pull Request.