2013-06-14 34 views
5

ja postępując zgodnie z instrukcjami z odpowiedzią BryanH tu: gettext() equivalent in Intl library? i próbuje wdrożyć Lokalizacja (tłumaczenie) z php-Intl, ale wciąż otrzymuję ten sam problem, to osoba ta: ResourceBundle returns NULL without any errors being raisedJak utworzyć pliki zasobów ICU do użycia w PHP?

Wspomina on stworzył plików DAT za pomocą narzędzia (którego nie mogę wymyślić, jak pracować), podczas gdy osoba w poprzedniej odpowiedzi wydaje się po prostu używać plików txt z rozszerzeniem .res.

Jak prawidłowo zaimplementować lokalizację za pomocą php-intl i ResourceBundle i co robię źle?

Celem jest mieć różne pliki z danymi z różnych językach, więc mogę zrobić coś podobnego do

$t = new Translator(); 
$t->setResource(new \ResourceBundle('es', 'locales_folder/')); 
$t->echo("somestring"); // "el stringo" 

..much jak osoba w pierwszej odpowiedzi miał. Ponadto celem jest posiadanie łatwych do edycji plików, więc mogę dać tłumaczom poprawki, aktualizacje i tym podobne. Zdaję sobie sprawę, że z łatwością mógłbym to zrobić za pomocą niestandardowego rozwiązania za pomocą prostego pliku tekstowego, który jest przetwarzany i zapisywany do memcache'a na pierwsze żądanie, gdzie następnie będzie działał i będzie obsługiwany bez konieczności ponownego odczytu plików .dat, ale wolałbym skorzystaj z sugerowanej trasy tutaj.

Edycja: Aby to osiągnąć, zaimplementowałem to samo z gettext i było to łatwe - z wyjątkiem jednego błędu, który utrzymuje się w systemach linuxowych (http://www.php.net/manual/en/book.gettext.php#91187) - ale chciałbym polegać na bardziej nowoczesne i all-inclusive rozszerzenie wewnętrzne, jeśli to możliwe.

Odpowiedz

9

Mogę dostarczyć odpowiedzi na pytanie, jak tworzyć i używać plików .res dla rozszerzenia PHP intl, jednak nie mam doświadczenia z szybkością i używaniem w systemach produkcyjnych, będziesz musiał sam się przekonać, czy to możliwe. zamiennik dla gettext.

Moim zdaniem wielką korzyścią z gettext są dodatkowe narzędzia, takie jak xgettext, które mogą wyodrębnić ciągi do tłumaczenia. Mimo to używanie zasobów może być bardziej przydatne w przypadku użycia.

Aby wygenerować plik .res, należy użyć programu genrb, który jest bundled with ICU. (Na przykład podczas instalowania ICU na OSX używając brew install icu4c (see this tutorial) można znaleźć narzędzie na /usr/local/Cellar/icu4c/*/bin/genrb (zastąpić * z numerem wersji))

Następny przygotować plik dla każdej lokalizacji. Zróbmy to dla dwóch języków w tym przykładzie, niemieckim i hiszpańskim.

$ cat de.txt 
de { 
    hello { "Hallo" } 
} 

$ cat es.txt 
es { 
    hello { "Hola" } 
} 

$ genrb *.txt 
genrb number of files: 2 

Teraz masz 2 dodatkowe pliki de.res i es.res, które można uzyskać dostęp w PHP

<?php 
foreach (array("de", "es") as $locale) { 
    $r = ResourceBundle::create($locale, __DIR__); 
    echo $r["hello"], "\n"; 
} 

który będzie wyjście

Hallo 
Hola 

Tak w istocie, można ręką te *.txt pliki do twoich translaterów i przygotuj je do PHP za pomocą genrb.

Wreszcie mały przykład dla klasy starasz się napisać:

<?php 
class Translator { 
    private $resourceBundle = null; 

    public function __construct(\ResourceBundle $r) { 
     $this->resourceBundle = $r; 
    } 

    public function __get($string) { 
     return $this->resourceBundle[$string]; 
    } 
} 
$t = new Translator(new \ResourceBundle('es', __DIR__)); 
echo $t->hello; 
+0

Dzięki, że zrobię. Ponieważ ma to być bezpieczne dla wątków, uważam, że jest to rozwiązanie, którego szukałem. Teraz wystarczy napisać własny ekstraktor, który powinien działać. – Swader

+1

Byłoby bardzo przydatne, gdybyś mógł podzielić się z nim doświadczeniem, również za pomocą ekstraktora ciągów (może mógłbyś nawet otworzyć to źródło?). Z góry dziękuję! – akirk

+0

Ponieważ poedit może automatycznie wyodrębnić dla gettext, pomyślałem, że mógłbym po prostu nadać mu inny wzorzec, aby szukać jak $ t -> _ ($ string), który następnie utworzyłby pliki .mo i .po również dla tych ciągów. Wszystko, co musiałbym zrobić, to napisać narzędzie, które zamienia je na format OZE, co wydaje się dość łatwe. Napiszę wpis na blogu o całym doświadczeniu i link tutaj. – Swader