Technologie i narzędzia: język PHP 5, Java, JavaScript, Python, system Zend Framework, Django, biblioteka jQuery, Smarty, platforma Eclipse, MySQL, SVN, CVS, UML, Firefox.
WebProgramming - wszystko o serwisach internetowych
O serwisach internetowych.
[php|zend] Sprytne tłumaczenie adresów url.
Przyglądając się wielojęzycznym serwisom zauważyłem, iż żaden z nich nie tłumaczy adresów url (oczywiście treść samej strony jest ładnie przetłumaczona). Innymi słowy niezależnie od wyboru języka adresy stron są takie same - na przykład dostęp do wiadomości kryje się pod adresem /messages/show/1/, a przecież mogłoby to wyglądać tak /wiadomosci/wyswietl/1/ - czyż nie bardziej czytelnie (szczególnie dla osób nie znających języka angielskiego).
Zamiast rozmyślać wziąłem się za implementacje - tak też narodziła się wtyczka do Zend Framework o nazwie Fancyurl.
Idea działania wtyczki nie jest skomplikowana - z jednej strony musimy mieć możliwość łatwego tworzenia przetłumaczonych adresów url, z drugiej zaś sposób na ich odkodowanie - aby serwis “wiedział”, że adres /wiadomosci/ odnosi się do modułu Messages.
W moim rozwiązaniu zasada działania wygląda następująco:
- W skrypcie inicjującym serwis (na przykład w Bootstrap) inicjuje słownik, za pomocą którego będę tłumaczył adresy. Słownik jest w postaci tablicy asocjacyjnej, a jej wpisy są uzależnione od aktualnie wybranego języka. W przykładzie przetoczonym wyżej jego fragment mógłby wyglądać następująco:
-
‘messages’ => ‘wiadomosci’,
-
’show’ => ‘wyswietl’
-
)
- Następnie za pomocą wtyczki kontrolera Zend Framework tłumaczę aktualny adres (samą ścieżkę zapisaną w pathInfo obiektu Zend_Controller_Request_Http), na adres rozpoznawalny przez Zend Framework (*) - w naszym przykładzie z /wiadomosc/wyswietl/1/ na /messages/show/1/.
- Zend Framework inicjuje odpowiedni moduł, nie wiedząc nic na temat “podmienionego” adresu.
- W widoku natomiast korzystamy z następnej wtyczki, która na podstawie oryginalnego adresu url zwraca url przetłumaczony, wygląda to mniej więcej tak:
-
<?= $this->fancyurl(‘/messages/show/1/’); ?>
-
(*) adres rozpoznawalny przez ZF - czyli adres, który system potrafi zinterpretować (przełożyć na odpowiedni moduł/kontroler/akcje) za pomocą aktualnie dostępnego routingu.
Instalacja:
- Ściągnij pliki źródłowe.
- Skopiuj pliki do odpowiedniego katalogu (w zależności od użytej struktury aplikacji), tak aby były widoczne przez Zend Framework.
- Dodaj nową wtyczkę, na przykład tak:
-
Zend_Front_Controller::getInstance()
-
->registerPlugin(new Fasic_Controller_Plugin_Fancyurl());
-
- Przed uruchomieniem aplikacji dodaj dane do słownika (w postaci tablicy asocjacyjnej). Źródło danych zależy od Ciebie, może to być zarówno baza danych jak i plik xml:
-
Fasic_Fancyurl::getInstance()->setData($data);
-
- Koniec.
Korzyści:
- Adresy są user-friendly nie ważne w jakim języku użytkownik ogląda stronę
- Działanie wtyczki jest proste i szybkie, przez co nie ma dodatkowego narzutu
- Edycja słownika jest bardzo prosta i sprowadza się do określenia pary klucz - wartość
- Wtyczka nie wymaga żadnych modyfikacji w aktualnym systemie (oprócz tworzenia url w widoku)
- Korzystanie z wtyczki nie wprowadza żadnego narzutu czasowego dla programisty, oprócz samego tworzenia url (jednak dzięki funkcji pomocniczej jest on naprawdę niewielki)
- Możemy tworzyć w łatwy sposób adresy google-friendly, na przykład zamiast /profile/show/1/ napisać /mój-profil-programistyczny/pokaz-teraz/1/
- Jeżeli dane słowo nie zostanie znalezione w słowniku pozostaje nie zmienione, dzięki czemu wtyczka będzie działać przy niepełnym (a nawet pustym) słowniku
Wady:
- Tłumaczenie jest 1-1 we wszystkich adresach (w ramach wybranego języka), w związku z czym jeżeli raz przetłumaczymy messages jako wiadomosci to we wszystkich adresach pojawi sie taka nazwa.
- Nie każdy potrzebuje tłumaczenia adresów
- Inne - jakie?
Uwagi mile widziane.
Napisz komentarz