Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Wybór języka, Zmienne globalne
Mephis
post
Post #1





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Witam.

Mam pewien problem.
Otóz potrzebuję skryptu opierajacego się na zmiennych globalnych, do wyboru języka.
Tłumaczenia słów mam w plikach php "polski.php", "angielski.php" itd.

Język ma być inkludowany na początku strony - i to oczywiscie działa. Jak ustale "angielski.php"/"polski.php" - działa jak należy.
Problem w tym że nie wiem jak zmieniać to, jaki plik ma być inkludowany.
Rzecz jasna wiem że da się to zrobić na zmiennych globalnych, ale próbuję już od pewnego czasu i mi nie wychodzi.
Chcę żeby link był pod postacią obrazka.

Mógłby ktoś mi podpowiedzieć co zrobić w takiej sytuacji? (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
sazian
post
Post #2





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


jak dobrze rozumiem to chcesz coś na kształt i18n tak ?
  1. class i18n extends helper
  2. {
  3. protected static $_cache = array();
  4. protected static $_lang = 'pl';
  5. public static function setLang($lang)
  6. {
  7. self::$_lang = $lang;
  8. if(!isset(self::$_cache[$lang]))
  9. {
  10. self::$_cache[$lang] = array();
  11. }
  12. }
  13.  
  14. public static function getLang()
  15. {
  16. return self::$_lang;
  17. }
  18.  
  19. protected static function load($lang)
  20. {
  21. return include 'ścieżka_do_i18n/' . $lang . '.php';
  22. }
  23.  
  24. public static function translate($text,array $var=array(), $lang = null)
  25. {
  26. if($lang !== null && $lang != self::$_lang)
  27. {
  28. if(!isset(self::$_cache[$lang]))
  29. {
  30. self::$_cache[$lang] = array();
  31. self::$_cache[$lang] = self::load($lang);
  32. }
  33. }
  34. else
  35. {
  36. $lang = self::$_lang;
  37. if(count(self::$_cache[$lang])==0)
  38. {
  39. self::$_cache[$lang] = self::load($lang);
  40. }
  41. }
  42. $text = self::$_cache[$lang][$text];
  43.  
  44. return empty($var) ? $text : strtr($text, $var);
  45. }
  46.  
  47. public static function _($text,array $var=array(), $lang = null)
  48. {
  49. return self::translate($text,$var, $lang);
  50. }
  51.  
  52.  
  53. }

przykładowy plik językowy to
  1. <?php
  2.  
  3. return array(
  4. 'test'=>'test_pl',
  5. 'test :id'=>'test_pl :id'
  6.  
  7. );

przykład użycia
  1. echo i18n::_('test :id',array(':id'=>100),'pl');//wyświetli test_pl 100
Go to the top of the page
+Quote Post
Mephis
post
Post #3





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Ajć, niezupełnie. Chciałem to zrobić w nieco łatwiejszy sposób.
Pliki z tłumaczeniami działają - trzeba je tylko zainkludować zależnie od..

Np. klikam obrazek "PL", a kliknięcie nadaje zmiennej globalnej "jezyk" wartość "pl".
I teraz warunek, : jeśli zmienna globalna ma wartość "pl" to "include(polski.php)".

No i analogicznie z obrazkiem "ANG"...

Tylko właśnie mi to nie działa..
To jest kawałek kodu (troszke inny niż opisuje):
  1. if ($_SESSION['jezyk'] == 'jezyk/polski.php')
  2. {
  3. $jezyk = 'jezyki/polski.php';
  4. } else {
  5. $jezyk = 'jezyki/angielski.php';
  6. }
  7. include ($jezyk);
  8.  
  9.  
  10. ...
  11.  
  12.  
  13.  
  14. <form method='POST' action='".$PHP_SELF."'>
  15. <select size='1' name='lang'>
  16. <option value='jezyki/polski.php'>Polski</option>
  17. <option value='jezyki/angielski.php'>English</option>
  18. </select>
  19. <input type='submit' value='Zmień język' name='jezyk'>
  20. </form>
Go to the top of the page
+Quote Post
Szymciosek
post
Post #4





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


O ile dobrze patrzę, to masz literówkę. W if zgubiłeś "a" czyli nie "jezyk/polski.php" a "jezyki/polski.php"
Go to the top of the page
+Quote Post
Mephis
post
Post #5





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Poradziłem sobie. Użyłem oddzielnie formularza do każdego przycisku, i ukrytego pola input z wartością (przeznaczoną dla zmiennej globalnej).

Odświeżam...

Mam mały problem... Dotyczy on nie do końca samego wyboru jezyka, ale w moim przypadku owszem.

Otóż mam wybór jezyka, a jego "formularz" (skrypt zmiany zmiennej odpowiadającej za język) jest umieszczony w "szablon.php", który dodawany jest zawsze na końcu strony. Na innych stronach jest inkludowany plik zależnie od owej zmiennej. Problem polega na tym, że gdy zmienię język, prawidłowo zmienia się on od razu, ale tylko w treści "szablon.php", zaś na wszystkich innych trzeba drugi raz kliknąć na jakiś odnośnik na stronie, albo ogólnie ją odświeżyć, aby język został zmieniony. Przykład tego jest tutaj (tylko tutaj, gdyż na innych podstronach nie ma jeszcze innego języka) - przełączać tylko między polskim a angielskim (brak innych języków).

Ma ktoś jakiś pomysł, jak "podwójnie" odświerzyć strone po wyborze języka?
Go to the top of the page
+Quote Post
ZeTu
post
Post #6





Grupa: Zarejestrowani
Postów: 217
Pomógł: 8
Dołączył: 8.12.2010

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


Może po prostu na początku strony dodaj
  1. if($_SESSION['jezyk'] == 'pl') {
  2. $jezyk = 'pl';
  3. } elseif($SESSION['jezyk'] == 'en') {
  4. $jezyk = 'en';
  5. } else {
  6. $jezyk = 'pl';
  7. }
  8. include('jezyki/'.$jezyk.'.php);
  9.  
  10. <a href="link"><? echo $tytul; ?></a> //pobiera tytul z includowanego pliku np. $tytul = 'Home';

Ja osobiście bym tak zrobił, ale to już tylko moja propozycja.
Bo to bez sensu odświeżać stronę dwa razy :/

A jeśli chodzi o kod do wyboru języka to zrobiłbym to tak:
  1. <form method="POST" action="" enctype="multipart/form-data">
  2. <input type="submit" id="jezyk" value="pl" name="jezyk" >
  3. <input type="submit" id="jezyk2" value="en" name="jezyk" >
  4. <input type="submit" id="jezyk3" value="de" name="jezyk" >
  5. <input type="submit" id="jezyk4" value="ru" name="jezyk" >
  6. </form>
Gdzie id to styl buttona z .css

Ten post edytował ZeTu 17.01.2013, 19:53:51
Go to the top of the page
+Quote Post
Mephis
post
Post #7





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


No mam podobnie...

W "szablon.php" mam coś takiego:
- sprawdzanie czy zmienna "jezyk" jest pusta - jesli jest, domyslnie zmienia jej wartość na "pl";
- jeżeli tak nie jest to: jeżeli z formularza została wysłana wartość "jezyk" - to zmien wartość zmiennej na tą przesłaną z formularza;
- inkluduj plik zależnie od zmiennej "jezyk";

Na innych stronach, np. właśnie "logowanie.php" jest tylko ten ostani punkt, czyli: "inkluduj plik zależnie od zmiennej "jezyk" "

Na samym końcu "logowanie.php" jest dodawany "szablon.php".
Go to the top of the page
+Quote Post
ZeTu
post
Post #8





Grupa: Zarejestrowani
Postów: 217
Pomógł: 8
Dołączył: 8.12.2010

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


Musisz treść szablon.php umiescic na samym poczatku w logowanie.php, bo przez to, że masz na dole szablon.php, to musisz odświeżyć stronę żeby był efekt, a jak dasz na początku zawartość includowaną z szablon.php, to zadziała.

Ten post edytował ZeTu 17.01.2013, 14:05:04
Go to the top of the page
+Quote Post
Mephis
post
Post #9





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


No pewnie by zadziałało, ale jak dam "szablon.php" na początku, to nie wyświetli mi się nic w "logowanie.php".
W "logowanie.php" mam zmienne (napisy, formularze, ogólna treś podstrony) które następnie są umieszczane w "szablon.php".

Jakiś inny pomysł? Może jest taka możliwość, aby po kliknięciu na język nastąpiły 2 przeładowania strony?
Go to the top of the page
+Quote Post
ZeTu
post
Post #10





Grupa: Zarejestrowani
Postów: 217
Pomógł: 8
Dołączył: 8.12.2010

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


Może po prostu podaj kod całej strony i będzie łatwiej coś doradzić, niż "na ślepo".
A jeśli nie chcesz podać kodu, to wyśli mi go na email, a ja sprawdzę.
Go to the top of the page
+Quote Post
Mephis
post
Post #11





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Obetne kod tylko do istotnch fragmentów. No to tak...

Wpierw "szablon.php";
  1. <?php
  2. // Inkludowanie języka
  3. if (empty($_SESSION['jezyk'])) $_SESSION['jezyk'] = 'jezyki/polski.php';
  4. elseif (isset($_POST['jezyk'])) $_SESSION['jezyk'] = $_POST['jezyk'];
  5. include($_SESSION['jezyk']);
  6.  
  7. // Przyciski "flagi" języków
  8. $szablon = "
  9. <form style='margin: 0' action='".$PHP_SELF."' method='POST'>
  10. <input size='30' type='hidden' value='jezyki/polski.php' name='jezyk'>
  11. <input type='submit' value='' class='jezyk_polski'>
  12. </form>
  13.  
  14. <form style='margin: 0' action='".$PHP_SELF."' method='POST'>
  15. <input size='30' type='hidden' value='jezyki/angielski.php' name='jezyk'>
  16. <input type='submit' value='' class='jezyk_angielski'>
  17. </form>
  18.  
  19. <form style='margin: 0' action='".$PHP_SELF."' method='POST'>
  20. <input size='30' type='hidden' value='jezyki/niemiecki.php' name='jezyk'>
  21. <input type='submit' value='' class='jezyk_niemiecki'>
  22. </form>
  23.  
  24. <form style='margin: 0' action='".$PHP_SELF."' method='POST'>
  25. <input size='30' type='hidden' value='jezyki/francuski.php' name='jezyk'>
  26. <input type='submit' value='' class='jezyk_francuski'>
  27. </form>
  28.  
  29. ".$tytul."
  30.  
  31. ";
  32.  
  33. echo $szablon;
  34.  
  35. ?>


No i "logowanie.php":
  1. <?php
  2. // Inkludowanie języka
  3. include($_SESSION['jezyk']);
  4.  
  5. $tytul = $jezyk_tytul_logowanie;
  6.  
  7. require_once('inc/szablon.php');
  8. ?>


No i przykładowo "polski.php":
  1. <?php
  2. $jezyk_tytul_logowanie = "Logowanie";
  3. ?>

Go to the top of the page
+Quote Post
ZeTu
post
Post #12





Grupa: Zarejestrowani
Postów: 217
Pomógł: 8
Dołączył: 8.12.2010

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


Zobacz zrobiłem takie coś http://takie-sobie.zoba.eu/demo/2/ i w poprzednim kodzie co napisałem zrobiłem kilka błędów, bo pomyliłem się trochę, a tutaj kod:
  1. <?php
  2. if($_POST['pl']!="") {
  3. $jezyk = 'Polski';
  4. } elseif($_POST['en']!="") {
  5. $jezyk = 'Angielski';
  6. } elseif($_POST['de']!="") {
  7. $jezyk = 'Niemiecki';
  8. } elseif($_POST['ru']!="") {
  9. $jezyk = 'Ruski';
  10. } else {
  11. $jezyk = 'Polski';
  12. }
  13. echo 'Wybrałeś język '.$jezyk.'<br><br>';
  14. ?>
  15. <form method="POST" action="" enctype="multipart/form-data">
  16. <input type="submit" id="jezyk" value="pl" name="pl" >
  17. <input type="submit" id="jezyk" value="en" name="en" >
  18. <input type="submit" id="jezyk" value="de" name="de" >
  19. <input type="submit" id="jezyk" value="ru" name="ru" >
  20. </form>
  21. <?php echo 'Wybrałeś język '.$jezyk; ?>
I teraz zamiast echo '...'; dajesz include();
np. if(); to pozostawiasz a zamiast echo ''; dajesz:
  1. include("jezyki/".$jezyk.".php");

Możesz dodać do tego cookies, żeby osoba wchodząca drugi raz miała stronę w wybranym wcześniej języku

Ten post edytował ZeTu 17.01.2013, 20:01:06
Go to the top of the page
+Quote Post
Mephis
post
Post #13





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Patrząc na kod, wydaje mi się że i tak jest to to samo, co napisałem ja.
Zmieniając język, w szablonie strony "szablon.php", język zmienia się tak jak powienien (tak jak Tobie) - po jednym kliknięciu.
Ale co jeśli Twój kod będzie inkludowany na dole podstrony? No właśnie.. to samo.

Cóż.. Trochę głupio, bo rozwiązanie było banalne.
Tylko na "szablon.php" jest postawiony warunek, że gdy jest wysłana nowa wartość "jezyk" to zmienia się inkludowany plik, a na reszcie było tylko inkludowanie.
Cóż, należało zrobić to analogicznie jak w "szablon.php". Czyli po prostu skopiować te 3 linikji (IMG:style_emoticons/default/biggrin.gif) Wszystko działa...

No a jak w takim razie zrobić zapamiętywanie do ciasteczek?

Ten post edytował Mephis 17.01.2013, 21:00:40
Go to the top of the page
+Quote Post
ZeTu
post
Post #14





Grupa: Zarejestrowani
Postów: 217
Pomógł: 8
Dołączył: 8.12.2010

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


http://php.net/manual/en/function.setcookie.php
Po kliknięciu na dany button wywołujesz funkcję która dodaje cookes do przeglądarki, po ponownym wejściu na stronę sprawdza, czy masz w przeglądarce cookies z tej strony, jeśli tak pobiera je i wyświetla odpowiedni plik języka, jeśli nie masz zapisanego cookes, daje język domyślny.

Cytat(Mephis @ 17.01.2013, 20:58:56 ) *
Patrząc na kod, wydaje mi się że i tak jest to to samo, co napisałem ja.
No właśnie nie skoro ty potrzebujesz odświeżyć stronę by było widać efekt.

Ten post edytował ZeTu 17.01.2013, 21:28:44
Go to the top of the page
+Quote Post

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: 17.09.2025 - 12:26