Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [klasa PHP5] Klasa wspierająca wielojęzykowość, Klasa w teorii ma ułatwić dodawanie wielojęzykowych elementów tekstowy
everth
post
Post #1





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


Poniższa klasa powinna pomóc w tworzeniu wielojęzykowych stron.

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:
  1. CREATE TABLE `Translations` (
  2. `id` varchar(40) CHARACTER SET latin1 NOT NULL,
  3. `pl_PL` mediumtext, -- nie jestem w stanie określić jak długie mogą być ciągi tekstowe tutaj
  4. `en_GB` mediumtext,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8

Przykładowe użycie:
  1. //Z użyciem trybu appendMode (dodajemy UIDy oraz przykładowe tłumaczenia w polskim)
  2. $locale = new Translation($pdo);
  3. $locale->setLang('pl_PL');
  4. $locale->appendMode(1); //włączamy appendMode
  5. $locale->setup();
  6.  
  7. echo <<<EB
  8. <ul>
  9. <li>{$U('M_HOME','Główna')}</li>
  10. <li>{$U('M_ABOUT','O nim')}</li>
  11. <li>{$U('M_PORTFOLIO','Portfolio')}</li>
  12. </ul>
  13. EB;
  14.  
  15. //Bez appendMode - sam odczyt UIDów (w przypadku braku pusty string)
  16. $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!
  17. $locale = new Translation($pdo);
  18. $locale->setLang('pl_PL');
  19. $locale->setup();
  20. echo <<<EB
  21. <ul>
  22. <li>{$U('M_HOME')}</li>
  23. <li>{$U('M_ABOUT')}</li>
  24. <li>{$U('M_PORTFOLIO')}</li>
  25. </ul>
  26. EB;

Kod źródłowy Translation wraz z klasami pomocniczymi jest pod tym linkiem
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. $GLOBALS[$this->global_alias] = $this;

WTF?! Poczytaj o właściwościach statycznych.

Czy mi się dobrze wydaje, czy do pobrania każdej wartości wywoływane jest zapytanie do bazy danych?(IMG:style_emoticons/default/questionmark.gif) (w translacji DB)

@access nie stosujesz jak piszesz dla php5

Jeżeli zwracasz egzemplarz tej samej klasy możesz dać @return self

W preperestatement masz "podwojony" kod dla update.
Po co robisz addslashes skoro możesz skorzystać z bindowania wartości, które takie "zabezpieczenie" Ci załatwia?

A teraz puenta. Jaka jest różnica w stosowania twojej klasy od gettext?
Czyż nie lepiej było np stworzyć klasę do zarządzania wpisami właśnie dla tegoż wyżej wynalazku?


Dobra a teraz słowa uznania:
- Ładny kod (formatowanie, phpdoc)
- Dobre oddzielenie źródeł translacji

Ten post edytował wookieb 7.08.2010, 06:50:57
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 9.06.2026 - 17:45