Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wybór języka
Forum PHP.pl > Forum > PHP
Mephis
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? tongue.gif
sazian
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
Mephis
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>
Szymciosek
O ile dobrze patrzę, to masz literówkę. W if zgubiłeś "a" czyli nie "jezyk/polski.php" a "jezyki/polski.php"
Mephis
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?
ZeTu
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
Mephis
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".
ZeTu
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.
Mephis
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?
ZeTu
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ę.
Mephis
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. ?>

ZeTu
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
Mephis
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 biggrin.gif Wszystko działa...

No a jak w takim razie zrobić zapamiętywanie do ciasteczek?
ZeTu
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.
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.