Tłumacz kompletne komunikaty
z t-stringami Pythona¶
gettext-tstrings łączy t-stringi Pythona 3.14+ ze standardowymi katalogami
gettext i narzędziami Babel. Wartości i formatowanie zostają w kodzie
aplikacji; tłumacze pracują z kompletnymi komunikatami i prostymi symbolami
zastępczymi {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
Katalog zawiera Hello {name}. Tłumaczenie może przenieść {name} albo je
powtórzyć. Jeśli usunie, przemianuje lub przeformatuje symbol zastępczy,
walidacja katalogu zgłosi błąd. Jeśli błędny wpis mimo to trafi na produkcję,
biblioteka loguje ostrzeżenie i renderuje komunikat źródłowy zamiast powodować
awarię.
Rozpocznij pięciominutowy samouczek Porównaj alternatywy
Alfa · Python 3.14+ · standardowe katalogi PO/MO · brak zewnętrznych zależności w czasie działania
Ta strona praktykuje to, co dokumentuje: każda wersja językowa —
nawigacja, etykiety i raport z budowania świadomy form liczby mnogiej — jest
renderowana z katalogów PO przez
sam gettext-tstrings.
Czy to jest dla Ciebie?¶
Pasuje już dziś, gdy Twoja aplikacja działa na Pythonie 3.14 lub nowszym; używasz już gettext i Babel albo chcesz przyjąć ich przepływ pracy z plikami PO/MO; i chcesz składni t-stringów z nazwanymi symbolami zastępczymi, które są sprawdzane, zanim się wyrenderują.
Jeszcze nie pasuje, gdy potrzebujesz Pythona 3.13 lub starszego; wymagasz stabilnego API Pythona — to jest wersja alfa, a specyfikacja jest tą jej częścią, która się ustaliła; albo prawie cały Twój tekst do przetłumaczenia mieszka w języku szablonów, a nie w źródłach Pythona.
Masz już katalogi? Działają dalej. _("Hello {name}").format(name=name) i
tr(t"Hello {name}") dają ten sam msgid, więc istniejące tłumaczenia przetrwają
zmianę — Migracja prowadzi przez całe przejście.
Co wolno powiedzieć katalogowi¶
Tłumaczenie nie może zmienić struktury komunikatu, który tłumaczy. Na tym
polega cała obietnica, a reszta tej strony z niej wynika. Tłumaczenie może
zmieniać kolejność {name} albo je powtarzać i może przepisać każde inne słowo
wokół niego. Nie może pominąć symbolu zastępczego, wymyślić nowego, sięgnąć
przez niego do Twoich obiektów ani dołączyć własnego formatowania.
Biblioteka sprawdza to na wejściu — przy kompilacji katalogów — i ponownie w czasie renderowania, a to właśnie różnica między błędem znalezionym w przeglądzie a błędem znalezionym przez użytkownika.
gettext to dla Ciebie nowość? Cały przepływ pracy w czterech zdaniach
gettext to standardowy sposób tłumaczenia oprogramowania, w Pythonie i
daleko poza nim. Twój kod oznacza łańcuchy do przetłumaczenia; ekstraktor
zbiera je do pliku szablonu (.pot); tłumacz — zwykle nie programista —
wypełnia po jednym pliku katalogu (.po) na język, kompilowanym do
binarnego .mo, który aplikacja wczytuje w czasie działania. Konwencjonalna
nazwa funkcji tłumaczącej to _, więc _(t"Hello {name}") czyta się jako
„przetłumacz to zdanie". Samouczek przechodzi całą
ścieżkę — oznacz, wyodrębnij, przetłumacz, skompiluj, uruchom — w około
pięć minut.
Problem, który rozwiązuje¶
F-string jest już zinterpolowany, zanim zobaczy go jakakolwiek biblioteka —
f"Hello {name}" stał się "Hello Ada", a tłumaczenie fragmentów wokół
wartości łamie gramatykę większości języków. T-string (PEP 750) utrzymuje
osobno tekst statyczny, obliczone wartości, wyrażenia źródłowe, konwersje i
specyfikacje formatu — a to dokładnie ten podział, którego potrzebuje katalog
komunikatów.
Co to zmienia w porównaniu z %(name)s, .format() i
$-stringami.
Nic w gettext ani w Babel nie mówi jednak, jak t-string ma stać się komunikatem. Ta biblioteka dokonuje tego wyboru, spisuje go jako wersjonowaną specyfikację i dostarcza zestaw testów zgodności, który go sprawdza.
Zasady projektowe¶
- Tłumacz kompletne komunikaty, nigdy fragmenty zdań.
- Akceptuj wyłącznie proste nazwy zmiennych, takie jak
{name}. - Trzymaj
!ri:.2fpod kontrolą aplikacji, poza katalogiem. - Pozwól tłumaczeniom zmieniać kolejność i powtarzać znane symbole zastępcze, nie pozwalając im sięgać do atrybutów ani dodawać formatowania.
- Używaj zwykłych plików POT, PO i MO oraz narzędzi, które już je czytają.
A do tego pasująca lista tego, czego biblioteka celowo nie dotyka: nie lokalizuje liczb, walut ani dat — sformatuj je wcześniej, Bablem; nie escape'uje wyrenderowanego wyjścia dla HTML-a, powłoki ani terminala; i nie potrafi ocenić, czy tłumaczenie jest poprawne — tylko czy jego symbole zastępcze są nienaruszone.
Instalacja¶
Python 3.14 lub nowszy. Renderowanie nie ma zależności — korzysta z
modułu gettext biblioteki standardowej i z niczego więcej.
Ekstrakcja i walidacja katalogów przechodzą przez Babel, zainstaluj więc to
rozszerzenie tam, gdzie działa pybabel, czyli zwykle w środowisku
deweloperskim lub CI, a nie w obrazie produkcyjnym:
Dokąd dalej¶
Zacznij tutaj — bez zakładania doświadczenia z gettext:
- Samouczek — od pustego katalogu do działającego japońskiego tłumaczenia w pięciu krokach, każde polecenie pokazane z jego wynikiem.
- Dlaczego t-stringi — ten sam komunikat zapisany na
cztery sposoby i to, co
%(name)s,.format()oraz$-stringi oddają katalogowi.
Używanie — robocze materiały odniesienia:
- Przewodnik — API czasu działania: którego punktu wejścia użyć, liczba mnoga, języki na żądanie, odroczone łańcuchy i to, co się dzieje, gdy katalog jest błędny.
- Ekstrakcja — dokumentacja
pybabel: konfiguracja, własne nazwy funkcji i to, jak istniejące narzędzia walidują te katalogi za darmo. - W produkcji — pętla tak, jak prowadzi ją zespół: cykl aktualizacji, wpisy fuzzy, bramki CI, platformy tłumaczeniowe i wysyłka.
- Migracja — przyjęcie tego w projekcie, który ma już katalogi, jedno miejsce wywołania naraz.
- Dla tłumaczy — jedna strona do przekazania temu, kto
edytuje pliki
.po.
Zrozumienie — od historii do implementacji:
- Geneza — dlaczego ta biblioteka istnieje: trzydzieści lat gettext, dwa PEP-y i dyskusja o bibliotece standardowej zamknięta bez odpowiedzi.
- Pułapki — co naprawdę zepsuło się przy tłumaczeniu tej strony na trzydzieści pięć języków i którą połowę potrafi wychwycić narzędzie.
- Jak to działa — od obiektu szablonu z PEP 750 do wyrenderowanego łańcucha oraz pamięci podręczne, które czynią sprawdzanie tanim.
Referencja — kontrakty:
- API — wszystko, co eksportuje pakiet, na jednej stronie.
- Specyfikacja — konwencja t-string ↔ msgid jako stabilny, wersjonowany kontrakt z maszynowo czytelnym zestawem testów zgodności.
Status¶
| Wersja pakietu | 0.1.0a8 |
| Stabilność API | alfa — API Pythona może się jeszcze zmieniać |
| Specyfikacja | v1, z zestawem testów zgodności |
| Python | 3.14 i nowsze; testowane na 3.14, 3.14t (free-threaded) i 3.15 |
| Babel | 2.18 lub nowszy, i tylko tam, gdzie działa pybabel |
| Zależności w czasie działania | brak — moduł gettext biblioteki standardowej |
| Format katalogów | zwykłe POT, PO i MO |
| Zmiany | CHANGELOG |
Wersja alfa. Kontrakt jest celowo mały, a specyfikacja jest jego stabilną częścią; API Pythona może się jeszcze zmieniać. Przed stabilnym wydaniem potrzebne są szersze zestawy testowe dla języków, stałe śledzenie wydajności, przegląd API przez osoby używające gettext i Babel na poważnie oraz testy zgodności z każdą wspieraną wersją Pythona i Babel.
Zgłoszenia i pull requesty są mile widziane — alfa to dokładnie ten moment, w którym o interfejs wciąż warto się spierać.
Dołącz do społeczności¶
- Wybierz good first issue na ograniczony, pierwszy wkład.
- Zadawaj pytania o użycie w dyskusjach Q&A.
- Przynieś produkcyjne przepływy gettext i pomysły na API do dyskusji Ideas.
- Przeczytaj przewodnik dla współtwórców, zanim otworzysz pull request.