Przejdź do treści

Praca z tłumaczeniami

W przykładzie używane są katalogi GNU gettext:

  • locale/messages.pot — szablon z tekstami zebranymi z kodu źródłowego.
  • locale/<język>/LC_MESSAGES/messages.po — tłumaczenia dla danego języka.
  • messages.mo — skompilowany katalog używany przez aplikację.

Format gettext obsługuje wiele internetowych platform tłumaczeniowych, takich jak Crowdin i Transifex. Pliki .po można też edytować w specjalnych programach, na przykład Poedit.

Szczegółowy przewodnik po tłumaczeniu aplikacji za pomocą gettext znajdziesz w artykule Lokalise. To odnośnik do przydatnego poradnika, a nie reklama.

W projekcie przykładowym skonfigurowano zadania Poe the Poet automatyzujące powtarzalne czynności. Uruchamiaj je z katalogu example/. Są szczególnie przydatne, gdy aplikacja obsługuje kilka języków: aktualizują lub kompilują katalogi wszystkich języków za jednym razem, bez konieczności powtarzania poleceń dla każdego języka.

Przed uruchomieniem zainstaluj GNU gettext oraz Poe the Poet. Jeśli Poe nie jest jeszcze zainstalowane, użyj polecenia:

uv tool install poethepoet

Takie definicje zadań znajdują się w pliku example/pyproject.toml:

[tool.poe.tasks]
run = "streamlit run app.py"
xgettext.shell = "xgettext -d messages -o ./locale/messages.pot *.py --from-code=UTF-8 --no-location"
msgfmt = "find ./locale -name \\*.po -execdir msgfmt messages.po -o messages.mo \\;"
msgmerge.shell = "find locale -name '*.po' -exec msgmerge -U {} locale/messages.pot \\; && find locale -name '*.po~' -delete"

xgettext zbiera teksty z plików Pythona do wspólnego szablonu. msgmerge aktualizuje na jego podstawie wszystkie istniejące katalogi .po i usuwa pliki kopii zapasowych, a msgfmt kompiluje katalogi .po do plików .mo. Wszystkie te polecenia są częścią GNU gettext, a Poe jedynie uruchamia skonfigurowane zadania.

1. Oznacz tekst do tłumaczenia

Obejmuj tekst widoczny dla użytkownika funkcją gettext (zwykle importowaną jako _). Do obsługi liczby pojedynczej i mnogiej używaj ngettext. Na przykład:

st.write(_("Squirrel application"))
ngettext("One squirrel", "%(num)d squirrels", count)

2. Zbierz teksty z kodu

Po dodaniu lub zmianie tekstów do tłumaczenia utwórz szablon komunikatów:

poe xgettext

To polecenie uruchamia xgettext dla plików Pythona w katalogu example/ i aktualizuje locale/messages.pot.

3. Zaktualizuj katalogi i dodaj tłumaczenia

Połącz najnowszy szablon ze wszystkimi istniejącymi katalogami .po:

poe msgmerge

Otwórz pliki locale/<język>/LC_MESSAGES/messages.po i przetłumacz wartości msgstr. Nie zmieniaj znaczników takich jak %(num)d. W przypadku komunikatów w liczbie mnogiej przetłumacz wszystkie formy msgstr[n] wymagane dla danego języka.

Podczas aktualizacji katalogu msgmerge może oznaczyć wpis flagą fuzzy, jeśli tekst źródłowy się zmienił, ale jest podobny do poprzedniego. Dotychczasowe tłumaczenie zostaje przeniesione jako sugestia, ale może już nie pasować. Sprawdź je i usuń flagę fuzzy — msgfmt pomija takie wpisy, więc aplikacja nie będzie mogła z nich korzystać.

Zadanie aktualizuje istniejące katalogi. Aby dodać nowy język, najpierw utwórz dla niego plik .po.

4. Skompiluj tłumaczenia i sprawdź wynik

Skompiluj przetłumaczone katalogi do plików .mo:

poe msgfmt

Uruchom przykład i sprawdź tłumaczenia w aplikacji:

poe run

Po zmianie tekstów źródłowych ponownie uruchom poe xgettext i poe msgmerge, przetłumacz nowe lub zmienione wpisy, a następnie ponownie skompiluj katalogi.