Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

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





Grupa: Zarejestrowani
Postów: 100
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
nospor
post 10.06.2013, 07:58:10
Post #2





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Pawel_W
post 10.06.2013, 09:02:51
Post #3





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


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
Go to the top of the page
+Quote Post
!*!
post 10.06.2013, 09:25:31
Post #4





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


@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.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
pkazmierczak007
post 10.06.2013, 10:11:54
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 6.05.2013

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


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
Go to the top of the page
+Quote Post
rocktech.pl
post 10.06.2013, 10:13:31
Post #6





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

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


Witam.

Temat wałkowany na forum http://forum.php.pl/index.php?s=&showt...st&p=934552


--------------------
Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. --Brian Moore

I never go looking for a sucker. I look for a Champion and make a sucker of of him. --Amarillo Slim


Home-made : js-gui-classes | Accordion | Tabs | Carousel / php-sms-classes | Obsługa bramki SMS MultiInfo | Obsługa bramki SMS Mobiltek
Go to the top of the page
+Quote Post
gandziorz
post 10.06.2013, 12:33:30
Post #7





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

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


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}
Go to the top of the page
+Quote Post

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: 27.04.2024 - 14:37