2010-02-23 13 views
10

Do tej pory jedynymi 2 dobrymi rzeczami, które widziałem o korzystaniu z gettext zamiast z tablic, jest to, że nie muszę tworzyć "pod-tablicy" "(lub jakkolwiek to się nazywa). I nie muszę tworzyć folderu dla "domyślnego języka".Używanie PHP Gettext Extension vs PHP Arrays w wielojęzycznych witrynach?

Czy są inne plusy i minusy korzystania z tablic gettext i php na stronach wielojęzycznych?

UŻYCIEM GetText:

hiszpański/messages.po:

#: test.php:3 
msgid "Hello World!" 
msgstr "Hola Mundo" 

index.php:

<?php echo _("Hello World!"); ?> 

index.php język = hiszpański:

<?php echo _("Hello World!"); ?> turns to Hola Mundo 

zastosowaniem układów PHP

lang.en.php

<?php 
$lang = array(
    "greeting" => "Hello World", 
); 
?> 

lang.es.php

<?php 
$lang = array(
    "greeting" => "Hola Mundo", 
); 
?> 

index.php:

<?php echo $lang['greeting']; ?> greeting turns to Hello World 

index.php lang = hiszpanski

<?php echo $lang['greeting']; ?> greeting turns to Hola Mundo 

(zaczynałem z gettext, ale to nie była obsługiwana w moim udostępnionym darmowy hosting Zymic. Nie chciałem używać Zend_translate, uznałem, że jest to zbyt skomplikowane dla mojego prostego zadania, więc w końcu skończyłem używając php define, ale później ktoś powiedział mi, że powinienem używać tablic)

Odpowiedz

7

Korzystając z GNU gettext otrzymujesz wsparcie dla elementów zastępczych, takich jak printf i międzynarodowe formy liczby mnogiej. Kolejność symboli zastępczych można zmienić w tłumaczeniu lub pominąć.

Przykład z dokumentacją PHP:


<?php 
setlocale(LC_ALL, 'cs_CZ'); 
printf(ngettext("%d window", "%d windows", 1), 1); // gives "1 okno" 
printf(ngettext("%d window", "%d windows", 2), 2); // gives "2 okna" 
printf(ngettext("%d window", "%d windows", 5), 5); // gives "5 oke" 
?> 

Innym pro jest to, że można używać standardowych narzędzi do zarządzania terminologią, pamięci tłumaczeń i tłumaczenia maszynowego, jak wskazał przez @middus.

Dla środowisk współużytkowanych istnieje wielki php-gettext library z Danilo Segan.

+0

Kiedy używasz tablic, nadal można używać pladeholders printf, nie można? (Nie masz jednak liczby mnogiej) – middus

+0

Tak, możesz. :) –

+0

Własny gettext PHP jest naprawdę niepoprawny z przynajmniej mod_php. Nie tylko problem z buforowaniem, ale w przypadku niektórych odświeżeń tłumaczenia po prostu nie działają. Więc jest jeden prawie kropla w zamianie: [php-gettext] (https://launchpad.net/php-gettext/) Jest bardzo prosty w użyciu zamiast 'setlocale' używasz' _setlocale' i tak dalej ... – Ciantic

4

Moim zdaniem to nie robi zbyt wiele sensu, aby użyć formatu binarnego (pliki .mo gettext) dla dynamicznego języka, takiego jak php.

Jednak pro z gettext to istnienie ogromnego ekosystemu narzędzi, z których mogą korzystać tłumacze oprogramowania (np. Poedit). Minusem jest to, że zawsze musisz skompilować swoje .po do .mo przed wdrożeniem, podczas gdy możesz po prostu zastąpić plik php zawierający tablicę w locie.

Kolejny problem, jak już zauważyłeś, nie jest dostępny we wszystkich instalacjach php.

5

Najbardziej oczywistym zajęciem dla używania gettext() jest oczywiście umieszczenie łańcucha źródłowego tam, gdzie należy. To znaczy. to sprawia, że ​​o wiele więcej sensu pisać tego

echo _("This is a string"); 

niż

echo $lang['a_string']; 

Nie wspominając, że trzeba by stworzyć nową zmienną zastępczy dla każdej możliwej translacji. W przypadku gettext() sam ciąg translacji działa jako indeks.

+0

@tobefound Zgadzam się z Tobą, ale znalazłem 2 plusy używania echo $ lang ['a_string']; (obecnie użyłem l ('string_a);): 1. Ponieważ treść jest poza stroną indeksu, kod wygląda na bardziej czytelny i zwarty. 2. Jeśli chcę przetłumaczyć całą treść strony internetowej, mogę skopiować wkleić treść do tłumacza (ponieważ lang.php zawiera tylko frazy i słowa. – alexchenco

8

Polecam przy użyciu gettext, robię to w PHP przez 5 lat z dobrymi wynikami.

Przede wszystkim, jeśli używasz echo _('my text to translate') i nie masz dla niego tłumaczenia, zobaczysz oryginalny ciąg na wyjściu, co jest dobre. Używając tablic takich jak echo $translation['were is my translation'] i ich nie ma, po prostu nic nie zobaczysz. ale uważaj, używanie poedit i robienie echo _(''); nie jest dobrym pomysłem, poedit używa msgid "" dla informacji o projekcie, które najprawdopodobniej nie chcesz pokazywać publiczności, więc musisz zadbać o to, aby nie tłumaczyć pustych łańcuchów :)

Również jest bardzo szybki i ma dodatkowe funkcje dla wielu i innych rzeczy, a także na przykład, że poedit ułatwia życie poprzez posiadanie bazy tłumaczeń, więc nie musisz tłumaczyć tego samego w kółko, te, które już zrobiłeś, będą wstępnie wypełniony i oznaczony jako "sprawdź, czy to prawda". Bardzo wygodny.

thebyd wspomniał o minusie, że musisz skompilować plik po, podczas gdy możesz łatwo nadpisać plik php podczas korzystania z tablic - po prostu nadpisaj swój plik M również, a jeśli korzystasz z poedit, robi kompilację po zapisaniu plik. Tak więc trafiłeś, zapisz i skopiuj plik, sam jak przy edycji pliku php.

Ale prawdziwym minusem jest, jeśli używasz mod_php. Należy pamiętać, że z mod_php nie jest to bezpieczny wątek, chociaż nigdy nie miałem żadnych trudnych problemów.

To głównie dlatego, że musisz ponownie uruchomić Apache, gdy używasz mod_php lub twoje połączenia gettext zawiedzie (czasami nie są zwracane tłumaczenia, czasem kończysz z ukochaną białą stroną bez zawartości). Ale używając czegoś takiego jak mod_itk (uważam, że cgi/fastcgi może to zrobić) nie będziesz już miał tego problemu.

-1

Kiedy użytkownik wybiera dowolny język z rozwijanej lub obszar, a następnie zapisać wybrany identyfikator sesji jak język,

$ _SESSION [ „język”] = 1;

Teraz pobierz dane z tabeli bazy danych "treść" na podstawie identyfikatora języka przechowywanego w sesji.

Więcej szczegółów tutaj

http://skillrow.com/multilingual-website-in-php-2/