Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Prosta metoda na wiele języków, PHP + SMARTY
gandziorz
post 10.06.2013, 01:42:12
Post #1





Grupa: Zarejestrowani
Postów: 101
Pomógł: 0
Dołączył: 20.12.2006

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


Witam,
Czytałem wasze "patenty" by robić to z bazy, pliku itd. itp.
Ja na codzień korzystam z SMARTY i wielu z was pewnie też i jest na to sprytny i sprawdzony sposób.

1. Gdzie te języki?
Standardowo szablony SMARTY trzymane są katalogu templates.
U nas szablony "default" będą zapisane w templates a języczne np. angielski w templates/en, niemiecki w templates/de. W zależności od wyboru języka oraz faktu czy taki język faktycznie jest wgrany SMARTY będzie wczytywało z odpowiedniego języka.

2. Wybór języka.
W moim przypadku język standardo wybierany jest z przegladarki. Jezeli uzytkownik chce zmienic jezyk wybiera odpowiedni odnosnik poprzez liste lub klikniecie w "flage" itd. (jak wlasciciel chce). Odnosnik wowczas ma taka konstrukcje ?lang="jezyk" np. angielski ?lang=en ,niemiecki ?lang=de itd. itp.

3. Jeżeli języka nie ma albo nikt nie wybral jezyka?
To nic smile.gif Wczyta domyślny. Smarty standardowo ma wpisane ze szablony sa zachowane z kat. o nazwie templates.

3. Kod
  1. error_reporting(E_ALL ^ E_NOTICE);
  2.  
  3. //do sesji "LANG" przypisujemy skrót językowy z przeglądarki
  4. $_SESSION['LANG'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
  5.  
  6. //Sprawdzamy czy _GET lang nie jest puste LUB czy sesja "LANG" nie jest pusta. Jezeli to i to jest puste to nic dalej sie nie dzieje a SMARTY standardowo wczyta wszystko z katalogu "templates/"
  7. if (!empty($_GET['lang']) OR !empty($_SESSION['LANG'])) {
  8.  
  9. //zabezpieczamy się poprzez preg_match (tylko male litery OD a DO z i musza byc dwie literki) jezeli wszystko sie zgadza to przypisujemy sesji "LANG" wartosc z _GET
  10. if (preg_match ('/^[a-z]{2}$/D', $_GET['lang']))
  11. {
  12. $_SESSION['LANG'] = $_GET['lang'];
  13. }
  14.  
  15. //jestem zwolennikiem zabezpieczen, a niech ktos podmieni sesje LANG na np. ../../ itd.?
  16. if (preg_match ('/^[a-z]{2}$/D', $_SESSION['lang']))
  17. {
  18. //sprawdzamy czy w katalogu templates jest katalog wybranego naszego jezyka, jezeli jest to go wczytujemy
  19. if (is_dir ('./templates/' . $_SESSION['LANG'] . '/'))
  20. {
  21. $smarty->template_dir = '' . './templates/' . $_SESSION['LANG'] . '/';
  22. }
  23. }
  24. }


Myślę że mój sposób jest dobry i banalny.

Wady:
1) Każdy jezyk trzeba tłumaczyc do osobnego katalogu. Np. jezeli nasza strona ma 3 jezyki, i posiada 20 stron (index, login, support ...) czyli mamy w templates min. 20 plikow tpl (index.tpl, login.tpl ...) to zamiast 20 plikow na serwerze mamy 60 plikow. Jednak przy dzisiejszych pojemnościach serwera nie powinien to być duży problem

Zalety:
1) Jest lepsze od tablicy dzięki temu że możemy dowolnie modyfikować stronę dla danego języka np. polska wersja będzie miała polskie obrazki, układ strony X; angielska będzie miała angielskie obrazki, układ strony Y.
2) Możemy treść na stronie wpisywać jak się nam podoba bez większego zastanowienia. Spróbujcie w tablicach trzymać np. regulamin strony który ma kilka stron, opis strony który też ma kilka stron itd. zaraz wyjdzie nam plik z tablicą która ma nie kilka KB a MB. To samo jak w html możemy dowolnie wpisać tekst typu: Wczoraj "Pani" Kasia kupiła produkt 'X' nie bardzo miałbym pomysł jak to umieścić w tablicy.

Jak to u mnie działa.
Tłumaczymy tylko "teksty" stałe, treść dynamiczna jak np. artykuły trzymane są w bazie danych. Admin dodaje artykuły dla danego języka a nie tłumaczenia. O co chodzi? Już tłumaczę. Jeżeli nie mamy wybranego języka a językiem standardowym jest język polski (pl, zdefiniowane w ustawieniach) to na stronie "Ostatnio dodane artykuły" pojawią się artykuły z bazy danych z językiem "pl", jak ktoś ma wybrany język angielski pojawią się artykuły z bazy danych z językiem "en" (warunkiem że będzie szukać artykułów z językiem "en" w bazie jest fakt że istnieje katalog "en" w "templates" oraz że "en" jest zdefiniowy w ustawieniach jako język opcjonalny). Dzięki temu po wybraniu nawet języka angielskiego na stronie nie będą ukazywały się artykuły w języku polskim.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 11:54