2010-01-07 6 views
8

Mam kilka aplikacji napisanych w PyQt4, w których używałem standardowej biblioteki gettext Pythona do internacjonalizacji i lokalizacji GUI. Działa dobrze dla mnie. Ale wybrałem gettext tylko dlatego, że miałem już wiedzę i doświadczenie użycia gettext i zero doświadczenia z Qt4 tr().Plusy i minusy używania gettext zamiast QObject.tr() do lokalizacji aplikacji PyQt4?

Teraz chciałbym lepiej porównać oba podejścia i zrozumieć, czego mi brakuje, używając gettext zamiast QObject.tr i czy istnieje jakiś poważny powód, dla którego nie powinienem używać gettext do aplikacji Qt4/PyQt4?

W moim zrozumieniu korzyści z używania gettext są:

  • GNU gettext jest dojrzały i wydaje się być de facto standardem w GNU/Linux świecie.
  • Istnieje wystarczająco dużo specjalnych edytorów plików PO, aby uprościć pracę tłumaczy, chociaż tekstowy charakter szablonów PO sprawia, że ​​nie jest to absolutnie konieczne.
  • Dostępne są nawet usługi internetowe, które można wykorzystać do tłumaczeń grupowych.
  • gettext jest standardową biblioteką Pythona, więc nie muszę instalować niczego specjalnego, aby używać go w środowisku wykonawczym.
  • Ma bardzo dobre wsparcie przy wyborze form liczby pojedynczej/mnogiej za pomocą ngettext().

Co widzę jak zalet QObject.tr():

  • Ta technologia jest rodzimy dla Qt4/PyQt4 więc może to będzie działać lepiej/szybciej (chociaż nie mam żadnych danych, aby udowodnić).
  • Wiadomości do tłumaczenia mogą zawierać dodatkowe informacje kontekstowe, które pomogą tłumaczom wybrać najlepsze warianty słów homonimicznych, np. Angielskie słowo "Letter" można przetłumaczyć jako "Character", "Mail" lub nawet "Paper size" w zależności od aktualnego kontekstu.

Co widzę jako wady QObject.tr() vs gettext:

  • nie znalazłem w dokumentacji Qt, jak jest obsługiwany Pojedyncza/mnoga wybór tam.
  • Szablon tłumaczenia Qt4 TS jest w formacie XML, a zatem bardziej złożony do edycji bez specjalnego edytora (QT Linguist) i wydaje się, że nie ma innych rozwiązań ani usług internetowych innych firm. Wymagałoby to więc, aby tłumacze nauczyli się nowego narzędzia (jeśli znają już narzędzia PO).

Jednak wszystkie powyższe elementy nie są wystarczająco krytyczne, aby jednoznacznie stwierdzić, że każde narzędzie jest lepsze od innych. I nie chcę zaczynać płomiennej wojny o to, co jest lepsze, ponieważ jest bardzo subiektywne. Chcę tylko wiedzieć, czego mi brakuje jako plusy i minusy QObject.tr() vs gettext.

Odpowiedz

-1

Można dodać, że argumenty są zarządzane inaczej ...

Z Gettext możemy zrobić

_("Hello %(name)s from %(city)s") % {person.__dict__}

natomiast w PyQt, robimy

self.tr("Hello %1 from %2").arg(person.name).arg(person.city)

2

jednego prostego powodu używania QObject.tr() jest:

To oszczędza trzeba zainstalować gettext w systemie Windows, dzięki czemu praca na wielu platformach jest nieco łatwiejsza. Próbuję mieć tak małe zależności binarne, jak to możliwe w systemie Windows.

2

Wszystkie mają swoje zalety i wady, ale aby je wyraźniej zdefiniować, należy najpierw zdefiniować, jeśli kierujesz reklamy na środowisko mobilne lub środowisko graficzne.

W naszej firmie stosujemy różne metody tylko dlatego, że idealne rozwiązanie jeszcze nie istnieje. Do programowania pulpitu używamy plików PO tylko dlatego, że przyciski nie są skalowane i dlatego tekst będzie pasował. W przypadku rozwoju urządzeń mobilnych tłumaczenie ciągu znaków zależy od rozmiaru przycisku, który może być inny w przypadku urządzeń krajobrazowych i portretowych. To trochę komplikuje, ponieważ plik PO może mieć tylko jedno tłumaczenie określonego słowa. Wybraliśmy dla tego opcję XLIFF, abyśmy mogli przypisać unikalne identyfikatory do łańcucha. To również nie jest łatwe zadanie, ponieważ nie ma dobrych rozwiązań do konwersji plików .RC na pliki XLIFF. (Ponieważ obecne narzędzia konwertują WSZYSTKIE ciągi znaków między "", co jest oczywiście niepożądanym zachowaniem). Więc napisałem konwerter do tego zadania.

Jednak, gdy myślimy o lokalizacji, formy liczby mnogiej są bardzo ważne, więc nie jest to dobre rozwiązanie lokalizacyjne. Dlatego powiedziałbym, aby przejść do PO gettext.

Pozdrowienia, Floris.

2

W chwili obecnej, Qt nie obsługuje formy liczby mnogiej, gdy jesteś wykorzystanie QT_TRANSLATE_NOOP

+1

Chciałbym dodać, że 'tr („Wybrałeś element% n (s)”, item.count()) "wygląda na to, że może działać, ale jest bardzo słabo udokumentowane w systemie Qt i naprawdę nie wyjaśnia, w jaki sposób umieścić rzeczy, jeśli chcesz, żebyś chciał dwóch (lub więcej) różnych ciągów zamiast tylko przyrostka:' tr (" % n element {jest | s są} teraz w zaznaczeniu. ",, item.count())' – SlySven

Powiązane problemy