Przy projektowaniu wzorowałem się na podobnej funkcji w bibliotece Qt4 - gdzie metoda tr() ułatwia znacznie tworzenie templatek z tłumaczeniami, właściwie bez ingerencji w kod. Moja klasa próbuje to (trochę nieporadnie, ale cóż) zaimplementować w PHP. Główne założenia:
- niezależność od źródła danych (wydzielony interfejs dla modelu danych z tłumaczeniami)
- łatwość użycia w kodzie (szybka skrótowa funkcja $U())
- automatyczne tworzenie bazy na podstawie wpisów w kodzie (w trybie appendMode dodajemy unikatowe ID i (opcjonalnie) tłumaczenie)
- dobra dokumentacja - na obecnym etapie podstawowa dokumentacja w phpDoc
- elastyczność - klasa w zasadzie projektowana była dla statycznych elementów tekstowych (napisy na przyciskach, napisy w stopce, itd.), ale ponieważ są to ciągi tekstowe to z łatwością można sobie dostosować np. do przechowywania ścieżek do plików graficznych z różnymi napisami, przy odrobinie wysiłku można w ten sposób dodawać nawet artykuły wielojęzykowe (po prostu generujemy ID dla artykułu i zawijamy w funkcję $U() - np. $U('12334') - później tworzymy wersje językowe dla tego ID)
Przykładowa baza w sql na początku ma dwie kolumny - id z identyfikatorami oraz kolumnę aktualnego języka (np. "pl_PL"), dodając nową kolumnę - dodajemy nowy język, według mnie ułatwia to tworzenie i edycję arkusza z tłumaczeniami np. w Excelu lub Calcu (po przerzuceniu tabeli w CSV). Przykładowa struktura:
CREATE TABLE `Translations` ( `id` varchar(40) CHARACTER SET latin1 NOT NULL, `pl_PL` mediumtext, -- nie jestem w stanie określić jak długie mogą być ciągi tekstowe tutaj `en_GB` mediumtext, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
Przykładowe użycie:
//Z użyciem trybu appendMode (dodajemy UIDy oraz przykładowe tłumaczenia w polskim) $locale = new Translation($pdo); $locale->setLang('pl_PL'); $locale->appendMode(1); //włączamy appendMode $locale->setup(); echo <<<EB <ul> <li>{$U('M_HOME','Główna')}</li> <li>{$U('M_ABOUT','O nim')}</li> <li>{$U('M_PORTFOLIO','Portfolio')}</li> </ul> EB; //Bez appendMode - sam odczyt UIDów (w przypadku braku pusty string) $locale->__destruct(); //niestety obiekty Translation nie tolerują żadnego ponownego wywołania bez ręcznego zniszczenia poprzedniej instancji - a ponieważ obiekt tworzy co najmniej 2 referencje do siebie to metoda unset() zawodzi, niestety to obecnie najsłabsze ogniwo - nie powinno się tworzyć więcej niż jedną instancję w przebiegu skryptu! $locale = new Translation($pdo); $locale->setLang('pl_PL'); $locale->setup(); echo <<<EB <ul> <li>{$U('M_HOME')}</li> <li>{$U('M_ABOUT')}</li> <li>{$U('M_PORTFOLIO')}</li> </ul> EB;
Kod źródłowy Translation wraz z klasami pomocniczymi jest pod tym linkiem