Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Prosta metoda na wiele języków
Forum PHP.pl > Forum > PHP
gandziorz
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.
nospor
Wady: a teraz sobie wyobraź, że musisz zmienisz wygląd jakiejś strony. Zamiast robić to w jednym pliku robisz w 3. A teraz sobie wyobraź że musisz zmienić wyglad calego serwisu. Zamiast zmiane zrobić raz, robisz 3 razy lub wiecej jesli masz wiecej języków.

Jak chcesz dodać nowy język, musisz dodawać na nowo wszystkie templaty dla tego języka.


Taki system języków jak twój się nie sprawdzi w żadnym normalnym serwisie.
Pawel_W
Cytat(gandziorz @ 10.06.2013, 02:42:12 ) *
zaraz wyjdzie nam plik z tablicą która ma nie kilka KB a MB.

czyżby tekst tekstowi nie równy? biggrin.gif
!*!
@gandziorz - Twoje rozwiązanie ma za dużo wad i żadnej zalety. Przekombinowałeś.

Cytat
'/^[a-z]{2}$/D'

To też jest błędne, ponieważ co w wypadku gdy język jest ustawiony na angielski, ale strona jest dla W.Brytanii? Uwzględnij dialekty.
pkazmierczak007
Powinieneś się zainteresować PHP locale i Gettext oraz zastosować plugin do smartów: http://sourceforge.net/projects/smarty-gettext/.

Używając tego plugina w zależności od języka teskty, które chcesz tłumaczyć będzie musiał objąć w "{t}Do tłumaczenia{/t}".

Twoje rozwiązanie ze zmianą szablonów jest bardzo złe, chyba, że chcesz osiągnąć efekt całkowitej zmiany treści i wszystkiego innego po zmianie języka, w co wątpię smile.gif
rocktech.pl
Witam.

Temat wałkowany na forum http://forum.php.pl/index.php?s=&showt...st&p=934552
gandziorz
Jednak was posłuchałem i zrezygnowałem z tej metody.
Stworzyłem jeden szablon dla wszystkich jezykow i uzywam nieco zmodyfikowanej opcji wczytywania jezykow.

Kod php:
  1. //wczytywanie domyslnego jezyka
  2. $lang = parse_ini_file("./language/lang_default.ini", true);
  3.  
  4. //do sesji "LANG" przypisujemy skrót językowy z przeglądarki
  5. $_SESSION['LANG'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
  6.  
  7. //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/"
  8. if (!empty($_GET['lang']) OR !empty($_SESSION['LANG'])) {
  9.  
  10. //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
  11. if (preg_match ('/^[a-z]{2}$/D', $_GET['lang']))
  12. {
  13. $_SESSION['LANG'] = $_GET['lang'];
  14. }
  15.  
  16. //jestem zwolennikiem zabezpieczen, a niech ktos podmieni sesje LANG na np. ../../ itd.?
  17. if (preg_match ('/^[a-z]{2}$/D', $_SESSION['LANG']))
  18. {
  19. //sprawdzamy czy w katalogu templates jest katalog wybranego naszego jezyka, jezeli jest to go wczytujemy
  20. if (file_exists('./language/lang_' . $_SESSION['LANG'] . '.ini'))
  21. {
  22. $lang = parse_ini_file('./language/lang_' . $_SESSION['LANG'] . '.ini', true);
  23. }
  24. }
  25. }
  26. $smarty->assign('lang', $lang);


Pliki jezykowe (tutaj lang_default.ini):
  1. [menu_link]
  2. home = "Home"
  3. login = "Login"
  4. signup = "Sign up"
  5. support = "Support"
  6.  
  7. [box_name]
  8. login_box = "Member Login"
  9. stats_box = "Stats"
  10. news_box = "News"


W smarty uzywamy:
  1. {$lang.box_name.news_box}
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.