Hej, hej. To mój pierwszy post na tym forum, więc zaczynam od przywitania: cześć wszystkim!
Nie jestem programistą, chociaż pewne podstawy ogarniam. Zajmuję się za to hobbystycznie tłumaczeniem aplikacji dla Linuksa i ostatnio zabrałem się za jedną napisaną w Pythonie.
Angielskie stringi są wpisane bezpośrednio w kod jako fallback, a ich tłumaczeniem zajmuje się gettext na podstawie plików .po. Przykład:
def classify_uv_index(uv_index):
if uv_index <= 2:
return _("Low")
elif uv_index <= 5:
return _("Moderate")
elif uv_index <= 7:
return _("High")
elif uv_index <= 10:
return _("Very High")
else:
return _("Extreme")
Oczywiście problem w języku polskim jest ten, że słowa odmieniamy i „high” może oznaczać „wysoki”, „wysoka” oraz „wysokie”, nie mówiąc już o przypadkach.
Niestety, nie można po prostu w pliku pl.po zdefiniować różnych wersji tłumaczenia, rozróżniając je jedynie inną ścieżką do pliku i numerem linii w komentarzu – przy budowaniu aplikacji wyskakują błędy duplikacji stringów.
Żeby to rozwiązać, zacząłem czytać dokumentację bilioteki gettext i znalazłem informację o możliwości dodania kontekstu. Przerobiłem powyższy fragment kodu zgodnie z tym, co wyczytałem, dodając kontekst dla ciągów, które w aplikacji występują więcej niż jeden raz:
def classify_uv_index(uv_index):
if uv_index <= 2:
return gettext.pgettext("uvindex", "Low")
elif uv_index <= 5:
return gettext.pgettext("uvindex", "Moderate")
elif uv_index <= 7:
return gettext.pgettext("uvindex", "High")
elif uv_index <= 10:
return _("Very High")
else:
return _("Extreme")
Wygenerowałem xgettext --keyword=pgettext:1c,2
świeży plik .pot i na jego podstawie zaktualizowałem przy użyciu msgmerge
plik pl.po, gdzie przetłumaczyłem nowe stringi:
msgctxt "uvindex"
msgid "Low"
msgstr "Niski"
msgctxt "uvindex"
msgid "Moderate"
msgstr "Umiarkowany"
msgctxt "uvindex"
msgid "High"
msgstr "Wysoki"
Po tych zmianach aplikacja buduje się bez problemów, instaluje i odpala się z polskim tłumaczeniem. Niestety, wszystkie stringi, które miały podany kontekst, wyświetlają się bez tłumaczenia, w wersji fallback z pliku .py.
Siedziałem nad tym kilka godzin, przeglądając różne strony, dokumentacje i gapiąc w kod, ale nie udało mi się tego naprawić.
Co robię źle? Jak mogę to zdebugować? Przy uruchamianiu z terminala nie ma słowa o błędach.
Z góry dziękuję za wszelkie podpowiedzi!