2013-04-01 25 views
8

Patrzę na gettext and .po files do tworzenia aplikacji wielojęzycznych. Rozumiem, że w pliku .po znajduje się plik msgid, a tłumaczenie to msgstr. Odpowiednio widzę 2 sposoby definiowania msgid:Łączenie klawiszy i pełnego tekstu podczas pracy z plikami gettext i .po

Korzystanie pełny tekst (np "My name is %s.\n") o następujących zalet:

  • Dzwoniąc gettext można wyraźnie zobaczyć, co ma zamiar być tłumaczone
  • łatwiej przetłumaczyć pliki .po, ponieważ zawierają one rzeczywistą treść do przetłumaczenia .

Korzystanie klucz (np. my-name %s) z następujących zalet:

  • gdy tekst źródłowy jest długi (np ustęp o firmie), gettext rozmowy są bardziej zwięzłe, która sprawia, że ​​twoje poglądy czystsze
  • łatwiej utrzymać kilka .po pliki i poglądów, ponieważ kluczem jest mniej prawdopodobne, aby zmienić (np klucz company-description znacznie mniej prawdopodobne, aby zmienić niż rzeczywisty opis firmy)

Stąd moje pytanie:
Czy istnieje sposób wo rking z gettext i .po plików, który umożliwia łączących zalety obu metod, czyli:
-usage tematyce kluczy dla gettext połączeń
-Możliwość dla tłumacza, aby zobaczyć pełny tekst, który musi być przetłumaczone?

Odpowiedz

2

Właśnie odpowiedziałem na podobne (znacznie starsze) pytanie here.

Krótka wersja:

Format pliku PO jest bardzo prosta, więc możliwe jest generowanie plików PO/MO z innego przepływu pracy, który pozwala na elastyczność pytasz o. (Twój deweloperów chce identyfikatory, tłumacze chcą słów)

Można toczyć rozwiązanie to samemu, lub skorzystać z aplikacji w chmurze jak Loco zarządzać tłumaczenia i eksportowania Gettext plik z identyfikatorami, gdy deweloperzy potrzebują.

+0

Jestem po twojej stronie, więc nie jest to zbyt obiektywne, aby zaakceptować twoją odpowiedź, ale jestem naprawdę przekonany, że to jest najlepsza droga: trzymaj 'PO', ponieważ jest powszechnie używany i łatwy do manipulowania, buduj kroki pośrednie, aby je stworzyć i użyj ich w swojej aplikacji: w ten sposób wszyscy są szczęśliwi i wciąż polegasz na tym, czego używają inni ludzie (z wyjątkiem oczywiście warstwy niestandardowej). – Max

6

gettext został zaprojektowany do tłumaczenia tekstu w języku angielskim na inne języki i jest to sposób, w jaki należy go używać. Nie używaj go z kluczami. Jeśli chcesz kluczy, użyj innej techniki, takiej jak tablica asocjacyjna.

Udało mi się zrealizować dwa duże projekty open-source (50 języków, 5000 tłumaczeń), jeden przy użyciu podejścia kluczowego i jeden wykorzystujący metodę gettext - i nigdy więcej nie skorzystałbym z kluczowego podejścia.

Wady obejmują propagowanie zmian w tekście angielskim na inne języki. Jeżeli zmienisz

msg_no_food = "We had no food left, so we had to eat the cats" 

do

msg_no_food = "We had no food left, so we had to eat the cat's" 

Nowy tekst ma zupełnie inne znaczenie - tak jak można zapewnić, że inne tłumaczenia są unieważniane i aktualizowane?

Wspomniałeś o długim tekście, który sprawia, że ​​twoje skrypty są trudne do odczytania. Rozwiązaniem tego może być umieszczenie ich w oddzielnym skrypcie.Na przykład, umieścić to w kodzie głównym

print help_message('help_no_food') 

i mieć skrypt, który po prostu udziela pomocy komunikatów:

switch ($help_msg) { 
... 
case 'help_no_food': return gettext("We had no food left, so we had to eat the cat's"); 
... 
} 

Innym problemem dla gettext jest, gdy masz pełną stronę do przetłumaczenia. Być może strona z broszurą na stronie internetowej zawierająca wiele osadzonych obrazów. Jeśli zezwolisz na dużo miejsca dla języków z długimi tekstami (np. Niemiecki), będziesz mieć wiele białych znaków w językach z krótkim tekstem (np. Chiński). W rezultacie możesz mieć różne obrazy/układ dla każdego języka.

Ponieważ te liczby są nieliczne, często łatwiej jest je całkowicie wdrożyć poza gettext. na przykład

brochure-view.en.php 
brochure-view.de.php 
brochure-view.zh.php 
+0

Dobra uwaga dotycząca unieważnienia. Alternatywa, którą sugerujesz (z przykładem 'switch') dodaje dodatkową warstwę, która jest w zasadzie tym, czego chciałbym, z formatu tłumaczenia, to znaczy mieć' 1 - klucz/identyfikator', aby widoki były bardziej zwięzłe i łatwe utrzymywane, '2 - source', aby upewnić się, że mamy dokładne źródło, które jest używane do unieważnienia, oraz' 3 - tłumaczenie'. Czy wiesz, czy jakiekolwiek formaty tłumaczenia mają taką strukturę? – Max

+0

Jak już powiedziałem, odskoczyłem od kluczy, jeśli to w ogóle możliwe. Z mojego doświadczenia wynika, że ​​trudniej jest odczytać/debugować kod - nie jest to łatwiejsze. Używam ich tylko (pośrednio przy pomocy przełącznika), aby uzyskać tekst pomocy, który i tak usiądzie poza resztą kodu. Format PO jest świetny, ponieważ jest szeroko używany i rozumiany przez tłumaczy (w przeciwieństwie do programistów) i istnieje wiele narzędzi ułatwiających ich pracę. – fisharebest

+3

W pełni rozumiem, o czym mówisz, ale jest jedna rzecz, której nie mogę zrozumieć: kiedy musisz wykonać tłumaczenie całego akapitu (np. Historii firmy): czy używasz całego angielskiego akapitu w ' gettext' call? Brzmi dla mnie okropnie, IMO miałoby dużo więcej sensu robić 'gettext ('historia firmy')' – Max