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
everth
post
Post #2





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

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


Aleś po mnie pojechał (IMG:style_emoticons/default/smile.gif) Więc teraz postaram się choć trochę usprawiedliwić (to jest wersja pre-pre-alfa - a nie wyglancowany produkt ostateczny)
  1. Cytat
    WTF?! Poczytaj o właściwościach statycznych.
    To jest najbardziej niepodobająca się mi część kodu. Co do właściwości statycznych - one raczej nie znajdują tu zastosowania, ja wyprowadzam tą referencję na zewnątrz obiektu (choć nie powinienem) tylko po to żeby móc się do niej odwołać w funkcji wrapperze $U(), tylko po to. Szukałem sposobu który pozwoliłby określić aktualną zewnętrzną referencję obiektu z wewnątrz obiektu (żeby użyć w funkcji wrapperze) - nic nie udało mi się znaleźć. Stąd ten hack z wyprowadzeniem dodatkowej referencji w GLOBALS (i to przez niego mam problemy z usuwaniem obiektu Translation). Istniała też możliwość przekształcenia obiektu w singletona (teraz uważam że tak byłoby nawet lepiej), tylko po drodze uznałem że niektórzy mogę chcieć mieć kilka instancji obiektów obok siebie, z różnymi językami -> tak wynikły z tego problemy, których już nie zdążyłem/nie chciało mi się dziś rozwiązywać
  2. Cytat
    Czy mi się dobrze wydaje, czy do pobrania każdej wartości wywoływane jest zapytanie do bazy danych? (w translacji DB)

    tu miałem zagwozdkę, bo rzeczywiście zastanawiałem czy nie pobrać całości jednym zapytaniem. Ostatecznie zdecydowałem o użyciu spreparowanych zapytań i bindingu. Dlaczego? Bo nie mam pojęcia jak wielkie mogą być te tabele, a ostrożność każe mi zakładać najgorsze. Jak ktoś chce to z łatwością napisze sobie własne LocaliseDbOne (lub rozszerzy obecną klasę) posługujące się jednokrotnym zapytaniem
  3. Cytat
    @access nie stosujesz jak piszesz dla php5
    Jeżeli zwracasz egzemplarz tej samej klasy możesz dać @return self
    phpDoc - to jest moje pierwsze użycie po zapoznaniu się z dokumentacją (IMG:style_emoticons/default/smile.gif)
  4. Cytat
    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?
    - to wynik nieprecyzyjnego czyszczenia kodu - pierwsze to przeoczenie, drugie to zaszłość po wcześniejszym rozwiązaniu (na bindowanie przestawiłem się już pod koniec)
  5. Cytat
    A teraz puenta. Jaka jest różnica w stosowania twojej klasy od gettext?
    - no to mnie zastrzeliłeś, bo rzeczywiście nie wiedziałem o tym rozwiązaniu (ogólnie o całej tej kategorii w manualu), jedyne co mam na swoją obronę to to, że ja mogę składować dane w bazie (a gettext składuje je w plikach *.mo - a one nie są czasem binarne?), lub w czymkolwiek do czego napiszę klasę. Jak znów będę miał trochę czasu to pomyślę nad gettext - może nawet da się go wepchnąć w interfejs TranslationModel


Ten post edytował everth 7.08.2010, 07:51:04
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